game_contracts.go
Обзор
Файл game_contracts.go предназначен для управления и агрегирования экземпляров смарт-контрактов, связанных с игровой логикой в блокчейн-приложении. Он предоставляет структуру GameContracts, которая содержит обёртки над тремя основными контрактами: GameManager, ManaToken и ManaSettlement. Это упрощает взаимодействие с контрактами, объединяя их в единую точку доступа. Кроме того, в файле определены константы, соответствующие перечислениям (enum) из Solidity — для типов действий и их статусов, что облегчает работу с ними на стороне Go.
Файл играет роль "адаптера" и централизованного менеджера контрактов, который инициализирует их по адресам и обеспечивает удобный интерфейс для их использования в игровой логике приложения.
Подробное описание
Структура GameContracts
type GameContracts struct {
GameManager *GameManager
ManaToken *ManaToken
ManaSettlement *ManaSettlement
}
Назначение:
GameContracts агрегирует три ключевых смарт-контракта:
GameManager— вероятно, основной контракт управления игровой логикой.ManaToken— контракт управления внутриигровой валютой (маной).ManaSettlement— контракт, связанный с урегулированием/расчётами, возможно, связанных с маной.
Поля:
GameManager- указатель на экземплярGameManager.ManaToken- указатель на экземплярManaToken.ManaSettlement- указатель на экземплярManaSettlement.
Использование структуры позволяет централизованно управлять этими контрактами, передавая их как единое целое.
Функция NewGameContracts
func NewGameContracts(
gameManagerAddr common.Address,
manaTokenAddr common.Address,
manaSettlementAddr common.Address,
backend bind.ContractBackend,
) (*GameContracts, error)
Назначение:
Конструктор для создания и инициализации объекта GameContracts. Производит связывание (binding) контрактов с их адресами в блокчейне через переданный backend.
Параметры:
gameManagerAddr— адрес контрактаGameManager.manaTokenAddr— адрес контрактаManaToken.manaSettlementAddr— адрес контрактаManaSettlement.backend— интерфейсbind.ContractBackend, который обеспечивает взаимодействие с Ethereum нодой (например, клиент Geth, Infura).
Возвращаемые значения:
*GameContracts— указатель на новый экземплярGameContractsс инициализированными контрактами.error— ошибка при инициализации любого из контрактов.
Пример использования:
gameContracts, err := NewGameContracts(
common.HexToAddress("0xGameManagerAddress"),
common.HexToAddress("0xManaTokenAddress"),
common.HexToAddress("0xManaSettlementAddress"),
ethBackend,
)
if err != nil {
log.Fatalf("Failed to initialize game contracts: %v", err)
}
Константы ActionType
const (
ActionTypeSpendMana = 0
ActionTypeEarnMana = 1
ActionTypeLevelUp = 2
ActionTypeCraftItem = 3
ActionTypePvPBattle = 4
ActionTypeMarketplaceTrade = 5
)
Назначение:
Константы, соответствующие перечислению (enum) ActionType в смарт-контракте Solidity. Они описывают типы игровых действий, которые могут происходить в системе.
Описание значений:
ActionTypeSpendMana— Потратить ману.ActionTypeEarnMana— Заработать ману.ActionTypeLevelUp— Повышение уровня.ActionTypeCraftItem— Создание предмета.ActionTypePvPBattle— PvP-бой.ActionTypeMarketplaceTrade— Торговля на рынке.
Константы ActionStatus
const (
ActionStatusCreated = 0
ActionStatusProcessed = 1
ActionStatusExpired = 2
ActionStatusNotFound = 3
)
Назначение:
Константы, соответствующие перечислению (enum) ActionStatus в Solidity, отражающие состояние игровых действий.
Описание значений:
ActionStatusCreated— Создано.ActionStatusProcessed— Обработано.ActionStatusExpired— Просрочено.ActionStatusNotFound— Не найдено.
Важные детали реализации и алгоритмы
Используется пакет
github.com/ethereum/go-ethereum/accounts/abi/bindдля автоматического связывания контрактов с их ABI и адресами.bind.ContractBackend— интерфейс, который позволяет абстрагироваться от конкретного способа доступа к Ethereum (локальный клиент, удалённый провайдер).Ошибки инициализации контрактов обрабатываются сразу — если один из контрактов не может быть инициализирован, функция возвращает ошибку.
Константы
ActionTypeиActionStatusнапрямую сопоставлены с Solidity-энумами, что обеспечивает согласованность значений между блокчейном и приложением.
Взаимодействие с другими частями системы
Файл является частью модуля
contracts— он управляет контрактными обёртками.Вся игровая бизнес-логика, работающая с контрактами
GameManager,ManaToken,ManaSettlement, должна обращаться к этому агрегатору.Адреса контрактов передаются извне, скорее всего, они конфигурируются в настройках приложения или загружаются из сети.
Взаимодействует с Ethereum backend (нода) через
bind.ContractBackend.Используется в сервисах и бизнес-логике, где требуется чтение/запись данных в смарт-контракты.
Диаграмма структуры
classDiagram
class GameContracts {
+GameManager *GameManager
+ManaToken *ManaToken
+ManaSettlement *ManaSettlement
+NewGameContracts(gameManagerAddr common.Address, manaTokenAddr common.Address, manaSettlementAddr common.Address, backend bind.ContractBackend) *GameContracts, error
}
GameContracts --> GameManager
GameContracts --> ManaToken
GameContracts --> ManaSettlement
Резюме
Файл game_contracts.go — это удобный и централизованный менеджер для игровых смарт-контрактов, который инкапсулирует их инициализацию и предоставляет типизированный доступ к ним. Константы в файле обеспечивают синхронизацию состояний и типов действий между Go-приложением и Solidity-контрактами, снижая вероятность ошибок из-за несоответствий.
Такой подход упрощает разработку и поддержку кода, делая интеграцию с блокчейном более удобной и надёжной.