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

Главный класс, инкапсулирующий взаимодействие с контрактом. Он включает три составных части:


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


Важные методы и функции

Получение данных (view функции)

Каждый из методов имеет варианты для прямого вызова (ManaSettlementCaller), сессии (ManaSettlementSession) и сессии вызова (ManaSettlementCallerSession).

Изменение данных (транзакции)


Обработка событий

Файл содержит итераторы и методы для подписки, фильтрации и парсинга следующих событий:

Каждое событие имеет соответствующий итератор для последовательного просмотра логов, функции фильтрации и подписки.


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


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


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

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.