manaToken.go
Обзор
Файл manaToken.go представляет собой сгенерированную обвязку (binding) на языке Go для взаимодействия с Ethereum смарт-контрактом ManaToken. Он обеспечивает удобный API для вызова методов контракта, отправки транзакций и обработки событий, используя популярную библиотеку go-ethereum.
Основная задача файла — предоставить типобезопасный и удобный интерфейс для работы с контрактом ManaToken из Go-приложений без необходимости вручную формировать транзакции и парсить логи.
Основные компоненты
Типы данных и структуры
ManaToken
Главная структура, объединяющая три ключевых интерфейса для контракта:ManaTokenCaller— для чтения данных (view calls)ManaTokenTransactor— для записи (транзакции)ManaTokenFilterer— для фильтрации и подписки на события контракта
ManaTokenCaller
Обеспечивает только чтение данных из контракта (например, вызовы view-функций).ManaTokenTransactor
Предоставляет методы для отправки транзакций, изменяющих состояние контракта.ManaTokenFilterer
Позволяет подписываться на события контракта и фильтровать их.ManaTokenSession, ManaTokenCallerSession, ManaTokenTransactorSession
Объединённые структуры с предварительно установленными опциями вызова и транзакции (например, с конкретным аккаунтом и параметрами).ManaTokenRaw, ManaTokenCallerRaw, ManaTokenTransactorRaw
Низкоуровневые структуры, предоставляющие доступ к необработанным методам вызова и транзакции.
Конструкторы
NewManaToken(address common.Address, backend bind.ContractBackend) (*ManaToken, error)
Создаёт новый объектManaToken, связанный с контрактом по указанному адресу и бэкенду (например, клиенту Ethereum).Аналогично:
NewManaTokenCaller — для только чтения
NewManaTokenTransactor — для записи
NewManaTokenFilterer — для работы с событиями
Методы чтения (Call)
Каждая функция контракта, объявленная как view или pure в Solidity, имеет соответствующий метод в ManaTokenCaller и сессиях. Ниже перечислены основные:
Метод | Параметры | Возвращаемое значение | Описание |
|---|---|---|---|
| Возвращает идентификатор роли администратора | ||
| Идентификатор роли игрового менеджера | ||
|
| Начальное количество токенов | |
| Идентификатор роли, которая может ставить паузу | ||
|
| Идентификатор роли менеджера стейкинга | |
|
|
| Количество токенов, разрешённых к трате |
|
|
| Баланс токенов у аккаунта |
|
| Количество десятичных знаков токена | |
|
| Получить роль администратора для заданной роли | |
|
| Проверка, есть ли у аккаунта указанная роль | |
|
| Название токена | |
| Проверка, находится ли контракт на паузе | ||
|
| Проверка поддержки интерфейса | |
|
| Символ токена | |
|
| Общее количество выпущенных токенов |
Пример использования:
mana, err := contracts.NewManaToken(contractAddress, client)
if err != nil {
log.Fatal(err)
}
balance, err := mana.BalanceOf(&bind.CallOpts{}, userAddress)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Баланс пользователя: %s\n", balance.String())
Методы записи (Transact)
Методы, изменяющие состояние контракта, доступны через ManaTokenTransactor и сессии. Они возвращают транзакцию Ethereum.
Метод | Параметры | Возвращаемое значение | Описание |
|---|---|---|---|
|
|
| Установить лимит расходования токенов |
|
|
| Сжечь токены со счёта |
|
|
| Сжечь токены со своего счёта |
|
|
| Выдать роль аккаунту |
|
|
| Выпустить новые токены |
|
| Поставить контракт на паузу | |
|
|
| Отказаться от роли с подтверждением |
|
|
| Отозвать роль у аккаунта |
|
|
| Перевести токены на другой адрес |
|
|
| Перевод токенов с разрешения |
|
| Снять паузу с контракта |
Пример использования:
tx, err := mana.Transfer(&bind.TransactOpts{From: auth.From, Signer: auth.Signer}, recipientAddress, big.NewInt(100))
if err != nil {
log.Fatal(err)
}
fmt.Printf("Транзакция отправлена: %s\n", tx.Hash().Hex())
Работа с событиями (Events)
Для каждого события контракта определены структуры итераторов и событий, позволяющие фильтровать и подписываться на события Ethereum.
События и их соответствующие структуры:
Approval— ManaTokenApproval, ManaTokenApprovalIteratorPaused— ManaTokenPaused, ManaTokenPausedIteratorRoleAdminChanged— ManaTokenRoleAdminChanged, ManaTokenRoleAdminChangedIteratorRoleGranted— ManaTokenRoleGranted, ManaTokenRoleGrantedIteratorRoleRevoked— ManaTokenRoleRevoked, ManaTokenRoleRevokedIteratorTokensBurned— ManaTokenTokensBurned, ManaTokenTokensBurnedIteratorTokensMinted— ManaTokenTokensMinted, ManaTokenTokensMintedIteratorTransfer— ManaTokenTransfer, ManaTokenTransferIteratorUnpaused— ManaTokenUnpaused, ManaTokenUnpausedIterator
Каждое событие имеет функции для:
Фильтрации по параметрам (FilterXYZ)
Подписки на новые события (WatchXYZ)
Парсинга логов (ParseXYZ)
Пример подписки на событие Transfer:
transferEvents := make(chan *contracts.ManaTokenTransfer)
sub, err := mana.Filterer.WatchTransfer(&bind.WatchOpts{}, transferEvents, nil, nil)
if err != nil {
log.Fatal(err)
}
go func() {
for event := range transferEvents {
fmt.Printf("Transfer: from %s to %s amount %s\n", event.From.Hex(), event.To.Hex(), event.Value.String())
}
}()
Важные детали реализации
Все структуры и методы сгенерированы автоматически с помощью
abigenиз ABI контракта.Вызовы
Callвыполняются без создания транзакций, только чтение состояния.Методы
Transactсоздают транзакции с подписанными данными для изменения состояния.Для каждого события реализованы итераторы с каналами логов и подписками для удобного асинхронного получения данных.
Ошибки при работе с контрактом тщательно обрабатываются и возвращаются вызывающему коду.
Поддерживается работа с ролями (RBAC) через методы
GrantRole,HasRole,RevokeRoleи события ролей.
Взаимодействие с другими частями системы
Этот файл служит мостом между Go-приложением и контрактом ManaToken в Ethereum-сети.
Использует стандартные пакеты
go-ethereumдля ABI, транзакций, подписей и событий.Требует наличия Ethereum клиента (например, geth, infura) для выполнения вызовов и отправки транзакций.
Может использоваться в системах управления токенами, игровых платформах и любых приложениях, где необходима работа с ERC20-подобным контрактом с расширенными правами доступа и событиями.
Структурная диаграмма классов
classDiagram
class ManaToken {
+ManaTokenCaller Caller
+ManaTokenTransactor Transactor
+ManaTokenFilterer Filterer
}
class ManaTokenCaller {
-contract *bind.BoundContract
+DEFAULTADMINROLE(opts *bind.CallOpts) ([32]byte, error)
+Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error)
+BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error)
+Decimals(opts *bind.CallOpts) (uint8, error)
+GetRoleAdmin(opts *bind.CallOpts, role [32]byte) ([32]byte, error)
+HasRole(opts *bind.CallOpts, role [32]byte, account common.Address) (bool, error)
+Name(opts *bind.CallOpts) (string, error)
+Paused(opts *bind.CallOpts) (bool, error)
+SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
+Symbol(opts *bind.CallOpts) (string, error)
+TotalSupply(opts *bind.CallOpts) (*big.Int, error)
}
class ManaTokenTransactor {
-contract *bind.BoundContract
+Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error)
+Burn(opts *bind.TransactOpts, from common.Address, amount *big.Int) (*types.Transaction, error)
+BurnSelf(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
+GrantRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error)
+Mint(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error)
+Pause(opts *bind.TransactOpts) (*types.Transaction, error)
+RenounceRole(opts *bind.TransactOpts, role [32]byte, callerConfirmation common.Address) (*types.Transaction, error)
+RevokeRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error)
+Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error)
+TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error)
+Unpause(opts *bind.TransactOpts) (*types.Transaction, error)
}
class ManaTokenFilterer {
-contract *bind.BoundContract
+FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*ManaTokenApprovalIterator, error)
+WatchApproval(opts *bind.WatchOpts, sink chan<- *ManaTokenApproval, owner []common.Address, spender []common.Address) (event.Subscription, error)
+ParseApproval(log types.Log) (*ManaTokenApproval, error)
// Аналогично для остальных событий: Paused, RoleAdminChanged, RoleGranted, RoleRevoked, TokensBurned, TokensMinted, Transfer, Unpaused
}
Итог
Файл manaToken.go — это полный и удобный для использования Go binding для Ethereum контракта ManaToken. Он реализует все функции контракта, позволяет подписываться и фильтровать события, а также управлять транзакциями, предоставляя разработчикам простой и безопасный интерфейс для интеграции с блокчейном Ethereum.
Такой подход значительно упрощает разработку децентрализованных приложений (dApps) на Go, минимизируя ручную работу с ABI и особенностями Ethereum.
Если требуется помощь с примером использования или интеграцией — готов предоставить дополнительную документацию и советы.