manaSettlement.go
Обзор файла
Файл manaSettlement.go — это автоматически сгенерированная Go-библиотека, предоставляющая низкоуровневый интерфейс для взаимодействия с Ethereum смарт-контрактом ManaSettlement. Данный контракт управляет состоянием игроков в игровой экосистеме, включая их профили, балансы внутриигровой валюты "Mana", достижения, а также управление ролями и правами доступа.
Этот файл содержит типы данных, методы для вызова функций контракта (как для чтения, так и для записи), а также обработчики событий, возникающих в контракте. Он предназначен для использования в приложениях на Go, которые должны взаимодействовать с контрактом ManaSettlement через Ethereum.
Основные структуры и компоненты
Структуры данных
ManaSettlementPlayerProfile
Представляет профиль игрока с ключевыми характеристиками:
Поле | Тип | Описание |
|---|---|---|
Level | *big.Int | Уровень игрока |
Experience | *big.Int | Опыт |
TotalManaEarned | *big.Int | Общее количество заработанной маны |
TotalManaSpent | *big.Int | Общее количество потраченной маны |
LastActionTimestamp | *big.Int | Метка времени последнего действия |
Wins | *big.Int | Количество побед |
Losses | *big.Int | Количество поражений |
Rating | *big.Int | Рейтинг игрока |
ItemsCrafted | *big.Int | Количество созданных предметов |
Achievements | [][32]byte | Массив достижений в формате bytes32 |
ManaSettlementPlayerStateUpdate
Структура для обновления состояния игрока в партии:
Поле | Тип | Описание |
|---|---|---|
Player | common.Address | Ethereum адрес игрока |
NewManaBalance | *big.Int | Новый баланс маны |
NewProfile | ManaSettlementPlayerProfile | Новый профиль игрока |
Основной класс
ManaSettlement
Главный класс, инкапсулирующий взаимодействие с контрактом. Он включает три составных части:
ManaSettlementCaller — для вызова только чтения (view) функций контракта.
ManaSettlementTransactor — для вызова функций, изменяющих состояние (транзакции).
ManaSettlementFilterer — для обработки событий контракта.
Конструкторы
NewManaSettlement(address common.Address, backend bind.ContractBackend) (*ManaSettlement, error)
Создает новый экземпляр для взаимодействия с контрактом по указанному адресу.NewManaSettlementCaller(address common.Address, caller bind.ContractCaller) (*ManaSettlementCaller, error)
Создает read-only экземпляр.NewManaSettlementTransactor(address common.Address, transactor bind.ContractTransactor) (*ManaSettlementTransactor, error)
Создает write-only экземпляр.NewManaSettlementFilterer(address common.Address, filterer bind.ContractFilterer) (*ManaSettlementFilterer, error)
Создает фильтр для событий.
Важные методы и функции
Получение данных (view функции)
Каждый из методов имеет варианты для прямого вызова (ManaSettlementCaller), сессии (ManaSettlementSession) и сессии вызова (ManaSettlementCallerSession).
DEFAULTADMINROLE() ([32]byte, error) — Возвращает идентификатор роли администратора по умолчанию.
GAMEMANAGERROLE() ([32]byte, error) — Идентификатор роли менеджера игры.
PAUSERROLE() ([32]byte, error)— Идентификатор роли, которая может приостанавливать контракт.BatchCounter() (*big.Int, error)— Возвращает счетчик партий обновлений.GetMultiplePlayerStates(players []common.Address) ([]ManaSettlementPlayerStateUpdate, error) — Получает состояние нескольких игроков за один вызов.
GetPlayerAchievements(player common.Address) ([][32]byte, error) — Получает список достижений игрока.
GetPlayerManaBalances(player common.Address) (settlementBalance *big.Int, tokenBalance *big.Int, error) — Возвращает балансы игрока в системе и токенах.
GetPlayerProfile(player common.Address) (ManaSettlementPlayerProfile, error) — Получает профиль игрока.
GetPlayerState(player common.Address) (manaBalance *big.Int, profile ManaSettlementPlayerProfile, isRegistered bool, error) — Получает полное состояние игрока с информацией о регистрации.
HasRole(role [32]byte, account common.Address) (bool, error)— Проверяет наличие роли у аккаунта.IsPlayerRegistered(player common.Address) (bool, error) — Проверяет, зарегистрирован ли игрок.
ManaBalances(arg0 common.Address) (*big.Int, error)— Возвращает баланс маны игрока.ManaToken() (common.Address, error)— Возвращает адрес токена маны.Paused() (bool, error)— Проверяет, приостановлен ли контракт.PlayerProfiles(arg0 common.Address)— Получает профиль игрока по адресу.RegisteredPlayers(arg0 common.Address) (bool, error) — Проверяет регистрацию игрока.
SupportsInterface(interfaceId [4]byte) (bool, error)— Проверяет поддержку интерфейса.TotalPlayers() (*big.Int, error) — Общее количество зарегистрированных игроков.
GetTotalStats() (totalRegisteredPlayers *big.Int, totalBatches *big.Int, error) — Статистика по игрокам и партиям.
Изменение данных (транзакции)
AddPlayerAchievement(player common.Address, achievement [32]byte) (*types.Transaction, error) — Добавляет достижение игроку.
BatchUpdatePlayerStates(updates []ManaSettlementPlayerStateUpdate) (*types.Transaction, error) — Пакетное обновление состояний игроков.
GrantRole(role [32]byte, account common.Address) (*types.Transaction, error)— Выдача роли аккаунту.Initialize(defaultAdmin common.Address, gameManager common.Address) (*types.Transaction, error) — Инициализация контракта с начальными ролями.
Pause() (*types.Transaction, error)— Приостанавливает контракт.RegisterPlayer(player common.Address) (*types.Transaction, error) — Регистрирует нового игрока.
RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error)— Отказ от роли.RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error)— Отзыв роли у аккаунта.Unpause() (*types.Transaction, error)— Возобновляет работу контракта.UpdatePlayerManaBalance(player common.Address, newBalance *big.Int) (*types.Transaction, error) — Обновляет баланс маны игрока.
UpdatePlayerState(player common.Address, newManaBalance *big.Int, newProfile ManaSettlementPlayerProfile) (*types.Transaction, error) — Обновляет состояние игрока.
Обработка событий
Файл содержит итераторы и методы для подписки, фильтрации и парсинга следующих событий:
BatchPlayerStateUpdated— Обновление партии состояний игроков.ManaBalanceUpdated— Обновление баланса маны у игрока.PlayerProfileUpdated— Обновление профиля игрока.PlayerStateUpdated— Обновление состояния игрока.RoleAdminChanged— Изменение администратора роли.RoleGranted— Выдача роли аккаунту.RoleRevoked— Отзыв роли у аккаунта.
Каждое событие имеет соответствующий итератор для последовательного просмотра логов, функции фильтрации и подписки.
Важные детали реализации
Все структуры и методы сгенерированы автоматически на основе ABI контракта
ManaSettlementSolidity.Используется пакет
github.com/ethereum/go-ethereum/accounts/abi/bindдля привязки к смарт-контракту.Методы чтения и записи четко разделены, обеспечивая безопасность и удобство.
Возможности пакетного обновления состояний игроков позволяют оптимизировать массовые операции.
Система ролей и прав доступа реализована через стандартные методы
grantRole,revokeRole,hasRoleи события.Поддерживается пауза и возобновление работы контракта для обеспечения безопасности.
Структуры данных профиля и состояния игроков содержат подробную статистику, необходимую для игрового процесса.
Взаимодействие с другими частями системы
Контракт
ManaSettlementинтегрируется с токеном маны (manaToken), адрес которого можно получить через методManaToken().Состояния игроков и их профили используются в игровой логике для расчета рейтингов, достижений и баланса.
Роли контролируют доступ к административным функциям, таким как обновление состояний, приостановка контракта и управление игроками.
Подписка на события позволяет внешним сервисам и интерфейсам отслеживать изменения в реальном времени.
Пример использования
package main
import (
"fmt"
"log"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
"path/to/generated/contracts"
)
func main() {
client, err := ethclient.Dial("https://mainnet.infura.io/v3/YOUR-PROJECT-ID")
if err != nil {
log.Fatal(err)
}
contractAddress := common.HexToAddress("0xYourContractAddress")
manaSettlement, err := contracts.NewManaSettlement(contractAddress, client)
if err != nil {
log.Fatal(err)
}
player := common.HexToAddress("0xPlayerAddress")
// Получаем профиль игрока
profile, err := manaSettlement.GetPlayerProfile(nil, player)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Player Level: %s\n", profile.Level.String())
// Обновляем баланс маны игрока (требуется авторизация и транзакция)
auth := /* инициализация bind.TransactOpts с ключом и цепочкой */
newBalance := big.NewInt(1000)
tx, err := manaSettlement.UpdatePlayerManaBalance(auth, player, newBalance)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Transaction submitted: %s\n", tx.Hash().Hex())
}
Диаграмма структуры
classDiagram
class ManaSettlement {
+ManaSettlementCaller
+ManaSettlementTransactor
+ManaSettlementFilterer
}
class ManaSettlementCaller {
-contract *bind.BoundContract
+DEFAULTADMINROLE()
+GAMEMANAGERROLE()
+PAUSERROLE()
+BatchCounter()
+GetMultiplePlayerStates(players []common.Address)
+GetPlayerAchievements(player common.Address)
+GetPlayerManaBalances(player common.Address)
+GetPlayerProfile(player common.Address)
+GetPlayerState(player common.Address)
+HasRole(role [32]byte, account common.Address)
+IsPlayerRegistered(player common.Address)
+ManaBalances(arg0 common.Address)
+ManaToken()
+Paused()
+PlayerProfiles(arg0 common.Address)
+RegisteredPlayers(arg0 common.Address)
+SupportsInterface(interfaceId [4]byte)
+TotalPlayers()
+GetTotalStats()
}
class ManaSettlementTransactor {
-contract *bind.BoundContract
+AddPlayerAchievement(player common.Address, achievement [32]byte)
+BatchUpdatePlayerStates(updates []ManaSettlementPlayerStateUpdate)
+GrantRole(role [32]byte, account common.Address)
+Initialize(defaultAdmin common.Address, gameManager common.Address)
+Pause()
+RegisterPlayer(player common.Address)
+RenounceRole(role [32]byte, callerConfirmation common.Address)
+RevokeRole(role [32]byte, account common.Address)
+Unpause()
+UpdatePlayerManaBalance(player common.Address, newBalance *big.Int)
+UpdatePlayerState(player common.Address, newManaBalance *big.Int, newProfile ManaSettlementPlayerProfile)
}
class ManaSettlementFilterer {
-contract *bind.BoundContract
+FilterBatchPlayerStateUpdated()
+FilterManaBalanceUpdated()
+FilterPlayerProfileUpdated()
+FilterPlayerStateUpdated()
+FilterRoleAdminChanged()
+FilterRoleGranted()
+FilterRoleRevoked()
+WatchBatchPlayerStateUpdated()
+WatchManaBalanceUpdated()
+WatchPlayerProfileUpdated()
+WatchPlayerStateUpdated()
+WatchRoleAdminChanged()
+WatchRoleGranted()
+WatchRoleRevoked()
}
class ManaSettlementPlayerProfile {
+Level *big.Int
+Experience *big.Int
+TotalManaEarned *big.Int
+TotalManaSpent *big.Int
+LastActionTimestamp *big.Int
+Wins *big.Int
+Losses *big.Int
+Rating *big.Int
+ItemsCrafted *big.Int
+Achievements [][32]byte
}
class ManaSettlementPlayerStateUpdate {
+Player common.Address
+NewManaBalance *big.Int
+NewProfile ManaSettlementPlayerProfile
}
ManaSettlement "1" *-- "1" ManaSettlementCaller : includes
ManaSettlement "1" *-- "1" ManaSettlementTransactor : includes
ManaSettlement "1" *-- "1" ManaSettlementFilterer : includes
Заключение
Файл manaSettlement.go предоставляет полный Go-интерфейс для взаимодействия с Ethereum контрактом ManaSettlement, обеспечивая удобные методы для управления состояниями игроков, балансами и ролями, а также для получения статистики и подписки на события. Благодаря автоматической генерации на основе ABI, он гарантирует точность и актуальность API с контрактом, упрощая разработку игровых и административных приложений на Go.