Moonbeam与Hyperlane之间的跨链互连合约
跨链通信除了作为Moonbeam的核心,也是为何另一个跨链协议Hyperlane部署于Moonbeam之上的原因。与先前介绍的跨链协议Axelar和LayerZero类似,Hyperlane允许开发人员编写可以跨区块链通信的智能合约,并让开发人员可以在Moonbeam上构建,这些应用程序可以利用波卡、以太坊、Avalanche等公链提供的功能。
多链dApp目前作为跨多个不同EVM协议的整合接口。协议将能够使用Hyperlane的通用消息传递将其合约进行跨链整合,从而实现多链部署,在原先孤立的生态系统之间实现进阶的互操作性和功能。
为展示互连合约的强大功能,此演示将会把一个字符串自一个EVM测试网发送并存储至另一个EVM测试网。该演示需要一个已添加Moonbase Alpha网络的MetaMask帐户,您可以通过访问Moonbeam文档页面来完成此操作:https://docs.moonbeam.network/cn/builders/get-started/networks/moonbase/
1
Hyperlane合约概览
Hyperlane是PoS链协议的委托证明,通过可配置的共识函数验证和保护跨链通信。Hyperlane网络中的每个验证人都将负责验证Hyperlane连接到的每条链。Hyperlane协议包含可验证的欺诈证明,可由其Watchtowers网络计算,以证明验证人提供的跨链消息是否有效。这些证明将根据dApp希望使用的共识函数(PoS权益证明、多签等)进行调整,然而大多数dApp会默认使用权益证明(PoS)。
图片来源于Hyperlane
跨链消息通过Hyperlane的发件箱(Outbox)和收件箱(Inbox)智能合约进行路由。收件箱(Inbox)是接收和处理消息的智能合约。每个Hyperlane连接的链都部署了多个收件箱,因为每个收件箱仅连接到另一区块链。发件箱也是一个智能合约,可以通过它将消息发送到其他链。每条链上只会部署了一个发件箱。
为帮助管理收件箱和发件箱智能合约,Hyperlane有一个当前名为AbacusConnectionManager的合约(Hyperlane过去被命名为Abacus)。此外,为帮助管理目标链上的Gas支付,Hyperlane还有另一个名为InterchainGasPaymaster的合约。
作为开发人员,您将部署与所有这些合约交互的智能合约,尽管大部分智能合约代码将打包到母智能合约中供您使用,您在使用时无需查看实现细节。
2
连接SimpleGeneralMessage合约
Hyperlane目前建议您使用其快速入门指南来了解他们的协议,这是了解跨链消息是如何发送和接收的重要指南。本指南部分使用Hyperlane范例项目进行开发,这将有助于读者理解如何部署和编写跨链互连合约。
本指南将不会设置整个Git库,而是使用流行工具Remix来部署合约并与之交互。要了解您在做什么,请查看将部署的合约(已在Github gist中提供),您也可以通过此Remix链接访问。
此合约的母合约为Router,它是从Hyperlane包中导入的。该母合约简化了与Inbox和Outbox合约交互的困难,让编写互连合约更加容易。为了简单起见,本文不会深入至Router合约,但其中有两点对于理解整个部署步骤很重要。
首先,请注意智能合约开发人员可以覆盖一个_handle函数。当Inbox合约收到一条指向一个智能合约的消息时,它将调用一个名为handle的外部函数。该handle函数将在数次检查后调用_handle,因此_handle函数实际上是智能合约接收和回应跨链消息的地方。
其次,有一个路由注册系统会充当每个合约的白名单。一个Hyperlane连接的合约无法向另一个未注册的合约发送消息(如果目的地使用Router合约)。Router合约将有许多外部函数,而这些函数将应用onlyRemoteRouter修饰符,以调用上述白名单系统。
在部署时,您必须与路由注册系统进行交互,以便让互连合约知道向哪个合约发送消息。
但在您部署之前,请先查看SimpleGeneralMessage智能合约中的sendMessage函数。如果您看过我们先前介绍Axelar和LayerZero的博客,您将能猜到这个函数类似于跨链发送消息。Hyperlane的路由合约提供了可能是当前可用的最简化版本,只需要目标链的域名(Hyperlane版本的链ID)和有效载荷来启动跨链消息。
第一行将消息发送者和字符串消息打包成一个字节物件,此为大多数跨链通用消息系统用来发送和接收数据的格式。第二行将消息发送到本地链的Outbox合约,并使用InterchainGasPaymaster支付消息在目标链的执行费用。
请注意,该消息是需要付费的。由于_dispatchWithGas函数的调用包括msg.value作为其第三个参数,因此交易的全部价值将作为Gas发送,以支付在目标链上的执行费用。而之所以需要二次Gas支付,是因为交易执行时支付的Gas仅针对源链,需要发送额外的价值来支付目标链的执行才能完成一次完整的跨链消息。
现在您可以查看互连合约是如何接收消息的。当Inbox合约收到一条指向互连合约的消息时,它将调用该合约的外部handle函数并传入相关数据。您的互连合约继承自的The Router函数包括此handle函数。连同额外的幕后逻辑,它调用内部和可覆盖的_handle函数(如下所示),它将允许开发人员在接收消息时自定义他们的智能合约逻辑。
在这种情况下,_handle函数做的第一件事就是解码由远程合约的sendMessage函数打包的消息。接着在第二行存储要读取的结果消息。
代码相对简单,所以现在您将部署合约!实践是最好的学习方式,因此请您尝试跟随此教程,自己在Moonbase Alpha上部署和执行消息传递。
3
通过Remix在Moonbase Alpha上
进行部署
部署一个Demo合约最简单的方式是通过Remix。而在Moonbase Alpha上部署需要DEV,如果您尚未拥有DEV,您可以从我们提供的Faucet获取。
要部署脚本,您首先可以将合约复制并粘贴到Remix中,或者直接从此Remix gist链接打开它。然后在Solidity Compiler标签中编译。同时,请确保您的MetaMask已连接到Moonbase Alpha网络。然后,在Remix的Deploy & Run Transactions标签中,将环境设置为Injected Web3。这将使用MetaMask作为Web3提供者。
要在每条链上部署,您将需要上述提及的两个合约的本地实例地址:AbacusConnectionManager和InterchainGasPaymaster。此外,您将需要Hyperlane域名以用于后续步骤。下表为选定测试网的所有相关数据。您可以在Hyperlane的文档页面上找到其他网络的终端。
在Moonbase Alpha上部署合约后,确保复制其地址并使用连接到Hyperlane的任何其他EVM测试网之一重复该过程,以便它可以跨链发送消息。
4
注册远程路由
如先前所述,Router母智能合约附带了一个白名单安全系统。如果您曾阅读LayerZero博客文章,您会注意到他们在设置信任的远程地址时也有一个类似的系统。
路由合约目前只允许每条链有一个智能合约作为注册的远程路由,因为它假设每条链上只有一个部署相互通信。但这不是网络本身的限制:您可以编写自己的自定义Router智能合约。
要注册互连Router合约,您须调用以下函数。只有合约所有者(在本例中为部署者)才能设置信任的远程地址。_domain参数是合约应从中接收消息的链的Hyperlane域名标识符,其中一些列于上表中(其余在Hyperlane的文档页面上)。_router参数是互连合约的地址,您应从该地址接收消息。除外,该地址与域名标识符存在于同一链上。
您可能会注意到_router参数是bytes32而非一般地址。这是为了支持未来的非EVM链而设计。在Remix中提供输入时,您需要在地址中额外填充24个零。例如,如果我连接的合约地址是0xaf108eF646c8214c9DD9C13CBC5fadf964Bbe293,我会在Remix中输入以下内容:
0x000000000000000000000000af108ef646c8214c9dd9c13cbc5fadf964bbe293
现在我们将继续使用Remix来确保您的两个互连合约相互信任。您必须对已部署的两个合约执行此操作。要在不同链上的合约之间切换,请通过MetaMask连接到目标网络。确保您处于Injected Provider环境中,并且合约仍然为SimpleGeneralMessage。然后将目标合约的地址粘贴到At Address输入框中。
要添加信任的远程地址,请在SimpleGeneralMessage合约中找到enrollRemoteRouter函数并将其打开。
当您在Moonbase Alpha上时,将_domain设置为您选择的其他EVM测试网的Hyperlane域名标识符(可在他们的文档或上表中找到)。将_router设置为您在其他EVM测试网上部署的合约,并确保为格式正确(用24个零填充)的地址。之后,在MetaMask中进行交易和确认。
当您在备用EVM测试网上时,将_domain输入框设置为Moonbase Alpha的Hyperlane域名标识符(0x6d6f2d61)。将_router输入框设置为您在Moonbase Alpha上部署的合约,并确保为格式正确的地址。最后,在MetaMask中进行交易和确认。
在本部分教程中,您应该已经在两条链上发送了两笔交易,以在两个合约中设置信任的远程地址。之后,您应该可以在互连合约之间发送交易。
5
通过Hyperlane从Moonbase传送
跨链消息
要发送带有自动目标链交易的跨链消息,您必须使用Hyperlane终端消息支付额外的Gas以抵消目标链的Gas成本。这种额外的Gas支付以您包含在交易中的原生Token(GLMR、ETH等)形式出现,并被设置为消息的值。
Hyperlane有一个易用的SDK来帮助估算跨链交易的Gas费用,但对于这篇博客来说超出了范围。为了简单起见,最好使用跨链消息发送一笔较大数额的原生Token,比如300000000 Gwei。注意,请勿在生产环境中发送如此大数额的Token,并且这种高估Gas的方法仅用于测试网的演示目的。截至本文撰写时,Hyperlane的Gas退款功能仍在开发中,任何多出的Gas将由中继器保留。
现在您可以使用Remix接口操作。此范例将向Avalanche Fuji测试网发送跨链消息,但您可以用Gas数值和链名称替换您想要的任何EVM网络。
接着,检查以下事项:
环境为Injected Provider – Web3 on network 1287(Moonbase Alpha)
您的钱包里有来自faucet的大量资金,以支付交易成本和目标链Gas包含的DEV
您在上一步中将Gas费用设置为300000000 Gwei后输入
在sendMessage调用的消息输入中输入您选择的短消息(在本例中为“hello from moonbase alpha”)
将目标链的Hyperlane域名标识符放在sendMessage调用的_destinationDomain输入框中
当您完成上述步骤,请执行交易并在MetaMask中确认。
6
追踪跨链消息
在您发送交易后,您应该能够进入Moonbase Alpha区块浏览器使用其交易哈希查看交易。如果一切顺利,交易应当能够被成功确认,而当您以UTF-8格式查看时,您将能够在最底部看到交易输入的痕迹。
在一般的交易中,交易的状态和数据将可在一个浏览器的页面上看到。但是,由于这是跨链消息传递,因此实际上在两条链上发生了两笔EVM交易。
如果一切顺利,交易将被批准,您将能够看到跨链交易成功后在源链中更新的lastMessage!如果它没有自动更新,请不要担心。一般来说,交易完成大约需要30秒到一分钟的时间。
如果您想查看储存在合约中的消息,您可以通过Remix操作。首先,通过MetaMask连接到目标网络。接着,确保您处于Injected Provider环境中,并且选择的合约仍然是“SimpleGeneralMessage”。然后,获取目标合约的地址,并将其粘贴到At Address输入栏中。点击后,您应该可以使用获得的合约结果查看最后一条消息。
如果您没有看到消息的结果,Hyperlane有一个浏览器来追踪交易,您可以使用第一个源链消息的交易哈希来追踪跨链消息的状态。
7
深入了解跨链互连合约
更多信息,包括Hyperlane文档中的如何发送跨链消息:
https://docs.hyperlane.xyz/hyperlane-docs/introduction/readme
阅读关于Moonbeam如何成为区块链互操作性的领导者,请访问Moonbeam的Connected Contracts页面:https://moonbeam.network/builders/connected-contracts/
Moonbeam是一个智能合约平台,用于构建跨链互连应用程序,能够访问任何链上的用户、服务。通过将来自以太坊、Cosmos、波卡等功能整合到一个平台中,Moonbeam解决了当今用户体验碎片化的问题,解锁了真正的互操作性,并为下一代应用程序奠定基础。
Moonbeam平台使用集成的跨链信息传递,允许开发者创建访问多个远程区块链服务的智能合约。通过此方式结合Moonbeam的开发者友好型EVM平台、各类工具支持和Substrate架构,为构建互连应用程序提供理想化的开发环境。
如需了解更多信息,请访问:
https://moonbeam.network/
Moonbeam
欢迎加入Moonbeam社区
期待与您携手打造去中心化跨链世界 ~
△ 获取Moonbeam官方最新资讯
更多Moonbeam信息
官网: https://moonbeam.network
Twitter: https://twitter.com/MoonbeamCN
Telegram: https://t.me/moonbeam_CN
Discord: https://discord.gg/skPfXvJWG7
中文电报群助手:@MoonbeamSister