Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-6170: 跨链消息传递接口

用于与消息传递协议交互的通用智能合约接口。

Authors Sujith Somraaj (@sujithsomraaj)
Created 2022-12-19
Discussion Link https://ethereum-magicians.org/t/cross-chain-messaging-standard/12197

摘要

此 EIP 引入了一个通用的跨链任意消息桥 (AMB) 接口,用于发送和接收跨链消息(状态)。

动机

目前,跨链任意消息桥缺乏标准化,导致复杂的竞争性实现:Layerzero、Hyperlane、Axelar、Wormhole、Matic State Tunnel 及其他。无论是链原生(或)独立的消息桥,问题依然存在。向任意消息桥添加一个通用的标准化接口可以提供以下好处:

  • 易于开发: 一个通用的标准接口将帮助开发者轻松构建可扩展的跨链应用程序。

  • 提高可扩展性: 跨链应用程序可以高效地使用多个消息桥。

  • 提高安全性: 针对特定参数的安全性。目前,每个消息桥都有其不同的安全变量。例如,在 Layerzero 中,nonce 用于防止重放攻击,而 Hyperlane 使用 Merkle 根哈希。

  • 提高稳健性: 涉及链下组件的消息桥不具备抗审查能力,并且容易出现停机。因此,构建在其之上的应用程序别无选择,只能迁移其整个状态(对于大型复杂应用程序而言,这是非常不可能的)。

规范

本文档中的关键词 “MUST”,“MUST NOT”,“REQUIRED”,“SHALL”,“SHALL NOT”,“SHOULD”,“SHOULD NOT”,“RECOMMENDED”,“MAY” 和 “OPTIONAL” 按照 RFC 2119 中的描述进行解释。

每个兼容的跨链任意消息桥都必须实现以下接口。

// SPDX-License-Identifier: Apache-3.0

pragma solidity >=0.8.0;

/// @title 跨链消息传递接口
/// @dev 允许无缝的链间消息传递。
/// @author Sujith Somraaj
/// Note: 在整个实现过程中都使用 Bytes 以支持非 evm 链。

interface IEIP6170 {
    /// @dev 当发送跨链消息时,会发出此事件。
    /// Note: 当发送消息时,MessageSent 必须触发,包括零字节传输。
    event MessageSent(
        bytes to,
        bytes toChainId,
        bytes message,
        bytes extraData
    );

    /// @dev 当收到跨链消息时,会发出此事件。
    /// MessageReceived 必须在任何成功调用 receiveMessage(bytes chainId, bytes sender, bytes message) 函数时触发。
    event MessageReceived(bytes from, bytes fromChainId, bytes message);

    /// @dev 将消息发送到不同区块链上的接收地址。
    /// @param chainId_ 是接收区块链的唯一标识符。
    /// @param receiver_ 是接收者的地址。
    /// @param message_ 是要传递的任意消息。
    /// @param data_ 是特定于桥的编码数据,用于链下中继器基础设施。
    /// @return 发送链上流程的状态。
    /// Note: 此函数旨在支持 evm 和非 evm 链
    /// Note: 建议 chain-id 是对其原生 token 名称字符串进行字节编码。 例如,abi.encode("ETH"), abi.encode("SOL") 假设它们不能被覆盖。
    function sendMessage(
        bytes memory chainId_,
        bytes memory receiver_,
        bytes memory message_,
        bytes memory data_
    ) external payable returns (bool);

    /// @dev 接收来自不同区块链上的发送者的消息。
    /// @param chainId_ 是发送区块链的唯一标识符。
    /// @param sender_ 是发送者的地址。
    /// @param message_ 是发送者发送的任意消息。
    /// @param data_ 是用于安全目的的附加参数。 例如,可以在 layerzero 中发送 nonce。
    /// @return 消息处理/存储的状态。
    /// Note: 发送者验证(或)消息验证应在处理消息之前进行。
    function receiveMessage(
        bytes memory chainId_,
        bytes memory sender_,
        bytes memory message_,
        bytes memory data_
    ) external payable returns (bool);
}

理由

跨链任意消息传递接口将通过一个功能完整但最小化的接口来优化区块链之间的互操作性层。 这种轻量级的方法还为任意消息桥提供了在 relayer 层面进行创新的自由,以展示其技术实力。

该 EIP 将使区块链更易于使用和扩展。 它为构建跨链应用程序开辟了可能性,可以利用任何两个区块链,而不仅仅是那些仅限于 Ethereum 和兼容 L2 的区块链。 从这个角度来看,一种易于通信的机制将允许开发者在 Ethereum 和 Solana 之间构建跨链应用程序,从而利用它们各自独特的优势。

该接口还旨在降低应用程序/协议的单点故障 (SPOF) 风险,因为它们可以通过更新其 AMB 地址来继续运行。

安全考虑

完全无需许可的消息传递可能对协议构成安全威胁。 建议所有集成者在集成之前审查消息传递隧道的实现。

在没有发送者身份验证的情况下,任何人都可以将任意消息写入接收智能合约。

此 EIP 仅关注如何以特定标准发送和接收消息。 但集成者可以利用 data_ 参数在接收函数中实现任何身份验证(或)特定于消息隧道的操作。

版权

版权和相关权利已通过 CC0 放弃。

Citation

Please cite this document as:

Sujith Somraaj (@sujithsomraaj), "ERC-6170: 跨链消息传递接口 [DRAFT]," Ethereum Improvement Proposals, no. 6170, December 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6170.