本文介绍了 ERC7786Aggregator 的工作原理及其在跨链消息传递中的重要性,强调通过多个网关的确认机制增强了安全性,避免依赖单一提供商。文章详细阐述了合约的配置、信息发送及执行流程,以及此方案对提升跨链通信安全性的优势。
最后更新:2025年4月10日,上午9:17
当使用特定协议发送跨链消息时,发送者本质上依赖于该协议的安全性、可靠性和速度。对于大多数休闲或日常应用,这已经足够。然而,在某些情况下,对于管理跨链通信,增加额外的安全措施可能是有益的甚至是必要的。
因为 ERC7786 定义了一种统一的消息传输和接收过程,无论链之间是否经过不同的协议,源链和目标链上的消息都必须保持一致。这种一致性使得将相同的消息发送到多个网关并确认它们都被准确发送成为可能。
这就是 ERC7786Aggregator
的作用。其逻辑类似于多重签名(multisig),在多重签名中,必须有一定数量的签名者签署交易才能执行;在聚合器中,来自源链的消息必须通过不同的网关成功发送之后,才能在目标链上执行。
聚合器合约实现了 IERC7786GatewaySource
和 IERC7786Receiver
接口。这意味着从调用者的角度来看,通过聚合器发送消息的方式与他们与任何单一的符合 ERC7786 的桥或适配器互动的方式相同。不同之处在于,聚合器将消息分发到多个网关,而不仅仅是转发给一个端点。
在下面的图中,可以看到如何实现 2/3 聚合器:
当聚合器合约首次部署时,它接受一组初始网关以及一个阈值。这些网关必须是支持 IERC7786GatewaySource
接口的合约地址。另一方面,阈值用于定义在消息被视为有效之前所需的确认数量。在部署过程中,构造函数将每个网关添加到一个内部集合中,并将阈值设置为提供的值。
初始化后,合约所有者保留调整这些设置的能力:
添加或移除网关:所有者可以将一个新的网关地址引入聚合器的注册表,或移除已有的网关。这种灵活性允许聚合器随着时间的推移而发展,适应新的桥接解决方案或移除过时的网关。
更新阈值:当系统的需求变化时,所有者可以更新阈值。根据协议的要求,你可能希望在安全性需要高时设置更高的阈值(例如,要求多个网关确认消息)或在希望更快批准和降低成本时设置更低的阈值。
由于这些功能可能会改变消息的发出和确认的基本行为,因此它们限制为合约所有者使用。请注意,聚合器的安全性依赖于诚实的所有者,因此请仔细考虑在你协议的上下文中可接受的信任假设。
正如桥接和适配器通常维护其在目标链上对应物的引用一样,聚合器也必须跟踪每个目标链上存在的对应聚合器合约。这使跨链消息能够在双方上得到正确的验证和执行。
从技术角度来看,这个注册过程涉及存储一个映射,将链标识符(格式为 CAIP-2
字符串)与该链上聚合器的地址(或标识符)相关联。registerRemoteAggregator
功能仅限合约所有者,以防止未经授权的更新。当调用时,它更新这个内部映射,以便聚合器始终知道针对给定链应该参考哪个远程聚合器。
当用户调用聚合器的 sendMessage
功能(符合 IERC7786GatewaySource
),他们传入目标链名称、目标链上接收方的地址(或标识符)、有效负载数据和任何附加属性作为参数。在内部,聚合器处理这些输入并将其传递给其注册表中的每个网关:
遍历所有网关:聚合器保持一个数组(命名为 _gateways
),该数组包含对所有支持的网关的引用。每个网关必须实现 IERC7786GatewaySource
以确保消息兼容性,因此聚合器可以遍历此列表,将相同的消息转接到每个网关。
收集消息标识符:如果任何网关在消息发送时返回一个 ID(表示为 bytes32
值),聚合器将在一个“发件箱”(outbox)数据结构中记录该 ID。该发件箱中的每个条目将网关的地址与其生成的 ID 关联,以便于跟踪。
聚合结果:由于多个网关可能生成不同的标识符,聚合器跟踪所有接收到的非零 ID。这些 ID 可以在稍后确认或排除故障时使用,特别是如果某个网关的消息失败或遇到延迟时。
在目标链上,聚合器通过提供 executeMessage
功能来实现 IERC7786Receiver
接口。与典型的桥接或适配器立即执行接收到消息的方式不同,聚合器会推迟对消息接收者的最终调用,直到它从不同网关接收到足够的确认以满足阈值。
当目标链上的网关调用 executeMessage
时,聚合器通过对源链、发送者和有效负载进行哈希,生成传入消息的唯一标识符。然后它引用一个跟踪结构(tracker
),将该 ID 与重要细节链接:
哪些网关已经递送了消息
到达了多少个确认
聚合器是否已经调用了最终接收者
如果聚合器将网关的地址识别为有效,并且发现尚未计算来自该网关的递送,它将使用新的信息更新消息的 tracker
。
在增加接收到的递送数量后,聚合器检查消息是否已达到阈值。如果阈值已满足且消息尚未执行,聚合器设置执行标志以防止重新进入,然后构造对预期接收者的 executeMessage
的函数调用。
该调用包括消息标识符(转换为字符串),源链、原发送者、原有效负载和任何属性。请注意,接收者必须实现 IERC7786Receiver
接口。
如果最终调用成功,聚合器会发出一个事件,指示执行成功。如果失败或返回意外值,聚合器会回滚执行标志,以便可能进行重试,然后发出事件以信号失败的尝试。由于在阈值达到后多个网关可能继续递送相同的消息,聚合器包含一个安全机制,检查执行标志,防止进一步尝试执行相同的消息。这确保最终接收者只被调用一次,即使涉及多个网关。
使用 ERC7786 聚合器通过消除对单一提供者的信任增强了跨链消息的安全性,同时仍然支持标准并为开发者提供灵活性。例如,在一个 2/3 聚合器(3 个网关和阈值为 2)中:
ERC7786 聚合器的实现可以在 这里 找到。
- 原文链接: erc7786.org/aggregator...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!