多重签名 ISM
通过验证者共识验证消息
MultisigISM
是最常用的 ISM 类型之一。这些 ISM 验证 m
个中的 n
个 验证者 已经确认特定跨链消息的有效性。
多重签名模块类型
有两种类型的 MultisigISM
模块:
enum Types {
...
MERKLE_ROOT_MULTISIG,
MESSAGE_ID_MULTISIG,
...
}
MerkleRootMultisigIsmMetadata
类型:Types.MERKLE_ROOT_MULTISIG
元数据格式:
组件 | 长度(字节) | 描述 |
---|---|---|
第一个组件 | 32 | 原始 Merkle 树地址 |
第二个组件 | 4 | Merkle 树中消息 ID 的索引 |
第三个组件 | 32 | 签名的检查点消息 ID |
第四个组件 | 1024 | Merkle 证明 |
第五个组件 | 4 | 签名的检查点索引(根据证明和索引计算得出) |
第六个组件(长度 == 阈值 * 65 字节) | 阈值 * 65 | 验证者签名 |
MessageIdMultisigIsmMetadata
类型:Types.MESSAGE_ID_MULTISIG
元数据格式:
组件 | 长度(字节) | 描述 |
---|---|---|
第一个组件 | 32 | 原始 Merkle 树地址 |
第二个组件 | 32 | 签名的检查点根 |
第 三个组件 | 4 | 签名的检查点索引 |
第四个组件(长度 == 阈值 * 65 字节) | 阈值 * 65 | 验证者签名 |
接口
MultisigISMs
必须实现 IMultisigIsm
接口。
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";
interface IMultisigIsm is IInterchainSecurityModule {
/**
* @notice Returns the set of validators responsible for verifying _message
* and the number of signatures required
* @dev Can change based on the content of _message
* @dev Signatures provided to `verify` must be consistent with validator ordering
* @param _message Hyperlane formatted interchain message
* @return validators The array of validator addresses
* @return threshold The number of validator signatures needed
*/
function validatorsAndThreshold(
bytes calldata _message
) external view returns (address[] memory validators, uint8 threshold);
}
配置
hyperlane-monorepo 包含 MultisigISM
实现(包括一个 遗留 版本和更节省 gas 的 版本,可以通过工厂进行部署),应用开发者可以按需部署,指定所需的配置。
要配置 MultisigISM
实例:
- 开发者定义每个源链上的
n
个验证者集合。 - 设置一个阈值,指定确认消息所需的验证者签名数量(
m
)。
验证者签名并不特定于某个 ISM。换句话说,开发者可以将他们的 MultisigISM
配置为使用在 Hyperlane 上运行的任何验证者。
自定义
对于更具体的用例,开发者可以从 Hyperlane monorepo 中派生抽象的 MultisigISM
实现。主要的自定义涉及实现 validatorsAndThreshold()
函数。
自定义实现允许开发者调整安全模型,以满足其应用的需求。例如,自定义实现可以根据被验证消息的内容变化所需的签名数量。