SymbioticISM.sol


Обзор

Контракт SymbioticISM реализует межцепочечный модуль безопасности (Interchain Security Module, ISM), обеспечивающий проверку сообщений в инфраструктуре Hyperlane с помощью сети валидаторов Symbiotic. Основная задача контракта — гарантировать подлинность и целостность межцепочечных сообщений, опираясь на кворум валидаторов, которые подписывают и подтверждают корректность сообщений.

Контракт поддерживает управление ролями, возможность приостановки работы (pausing), а также аварийное управление. Он взаимодействует с системой валидаторов, хранит статус проверок сообщений и обеспечивает проверку подписей валидаторов.


Структуры и основные компоненты

Роли доступа

Константы

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

enum VerificationStatus {
    PENDING,    // Ожидает проверки
    VERIFIED,   // Проверено успешно
    FAILED,     // Проверка провалена
    EXPIRED     // Время проверки истекло
}

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


Функции и методы

Конструктор

constructor(address _admin)

Инициализирует контракт, назначая адрес администратором и выдавая ему основные роли (DEFAULT_ADMIN_ROLE, PAUSER_ROLE, EMERGENCY_ROLE). Проверяет, что _admin не равен нулевому адресу.


Проверка сообщения (view)

function verify(bytes calldata metadata, bytes calldata message) external view returns (bool verified)

Проверяет, был ли ранее верифицирован переданный message. Для этого:


Запрос проверки сообщения

function requestVerification(HyperlaneMessage calldata message) external whenNotPaused returns (bytes32 messageId)

Инициирует процесс верификации сообщения:


Верификация сообщения валидатором

function verifyMessage(bytes32 messageId, bytes calldata signature) external onlyRole(VALIDATOR_ROLE) whenNotPaused

Валидатор подтверждает сообщение:


Получение статуса проверки сообщения

function getVerificationStatus(bytes32 messageId) external view returns (VerificationStatus status, uint256 validatorCount, uint256 requiredValidators)

Возвращает текущий статус проверки, количество подписавших валидаторов и необходимое число для кворума.


Проверка, подтверждено ли сообщение

function isMessageVerified(bytes32 messageId) external view returns (bool verified)

Возвращает true, если сообщение проверено.


Получение информации о проверке конкретным валидатором

function getValidatorVerification(bytes32 messageId, address validator) external view returns (ValidatorVerification memory verification)

Возвращает структуру ValidatorVerification для валидатора и сообщения.


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

Эмитят событие SupportedDomainUpdated.


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


Обновление порога кворума

function updateQuorumThreshold(uint256 newThreshold) external onlyRole(DEFAULT_ADMIN_ROLE)

Устанавливает новый порог кворума в базисных пунктах (0 < threshold ≤ 10000).


Получить необходимое количество валидаторов для кворума

function getRequiredValidators() external view returns (uint256 required)

Вычисляет totalValidators * quorumThreshold / 10000.


Проверка поддержки домена

function isDomainSupported(uint32 domain) external view returns (bool supported)

Возвращает, поддерживается ли домен.


Приостановка и возобновление работы (pausable)


Экстренная верификация сообщения

function emergencyVerifyMessage(bytes32 messageId) external onlyRole(EMERGENCY_ROLE)

Позволяет с ролью EMERGENCY_ROLE принудительно отметить сообщение как проверенное.


Внутренняя проверка подписи валидатора

function _verifyValidatorSignature(bytes32 messageId, bytes calldata signature, address validator) internal pure returns (bool valid)

Поддержка интерфейсов

function supportsInterface(bytes4 interfaceId) public view override returns (bool)

Расширяет поддержку интерфейсов из AccessControl.


Взаимодействие с системой


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


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

// Администратор разворачивает контракт
SymbioticISM ism = new SymbioticISM(adminAddress);

// Администратор добавляет валидаторов
ism.addValidator(validator1);
ism.addValidator(validator2);

// Добавляет поддерживаемые домены
ism.addSupportedDomain(1);
ism.addSupportedDomain(2);

// Пользователь запрашивает проверку сообщения
bytes32 msgId = ism.requestVerification(hyperlaneMessage);

// Валидаторы подписывают и подтверждают сообщение
ism.verifyMessage(msgId, signatureValidator1);
ism.verifyMessage(msgId, signatureValidator2);

// Проверка статуса сообщения
(bool isVerified) = ism.isMessageVerified(msgId);

Диаграмма структуры контракта

classDiagram
    class SymbioticISM {
        +bytes32 VALIDATOR_ROLE
        +bytes32 PAUSER_ROLE
        +bytes32 EMERGENCY_ROLE
        +uint256 VERIFICATION_TIMEOUT
        +uint256 MAX_VALIDATORS_PER_VERIFICATION
        +uint256 quorumThreshold
        +uint256 totalValidators
        +mapping verifications
        +mapping validatorVerifications
        +mapping supportedDomains
        +mapping activeValidators
        +constructor(address _admin)
        +verify(bytes metadata, bytes message) bool
        +requestVerification(HyperlaneMessage message) bytes32
        +verifyMessage(bytes32 messageId, bytes signature)
        +getVerificationStatus(bytes32 messageId) (VerificationStatus, uint256, uint256)
        +isMessageVerified(bytes32 messageId) bool
        +getValidatorVerification(bytes32 messageId, address validator) ValidatorVerification
        +addSupportedDomain(uint32 domain)
        +removeSupportedDomain(uint32 domain)
        +addValidator(address validator)
        +removeValidator(address validator)
        +updateQuorumThreshold(uint256 newThreshold)
        +getRequiredValidators() uint256
        +isDomainSupported(uint32 domain) bool
        +pause()
        +unpause()
        +emergencyVerifyMessage(bytes32 messageId)
        -_verifyValidatorSignature(bytes32 messageId, bytes signature, address validator) bool
        +supportsInterface(bytes4 interfaceId) bool
    }
    
    class MessageVerification {
        +bytes32 messageId
        +uint32 origin
        +uint32 destination
        +bytes32 sender
        +bytes32 recipient
        +bytes32 bodyHash
        +uint256 timestamp
        +VerificationStatus status
        +uint256 validatorCount
        +mapping validatorSigned
    }
    
    class ValidatorVerification {
        +address validator
        +bytes signature
        +uint256 timestamp
        +bool isValid
    }
    
    class HyperlaneMessage {
        +bytes32 messageId
        +uint32 origin
        +uint32 destination
        +bytes32 sender
        +bytes32 recipient
        +bytes body
        +bytes metadata
    }

    SymbioticISM "1" --> "many" MessageVerification : verifications
    SymbioticISM "1" --> "many" ValidatorVerification : validatorVerifications
    SymbioticISM "1" --> "many" HyperlaneMessage : used in requestVerification

Заключение

Контракт SymbioticISM обеспечивает комплексную систему проверки межцепочечных сообщений в сети Hyperlane с высокой степенью безопасности через кворум валидаторов. Он сочетает в себе гибкое управление ролями, поддержку экстренных сценариев и масштабируемость по количеству валидаторов и доменов. Контракт интегрируется с экосистемой OpenZeppelin, что гарантирует надёжность и безопасность базовых функций.

Документация и архитектура позволяют легко расширять функциональность и интегрировать его в сложные межцепочечные приложения.