CrossChainManaManager.sol
Обзор
Контракт CrossChainManaManager предназначен для управления межцепочечными (cross-chain) переводами токенов MANA с подтверждением валидаторов Symbiotic. Он поддерживает работу с двумя протоколами передачи сообщений между цепочками — LayerZero и Hyperlane. Основная задача контракта — обеспечивать безопасные, проверяемые и управляемые переводы и игровые действия с токенами MANA между различными блокчейнами, при этом используя механизмы консенсуса валидаторов для подтверждения операций.
Контракт реализует контроль доступа, защиту от повторных вызовов (reentrancy) и возможность приостановки (pausable) для экстренного управления. В нем предусмотрены роли валидаторов, паузера и администратора для различных операций.
Классы, структуры и основные элементы
Роли доступа
VALIDATOR_ROLE— роль валидатора, который подтверждает переводы.PAUSER_ROLE— роль, позволяющая приостанавливать и возобновлять работу контракта.EMERGENCY_ROLE— роль для экстренных операций (например, форсированного завершения перевода).
Константы
TRANSFER_TIMEOUT— таймаут перевода, равный 24 часам (86400 секунд).MIN_TRANSFER_AMOUNT— минимальное количество MANA для перевода (1 MANA).MAX_TRANSFER_AMOUNT— максимальное количество MANA для перевода (1 000 000 MANA).
Перечисления (enum)
TransferStatus— статусы межцепочечного перевода:INITIATED— перевод инициализирован.VALIDATED— подтвержден валидаторами.COMPLETED— перевод завершён.EXPIRED— перевод истёк.CANCELLED— отменён.
CrossChainActionStatus— статусы межцепочечного игрового действия (аналогично TransferStatus).
Структуры данных
CrossChainTransfer — структура, описывающая межцепочечный перевод:
transferId— уникальный ID перевода.from— адрес отправителя.to— адрес получателя.amount— сумма MANA.sourceChain— ID исходной цепочки.targetChain— ID целевой цепочки.timestamp— время инициализации.status— текущий статус перевода.validatorCount— количество валидаторов, подтвердивших перевод.messageHash— хэш сообщения для подписи и проверки.
ValidatorSignature — подпись валидатора:
validator— адрес валидатора.signature— подпись.timestamp— время подписи.
CrossChainMessage — структура сообщения для завершения перевода:
Аналогична CrossChainTransfer, включает nonce.
CrossChainGameAction — структура межцепочечного игрового действия:
actionId— уникальный ID действия.player— адрес игрока.actionType— тип действия (числовой код).actionParams— закодированные параметры действия.manaAmount— сумма MANA, вовлечённая в действие.sourceChain— исходная цепочка.targetChain— целевая цепочка.timestamp— время инициализации.status— статус действия.validatorCount— количество валидаторов, подтвердивших действие.
Переменные состояния
manaToken— адрес контракта токена MANA.currentChainId— текущий ID цепочки (chainid).verificationManager— контракт проверки межцепочечных сообщений.transferNonce— счётчик nonce для переводов.quorumThreshold— порог кворума в базисных пунктах (по умолчанию 67%).totalValidators— общее число активных валидаторов.transfers— отображение transferId → CrossChainTransfer.transferValidations— отображение transferId → (валидатор → ValidatorSignature).supportedChains— отображение chainId → поддерживается ли.activeValidators— отображение валидатор → активен ли.processedMessages— отображение messageHash → обработано ли (для защиты от повторов).crossChainActions— отображение actionId → CrossChainGameAction.
Основные функции и методы
Конструктор
constructor(address _manaToken, address _verificationManager, address _admin)
Инициализирует контракт с адресами токена MANA, менеджера верификации и администратора.
Присваивает роли
DEFAULT_ADMIN_ROLE,PAUSER_ROLE,EMERGENCY_ROLEадминистратору.Добавляет текущую цепочку в список поддерживаемых.
initiateCrossChainTransfer
function initiateCrossChainTransfer(address to, uint256 amount, uint64 targetChain) external whenNotPaused nonReentrant returns (bytes32 transferId)
Инициирует межцепочечный перевод MANA.
Проверяет корректность параметров: адрес получателя, сумма, поддержка цепочки, баланс отправителя.
Блокирует MANA, переводя их на контракт.
Создаёт запись о переводе с уникальным transferId.
Генерирует событие
CrossChainTransferInitiated.
Пример использования:
bytes32 id = crossChainManaManager.initiateCrossChainTransfer(recipient, 100 * 1e18, targetChainId);
validateTransfer
function validateTransfer(bytes32 transferId, bytes calldata signature) external onlyRole(VALIDATOR_ROLE) whenNotPaused
Валидатор подтверждает перевод, предоставляя подпись.
Проверяет статус перевода, таймаут, уникальность подписи.
Проверяет подпись валидатора.
Увеличивает счётчик подтверждений.
При достижении кворума меняет статус перевода на
VALIDATED.Генерирует событие
CrossChainTransferValidated.
completeCrossChainTransfer
function completeCrossChainTransfer(CrossChainMessage calldata message, ValidatorSignature[] calldata signatures) external whenNotPaused nonReentrant
Завершает перевод на целевой цепочке, проверяя подписи валидаторов или используя
verificationManager.Проверяет, что сообщение ещё не обработано (защита от повторов).
Мятает MANA получателю.
Генерирует событие
CrossChainTransferCompleted.
cancelExpiredTransfer
function cancelExpiredTransfer(bytes32 transferId) external whenNotPaused nonReentrant
Позволяет отправителю отменить перевод, если он истёк (превышен таймаут).
Возвращает заблокированные токены MANA отправителю.
Меняет статус перевода на
EXPIRED.Генерирует событие
CrossChainTransferCancelled.
Управление цепочками и валидаторами
addSupportedChain(uint64 chainId)— добавить поддержку цепочки.removeSupportedChain(uint64 chainId)— убрать поддержку цепочки (кроме текущей).addValidator(address validator)— добавить валидатора и выдать ему роль.removeValidator(address validator)— убрать валидатора и отозвать роль.updateQuorumThreshold(uint256 newThreshold)— обновить порог кворума.updateVerificationManager(address newVerificationManager)— обновить контракт проверки сообщений.
Работа с межцепочечными игровыми действиями
initiateCrossChainGameAction(...)— инициирует межцепочечное действие с MANA (например, трата, заработок, крафт).completeCrossChainGameAction(...)— завершает действие, проверяя подписи и мятая/списывая MANA, если требуется.synchronizePlayerState(...)— синхронизирует состояние игрока (баланс, уровень, опыт) между цепочками с подписью валидаторов.
Вспомогательные внутренние методы
_createMessageHash(...)— создаёт хэш сообщения для подписи._verifySignature(...)— проверяет подпись валидатора._verifyQuorum(...)— проверяет, что собрано достаточное количество валидных подписей._isSpendingAction(uint8 actionType)— определяет, тратит ли действие MANA._createGameActionHash(...)— создаёт хэш для игрового действия.
Важные детали реализации
Используются кастомные ошибки для оптимизации газа.
Защита от повторных вызовов реализована через
nonReentrantи проверку уникальности сообщений.Контракт интегрируется с внешним менеджером верификации
CrossChainVerificationManager, который может использовать протокол LayerZero для проверки сообщений.Для кворума используется порог в базисных пунктах, что даёт гибкость настройки.
Реализованы механизмы экстренного управления (пауза, форсированное завершение).
Валидация подписей проводится на уровне Ethereum signed message hash.
Валидаторы могут добавляться и удаляться динамически.
Поддержка нескольких цепочек реализована через маппинг
supportedChains.
Взаимодействие с другими частями системы
Контракт взаимодействует с контрактом
ManaTokenдля блокировки, выпуска (mint) и списания (burn) токенов MANA.Взаимодействует с
CrossChainVerificationManagerдля проверки сообщений, что позволяет использовать внешние протоколы межцепочечной верификации (LayerZero, Hyperlane).Взаимодействует с системой ролей OpenZeppelin
AccessControlдля управления доступом.Использует OpenZeppelin
ReentrancyGuardиPausableдля безопасности и управления состоянием.
Пример базового рабочего процесса межцепочечного перевода
Пользователь вызывает
initiateCrossChainTransferна исходной цепи, блокируя MANA.Валидаторы вызывают
validateTransfer, подтверждая перевод своими подписями.После достижения кворума перевод становится валидированным.
На целевой цепи вызывается
completeCrossChainTransferс сообщением и подписями.Подтверждение приводит к минтингу MANA получателю.
Если перевод не завершён в течение 24 часов — пользователь может отменить его и вернуть MANA.
Диаграмма структуры контракта
classDiagram
class CrossChainManaManager {
+bytes32 VALIDATOR_ROLE
+bytes32 PAUSER_ROLE
+bytes32 EMERGENCY_ROLE
+uint256 TRANSFER_TIMEOUT
+uint256 MIN_TRANSFER_AMOUNT
+uint256 MAX_TRANSFER_AMOUNT
+ManaToken manaToken
+CrossChainVerificationManager verificationManager
+uint64 currentChainId
+uint256 transferNonce
+uint256 quorumThreshold
+uint256 totalValidators
+mapping(bytes32 => CrossChainTransfer) transfers
+mapping(bytes32 => mapping(address => ValidatorSignature)) transferValidations
+mapping(uint64 => bool) supportedChains
+mapping(address => bool) activeValidators
+mapping(bytes32 => bool) processedMessages
+mapping(bytes32 => CrossChainGameAction) crossChainActions
+initiateCrossChainTransfer(address to, uint256 amount, uint64 targetChain) returns(bytes32)
+validateTransfer(bytes32 transferId, bytes signature)
+completeCrossChainTransfer(CrossChainMessage message, ValidatorSignature[] signatures)
+cancelExpiredTransfer(bytes32 transferId)
+addSupportedChain(uint64 chainId)
+removeSupportedChain(uint64 chainId)
+addValidator(address validator)
+removeValidator(address validator)
+updateQuorumThreshold(uint256 newThreshold)
+updateVerificationManager(address newVerificationManager)
+initiateCrossChainGameAction(uint8 actionType, bytes actionParams, uint256 manaAmount, uint64 targetChain) returns(bytes32)
+completeCrossChainGameAction(CrossChainGameAction action, ValidatorSignature[] signatures)
+synchronizePlayerState(address player, uint256 manaBalance, uint256 level, uint256 experience, uint64 sourceChain, ValidatorSignature[] signatures)
}
CrossChainManaManager --> ManaToken : uses
CrossChainManaManager --> CrossChainVerificationManager : uses
CrossChainManaManager ..|> AccessControl
CrossChainManaManager ..|> ReentrancyGuard
CrossChainManaManager ..|> Pausable
class CrossChainTransfer {
+bytes32 transferId
+address from
+address to
+uint256 amount
+uint64 sourceChain
+uint64 targetChain
+uint256 timestamp
+TransferStatus status
+uint256 validatorCount
+bytes32 messageHash
}
class ValidatorSignature {
+address validator
+bytes signature
+uint256 timestamp
}
class CrossChainMessage {
+bytes32 transferId
+address from
+address to
+uint256 amount
+uint64 sourceChain
+uint64 targetChain
+uint256 nonce
+uint256 timestamp
}
class CrossChainGameAction {
+bytes32 actionId
+address player
+uint8 actionType
+bytes actionParams
+uint256 manaAmount
+uint64 sourceChain
+uint64 targetChain
+uint256 timestamp
+CrossChainActionStatus status
+uint256 validatorCount
}
Заключение
CrossChainManaManager — сложный и многофункциональный контракт, обеспечивающий межцепочечную передачу токенов MANA и синхронизацию игрового состояния с использованием механизма валидации через консенсус валидаторов и внешние протоколы межцепочечной коммуникации. Контракт обладает расширенными возможностями администрирования, безопасности и гибкости, позволяя безопасно масштабировать игровые и финансовые операции между разными блокчейнами.