CrossChainVerificationManager.sol
Обзор
Контракт CrossChainVerificationManager предназначен для управления проверкой сообщений между разными блокчейн-сетями (кросс-чейн) через сеть Symbiotic. Он интегрирует два ключевых компонента верификации сообщений — SymbioticDVN (Decentralized Validator Network) и SymbioticISM (Interchain Security Module), а также взаимодействует с контрактом Settlement для подтверждения эпох (временных периодов) и батчевой проверки. Контракт обеспечивает безопасное и управляемое выполнение запросов на верификацию сообщений, поддерживает разные протоколы передачи сообщений (LayerZero, Hyperlane), управление ролями, а также паузу и экстренные операции.
Основные особенности и функциональность
Управление запросами на верификацию сообщений, поступающих с различных кросс-чейн протоколов.
Поддержка протоколов LayerZero и Hyperlane.
Интеграция с SymbioticDVN (для LayerZero) и SymbioticISM (для Hyperlane) для проверки состояния сообщений.
Батчевая верификация через Settlement контракт.
Управление ролями: валидаторы, паузеры, администраторы и экстренные роли.
Возможность добавлять и удалять валидаторов.
Обновление адресов ключевых контрактов (DVN, ISM, Settlement).
Возможность приостанавливать/возобновлять работу контракта и связанных систем в случае экстренных ситуаций.
Подробное описание компонентов
Перечисления
enum Protocol
Перечисляет поддерживаемые протоколы кросс-чейн сообщений:
LAYERZERO— протокол LayerZero.HYPERLANE— протокол Hyperlane.
Структуры
struct VerificationRequest
Структура, описывающая запрос на верификацию сообщения:
bytes32 requestId— уникальный идентификатор запроса.Protocol protocol— протокол, по которому пришло сообщение.bytes32 messageHash— хеш проверяемого сообщения.address requester— адрес инициатора запроса.uint256 timestamp— время создания запроса.bool verified— флаг, указывающий на статус верификации.uint48 epoch— эпоха для Settlement.
Ошибки (Custom Errors)
Для оптимизации газа контракт использует кастомные ошибки:
ZeroAddress()— передан нулевой адрес.InvalidProtocol()— протокол невалиден.ProtocolNotSupported()— протокол не поддерживается.VerificationFailed()— ошибка верификации.InvalidEpoch()— неверная эпоха.SettlementNotReady() — Settlement не готов к операции.
Роли доступа (Role Constants)
VALIDATOR_ROLE— роль валидатора, может выполнять завершение верификации.PAUSER_ROLE— роль для приостановки работы контракта.EMERGENCY_ROLE— роль для экстренных операций.
Основные переменные
SymbioticDVN public symbioticDVN — контракт DVN для LayerZero.
SymbioticISM public symbioticISM — контракт ISM для Hyperlane.
Settlement public settlement — контракт Settlement.
uint256 public requestNonce— счетчик для генерации уникальных ID запросов.mapping(bytes32 => VerificationRequest) public verificationRequests— хранение запросов верификации по ID.mapping(Protocol => bool) public supportedProtocols— поддержка протоколов.
Конструктор
constructor(
address _symbioticDVN,
address _symbioticISM,
address _settlement,
address _admin
)
Инициализирует контракт, задавая адреса связанных контрактов и администратора. Проверяет, что адреса не нулевые. По умолчанию активирует поддержку протоколов LayerZero и Hyperlane. Назначает роли администратора, паузера и экстренного оператора.
Функции
1. requestVerification
function requestVerification(
Protocol protocol,
bytes32 messageHash,
uint48 epoch
) external whenNotPaused nonReentrant returns (bytes32 requestId)
Описание: Создает новый запрос на проверку сообщения с заданным протоколом и хешем.
Параметры:
protocol— протокол кросс-чейн.messageHash— хеш сообщения.epoch— текущая эпоха для Settlement.
Возвращает:
requestId— уникальный идентификатор созданного запроса.Пример использования:
bytes32 id = crossChainVerificationManager.requestVerification(
CrossChainVerificationManager.Protocol.LAYERZERO,
keccak256(abi.encodePacked("message")),
currentEpoch
);
Особенности: Проверяет поддержку протокола и валидность параметров. Генерирует уникальный ID запроса, эмитирует событие
VerificationRequested.
2. completeVerification
function completeVerification(
bytes32 requestId,
bytes calldata proof
) external onlyRole(VALIDATOR_ROLE) whenNotPaused nonReentrant
Описание: Завершает проверку сообщения, используя доказательства (proof) валидаторов и вызывая соответствующие методы в DVN или ISM.
Параметры:
requestId— идентификатор запроса.proof— данные доказательства (используются валидационными контрактами, здесь передаются, но не анализируются явно).
Требования: Только валидаторы могут вызывать. Контракт должен быть активен.
Поведение: Проверяет, не была ли уже выполнена верификация, вызывает методы
isMessageVerifiedв DVN или ISM, обновляет статус и эмитирует событиеVerificationCompleted.Ошибки: Генерирует ошибку при неподдерживаемом протоколе или неуспешной проверке.
3. batchVerifyThroughSettlement
function batchVerifyThroughSettlement(
bytes32[] calldata requestIds,
uint48 epoch,
bytes calldata proof
) external onlyRole(VALIDATOR_ROLE) whenNotPaused nonReentrant
Описание: Батчевая проверка нескольких запросов с использованием Settlement.
Параметры:
requestIds— массив идентификаторов запросов.epoch— текущая эпоха.proof— батч-доказательство валидаторов.
Логика: Для каждого запроса проверяет статус и протокол, вызывает соответствующую проверку в DVN/ISM, обновляет статус и эмитирует события.
Особенности: В текущей реализации не реализована глубокая проверка эпохи через Settlement, но предусмотрена возможность интеграции.
4. getVerificationRequest
function getVerificationRequest(
bytes32 requestId
) external view returns (VerificationRequest memory request)
Описание: Возвращает детали запроса по его ID.
Параметры:
requestId— идентификатор запроса.Возвращает: структуру
VerificationRequest.
5. isMessageVerified
function isMessageVerified(
Protocol protocol,
bytes32 messageHash
) external view returns (bool verified)
Описание: Проверяет, верифицировано ли сообщение для заданного протокола.
Параметры: протокол, хеш сообщения.
Возвращает:
trueесли сообщение подтверждено, иначеfalse.
6. Функции обновления адресов контрактов
updateDVN(address newDVN)updateISM(address newISM)updateSettlement(address newSettlement)
Все функции требуют роль администратора, проверяют ненулевой адрес, обновляют соответствующий контракт и эмитируют события об обновлении.
7. updateProtocolSupport
function updateProtocolSupport(
Protocol protocol,
bool supported
) external onlyRole(DEFAULT_ADMIN_ROLE)
Обновляет статус поддержки протокола (включить или отключить).
8. Управление валидаторами
addValidator(address validator)— добавляет валидатора в DVN, ISM и выдает роль.removeValidator(address validator)— удаляет валидатора из DVN, ISM и отзывает роль.
9. Пауза и раз-пауза
pause()— приостанавливает работу контракта и связанных DVN/ISM.unpause()— снимает паузу со всех систем.
10. supportsInterface
Переопределяет метод из AccessControl для поддержки интерфейсов.
Взаимодействие с другими контрактами
SymbioticDVN — контракт для проверки сообщений протокола LayerZero.
SymbioticISM — контракт для проверки сообщений протокола Hyperlane.
Settlement — контракт, управляющий эпохами и батчевой проверкой.
Контракт взаимодействует с этими системами для делегирования верификации сообщений и координации состояния.
Важные детали реализации
Использование
bytes32для уникальных идентификаторов запросов с хешированием параметров.Оптимизация газа через кастомные ошибки.
Использование ролей OpenZeppelin AccessControl для разграничения доступа.
Механизмы паузы через OpenZeppelin Pausable.
Защита от повторных вызовов через ReentrancyGuard.
Поддержка нескольких протоколов с возможностью включения/отключения.
Пример использования
// Пользователь создает запрос на верификацию сообщения из LayerZero
bytes32 reqId = crossChainVerificationManager.requestVerification(
CrossChainVerificationManager.Protocol.LAYERZERO,
keccak256(abi.encodePacked("myMessage")),
currentEpoch
);
// Валидатор завершает верификацию
crossChainVerificationManager.completeVerification(reqId, proofData);
// Проверка статуса
bool isVerified = crossChainVerificationManager.isMessageVerified(
CrossChainVerificationManager.Protocol.LAYERZERO,
keccak256(abi.encodePacked("myMessage"))
);
Диаграмма классов
classDiagram
class CrossChainVerificationManager {
<<contract>>
+bytes32 VALIDATOR_ROLE
+bytes32 PAUSER_ROLE
+bytes32 EMERGENCY_ROLE
+enum Protocol { LAYERZERO, HYPERLANE }
+struct VerificationRequest
+SymbioticDVN symbioticDVN
+SymbioticISM symbioticISM
+Settlement settlement
+uint256 requestNonce
+mapping(bytes32 => VerificationRequest) verificationRequests
+mapping(Protocol => bool) supportedProtocols
+constructor(address _symbioticDVN, address _symbioticISM, address _settlement, address _admin)
+requestVerification(protocol, messageHash, epoch) returns (bytes32)
+completeVerification(requestId, proof)
+batchVerifyThroughSettlement(requestIds, epoch, proof)
+getVerificationRequest(requestId) returns (VerificationRequest)
+isMessageVerified(protocol, messageHash) returns (bool)
+updateDVN(newDVN)
+updateISM(newISM)
+updateSettlement(newSettlement)
+updateProtocolSupport(protocol, supported)
+addValidator(validator)
+removeValidator(validator)
+pause()
+unpause()
+supportsInterface(interfaceId) returns (bool)
}
Итог
Контракт CrossChainVerificationManager является ядром системы кросс-чейн верификации сообщений в сети Symbiotic, обеспечивая надежный, гибкий и безопасный механизм интеграции различных протоколов и компонентов сети, а также удобное управление ролями и состоянием системы. Его архитектура позволяет расширение и адаптацию под новые протоколы и требования.