manaToken.go

Обзор

Файл manaToken.go представляет собой сгенерированную обвязку (binding) на языке Go для взаимодействия с Ethereum смарт-контрактом ManaToken. Он обеспечивает удобный API для вызова методов контракта, отправки транзакций и обработки событий, используя популярную библиотеку go-ethereum.

Основная задача файла — предоставить типобезопасный и удобный интерфейс для работы с контрактом ManaToken из Go-приложений без необходимости вручную формировать транзакции и парсить логи.


Основные компоненты

Типы данных и структуры


Конструкторы


Методы чтения (Call)

Каждая функция контракта, объявленная как view или pure в Solidity, имеет соответствующий метод в ManaTokenCaller и сессиях. Ниже перечислены основные:

Метод

Параметры

Возвращаемое значение

Описание

DEFAULTADMINROLE()

[32]byte

Возвращает идентификатор роли администратора

GAMEMANAGERROLE()

[32]byte

Идентификатор роли игрового менеджера

INITIALSUPPLY()

*big.Int

Начальное количество токенов

PAUSERROLE()

[32]byte

Идентификатор роли, которая может ставить паузу

STAKINGMANAGERROLE()

[32]byte

Идентификатор роли менеджера стейкинга

Allowance(owner, spender)

common.Address, common.Address

*big.Int

Количество токенов, разрешённых к трате

BalanceOf(account)

common.Address

*big.Int

Баланс токенов у аккаунта

Decimals()

uint8

Количество десятичных знаков токена

GetRoleAdmin(role)

[32]byte

[32]byte

Получить роль администратора для заданной роли

HasRole(role, account)

[32]byte, common.Address

bool

Проверка, есть ли у аккаунта указанная роль

Name()

string

Название токена

Paused()

bool

Проверка, находится ли контракт на паузе

SupportsInterface(interfaceId)

[4]byte

bool

Проверка поддержки интерфейса

Symbol()

string

Символ токена

TotalSupply()

*big.Int

Общее количество выпущенных токенов

Пример использования:

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.

Метод

Параметры

Возвращаемое значение

Описание

Approve(spender, value)

common.Address, *big.Int

*types.Transaction, error

Установить лимит расходования токенов

Burn(from, amount)

common.Address, *big.Int

*types.Transaction, error

Сжечь токены со счёта

BurnSelf(amount)

*big.Int

*types.Transaction, error

Сжечь токены со своего счёта

GrantRole(role, account)

[32]byte, common.Address

*types.Transaction, error

Выдать роль аккаунту

Mint(to, amount)

common.Address, *big.Int

*types.Transaction, error

Выпустить новые токены

Pause()

*types.Transaction, error

Поставить контракт на паузу

RenounceRole(role, callerConfirmation)

[32]byte, common.Address

*types.Transaction, error

Отказаться от роли с подтверждением

RevokeRole(role, account)

[32]byte, common.Address

*types.Transaction, error

Отозвать роль у аккаунта

Transfer(to, value)

common.Address, *big.Int

*types.Transaction, error

Перевести токены на другой адрес

TransferFrom(from, to, value)

common.Address, common.Address, *big.Int

*types.Transaction, error

Перевод токенов с разрешения

Unpause()

*types.Transaction, error

Снять паузу с контракта

Пример использования:

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.

События и их соответствующие структуры:

Каждое событие имеет функции для:

Пример подписки на событие 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())
    }
}()

Важные детали реализации


Взаимодействие с другими частями системы


Структурная диаграмма классов

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.


Если требуется помощь с примером использования или интеграцией — готов предоставить дополнительную документацию и советы.