GameManager.sol
Обзор
GameManager.sol — это основной контракт управления игровыми действиями и состояниями игроков в децентрализованной игровой экосистеме, использующей токен MANA и консенсус Symbiotic Relay. Контракт реализует адаптацию паттерна SumTask для управления экономикой игры, включая обработку игровых действий, управление состояниями игроков, проведение PvP-сражений, торговлю на маркетплейсе и крафтинг. Также контракт включает систему валидаторов с механизмом ставок, распределения вознаграждений и комиссий, а также поддержку кросс-чейн взаимодействия.
Основные особенности и функциональность
Прием и обработка игровых действий с проверкой баланса MANA и антивзломными проверками параметров.
Хранение и обновление состояний игроков, включая их характеристики, PvP статистику и экономические показатели.
Управление валидаторами с возможностью регистрации, снятия ставок, распределения вознаграждений и комиссий.
Поддержка кросс-чейн игровых действий, синхронизация состояний и проверка доказательств.
Реализация ролей и прав доступа для управления паузой, экстренными операциями и экономическими параметрами.
Валидация параметров игровых действий, направленная на предотвращение мошенничества (античит).
Расчет стоимости игровых операций с учетом уровня игрока и типа действия.
Структуры данных
Перечисления
ActionType— типы игровых действий:SPEND_MANA— потратить MANA.EARN_MANA— заработать MANA.LEVEL_UP— повышение уровня.CRAFT_ITEM— крафт предметов.PVP_BATTLE— участие в PvP-сражении.MARKETPLACE_TRADE— торговля на маркетплейсе.
ActionStatus— статус действия:CREATED,PROCESSED,EXPIRED,NOT_FOUND.
Структуры
GameAction— описание игрового действия:player: адрес игрока.actionType: тип действия.actionParams: параметры действия в байтах.manaAmount: количество MANA.nonce: уникальный счетчик.createdAt: время создания (timestamp).
BatchResult— результат обработки пакета действий:batchId: идентификатор пакета.newStates: массив обновленных состояний игроков.processedAt: время обработки.
PlayerState— состояние игрока:Основные показатели:
manaBalance,level,experience,lastActionTimestamp.PvP-статистика:
wins,losses,rating.Экономика:
totalManaEarned,totalManaSpent,itemsCrafted.
EconomicConfig— параметры экономики:Комиссии валидаторов, бонусы, ставки, длительность эпох, лимиты по вознаграждениям и т.д.
ValidatorInfo— информация о валидаторе:Адрес, размер ставки, общие полученные вознаграждения, активность и статистика участия.
Ключевые методы
Управление игровыми действиями
submitGameAction(ActionType actionType, bytes actionParams, uint256 manaAmount) returns (bytes32 actionId)Позволяет игроку отправить игровое действие. Проверяются тип и параметры действия, а также баланс MANA, если действие требует траты токенов.
Параметры:
actionType— тип действия.actionParams— закодированные параметры.manaAmount— количество MANA, связанное с действием.
Возвращает: уникальный
actionId.Пример использования:
bytes memory params = abi.encode(recipeId, quantity); bytes32 actionId = gameManager.submitGameAction(ActionType.CRAFT_ITEM, params, manaCost);processBatch(bytes32 batchId, BatchResult calldata result, uint48 epoch, bytes calldata proof)Обработка пакета игровых действий после валидации подписи кворума Symbiotic Relay. Обновляет состояния игроков и распределяет вознаграждения валидаторам.
Параметры:
batchId— уникальный ID пакета.result— результат обработки с новыми состояниями.epoch— эпоха для проверки подписи.proof— подпись кворума.
getActionStatus(bytes32 actionId) returns (ActionStatus)Возвращает текущий статус игрового действия.
getPlayerState(address player) returns (PlayerState)Получение текущего состояния игрока.
Управление валидаторами
registerValidator(address validator, uint256 stakeAmount)Регистрация валидатора с внесением ставки MANA.
deregisterValidator(address validator)Отмена регистрации валидатора и возврат ставки.
distributeEpochRewards()Распределение периодических наград валидаторам на основе их активности.
getValidatorInfo(address validator) returns (ValidatorInfo)Получение информации о валидаторе.
Валидация и расчеты игровых операций
validateCraftingParams(bytes calldata actionParams, address player) returns (bool)Проверка параметров крафта на корректность.
calculateCraftingCost(uint256 recipeId, uint256 quantity, uint256 playerLevel) returns (uint256)Расчет стоимости крафта с учетом уровня игрока и рецепта.
validatePvPBattleParams(bytes calldata actionParams, address player) returns (bool)Проверка параметров PvP-сражения.
calculatePvPCost(uint8 battleType) returns (uint256)Расчет стоимости участия в PvP-битве.
validateMarketplaceTradeParams(bytes calldata actionParams, address player) returns (bool)Проверка параметров торговой операции.
calculateMarketplaceCost(uint256 tradeAmount, uint8 tradeType, uint256 playerLevel) returns (uint256)Расчет стоимости сделки с учетом уровня игрока и типа операции.
validateLevelUpParams(bytes calldata actionParams, address player) returns (bool)Проверка параметров повышения уровня.
Кросс-чейн взаимодействия
submitCrossChainGameAction(ActionType actionType, bytes calldata actionParams, uint256 manaAmount, uint64 targetChain) returns (bytes32)Отправка игрового действия на другой блокчейн.
processCrossChainBatch(bytes32 batchId, BatchResult calldata result, uint64 sourceChain, uint48 epoch, bytes calldata proof)Обработка пакета кросс-чейн действий.
synchronizePlayerState(address player, PlayerState calldata newState, uint64 sourceChain, bytes calldata proof)Синхронизация состояния игрока с другого блокчейна.
getCrossChainManaBalance(address player, uint64 targetChain) returns (uint256)Получение баланса MANA игрока на другой цепочке (пока возвращает локальный баланс).
validateCrossChainAction(ActionType actionType, bytes calldata actionParams, uint64 targetChain, address player) returns (bool)Валидация параметров кросс-чейн действий.
Важные детали реализации
Контракт использует OpenZeppelin
ReentrancyGuard,AccessControlиPausableдля безопасности и управления доступом.Роли
PAUSER_ROLE,EMERGENCY_ROLEиECONOMICS_ROLEразграничивают полномочия по управлению контрактом и экономикой.Экономические параметры хранятся в структуре
EconomicConfigс возможностью обновления через функцию с проверкой валидности.Используется паттерн nonce и хэширование для уникальной идентификации действий.
Обработка пакетов действий требует подписи кворума Symbiotic Relay для обеспечения консенсуса.
Валидация параметров действий реализована низкоуровневыми
assemblyинструкциями для экономии газа и предотвращения читерства.Система валидаторов обеспечивает децентрализацию обработки действий и поддерживает экономические стимулы.
Поддерживается возможность паузы и экстренного обновления состояния игроков.
Взаимодействие с другими частями системы
Взаимодействие с контрактом токена
ManaTokenдля проверки балансов, сжигания и чеканки токенов.Использование интерфейса
ISettlementSymbiotic Relay для проверки подписей и получения информации о эпохах.Взаимодействие с внешними кросс-чейн менеджерами (в перспективе) для синхронизации состояний и балансов.
Ивенты для аудитинга и мониторинга игровых действий, состояний игроков и активности валидаторов.
Пример использования
// Игрок отправляет действие крафта предмета
bytes memory craftParams = abi.encode(recipeId, quantity);
uint256 manaCost = gameManager.calculateCraftingCost(recipeId, quantity, playerLevel);
// Проверяем баланс и отправляем действие
require(gameManager.getPlayerManaBalance(player) >= manaCost, "Недостаточно MANA");
bytes32 actionId = gameManager.submitGameAction(ActionType.CRAFT_ITEM, craftParams, manaCost);
// Позже валидаторы обрабатывают пакет действий и обновляют состояния игроков
Диаграмма структуры контракта
classDiagram
class GameManager {
<<contract>>
+bytes32 PAUSER_ROLE
+bytes32 EMERGENCY_ROLE
+bytes32 ECONOMICS_ROLE
+uint32 ACTION_EXPIRY
+uint256 nonce
+ISettlement settlement
+ManaToken manaToken
+EconomicConfig economicConfig
+uint48 currentEpoch
+uint256 lastRewardDistribution
+uint256 validatorRewardPool
+mapping(bytes32 => GameAction) gameActions
+mapping(bytes32 => BatchResult) batchResults
+mapping(address => PlayerState) playerStates
+mapping(bytes32 => bool) processedActions
+mapping(address => ValidatorInfo) validators
+address[] activeValidators
+mapping(address => uint256) validatorIndex
+submitGameAction(ActionType, bytes, uint256) returns (bytes32)
+processBatch(bytes32, BatchResult, uint48, bytes)
+getActionStatus(bytes32) returns (ActionStatus)
+getPlayerState(address) returns (PlayerState)
+registerValidator(address, uint256)
+deregisterValidator(address)
+distributeEpochRewards()
+validateCraftingParams(bytes, address) returns (bool)
+validatePvPBattleParams(bytes, address) returns (bool)
+validateMarketplaceTradeParams(bytes, address) returns (bool)
+submitCrossChainGameAction(ActionType, bytes, uint256, uint64) returns (bytes32)
+processCrossChainBatch(bytes32, BatchResult, uint64, uint48, bytes)
+synchronizePlayerState(address, PlayerState, uint64, bytes)
}
class GameAction {
+address player
+ActionType actionType
+bytes actionParams
+uint256 manaAmount
+uint256 nonce
+uint48 createdAt
}
class PlayerState {
+address player
+uint256 manaBalance
+uint256 level
+uint256 experience
+uint256 lastActionTimestamp
+uint256 wins
+uint256 losses
+uint256 rating
+uint256 totalManaEarned
+uint256 totalManaSpent
+uint256 itemsCrafted
}
class BatchResult {
+bytes32 batchId
+PlayerState[] newStates
+uint48 processedAt
}
class ValidatorInfo {
+address validator
+uint256 stakedAmount
+uint256 totalRewardsEarned
+uint256 lastRewardEpoch
+uint256 participationCount
+bool isActive
}
class EconomicConfig {
+uint256 validatorCommissionBps
+uint256 baseValidatorReward
+uint256 quorumBonusBps
+uint256 burnRateBps
+uint256 minValidatorStake
+uint256 maxValidatorReward
+uint256 epochDuration
+uint256 rewardPoolCap
}
GameManager "1" *-- "many" GameAction : manages
GameManager "1" *-- "many" PlayerState : manages
GameManager "1" *-- "many" BatchResult : manages
GameManager "1" *-- "many" ValidatorInfo : manages
GameManager "1" *-- EconomicConfig : holds
Заключение
GameManager.sol является комплексным решением для управления игровыми процессами, экономикой, валидаторами и кросс-чейн взаимодействием в блокчейн-игре с токеном MANA. Он обеспечивает прозрачность, безопасность и расширяемость игрового процесса, а также экономическую устойчивость через систему ставок и вознаграждений валидаторов. Контракт построен с учетом современных практик безопасности и оптимизации газа, а также включает множество механизмов античита для поддержания честной игры.