GameManager.sol

Обзор

GameManager.sol — это основной контракт управления игровыми действиями и состояниями игроков в децентрализованной игровой экосистеме, использующей токен MANA и консенсус Symbiotic Relay. Контракт реализует адаптацию паттерна SumTask для управления экономикой игры, включая обработку игровых действий, управление состояниями игроков, проведение PvP-сражений, торговлю на маркетплейсе и крафтинг. Также контракт включает систему валидаторов с механизмом ставок, распределения вознаграждений и комиссий, а также поддержку кросс-чейн взаимодействия.


Основные особенности и функциональность


Структуры данных

Перечисления

Структуры


Ключевые методы

Управление игровыми действиями


Управление валидаторами


Валидация и расчеты игровых операций


Кросс-чейн взаимодействия


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


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


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

// Игрок отправляет действие крафта предмета
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. Он обеспечивает прозрачность, безопасность и расширяемость игрового процесса, а также экономическую устойчивость через систему ставок и вознаграждений валидаторов. Контракт построен с учетом современных практик безопасности и оптимизации газа, а также включает множество механизмов античита для поддержания честной игры.