Moonbeam和Hyperlane之间的跨链互连合同
Moonbeam和Hyperlane之间的
跨链互连契约
为了演示互连契约的强大功能,本演示将从一个EVM测试网络发送一个字符串,并将其存储在另一个EVM测试网络中。。这个演示需要一个添加了MoonbaseAlpha网络的MetaMask帐户,你可以通过访问Moonbeam文档页面来完成。
1Hyperlane合同概述
Hyperlane是PoS链协议的代理证明,通过可配置的共识函数来验证和保护跨链通信。Hyperlane网络中的每个验证者将负责验证Hyperlane所连接的每个链。。Hyperlane协议包含可验证的欺诈证明,可通过其Watchtowers网络计算证明验证者提供的跨链消息是否有效。这些证明会根据dApp想要使用的共识函数(PoS权限证明、多重签名等)进行调整。).但是,大多数dApp会默认使用兴趣证书(PoS)。
图片来自Hyperlane
。跨链消息通过Hyperlane'发件箱和收件箱智能合同。。收件箱是接收和处理消息的智能合同。每个Hyperlane连接链都部署了多个收件箱,因为每个收件箱只连接到另一个区块链。发件箱也是一个智能契约,通过它可以将消息发送到其他链。。每个链上将只部署一个发件箱。
为了帮助管理收件箱和发件箱的智能合约,,Hyperlane有一个目前名为AbacusConectionManager的合同(Hyperlane以前名为Abacus)。此外,为了帮助管理目标链上的天然气付款Hyperlane还有另一份名为InterchainGasPaymaster的合同。
作为开发人员,您将部署与所有这些合同交互的智能合同。尽管大多数智能合约代码将被打包到父智能合约中供您使用,但您不需要';使用它时不需要查看实现细节。
2连接SimpleGeneralMessage契约
Hyperlane目前建议您使用其快速入门指南来了解他们的协议,这是了解如何发送和接收跨链消息的重要指南。本指南是使用Hyperlane示例项目开发的。这将帮助读者理解如何部署和编写跨链互连契约。
本指南不会设置整个Git库,而是使用流行的工具Remix来部署和与契约交互。了解你在做什么,请检查要部署的契约(在Githubgist中提供),也可以通过这个Remix链接访问。
这个契约的父契约是Router,是从Hyperlane包导入的。。父契约简化了与收件箱和发件箱契约交互的难度,并使编写互连契约变得更加容易。为了简单起见,本文将不涉及路由器合同,但是有两个要点可以帮助您理解整个部署步骤。
首先,请注意,智能协定开发人员可以重写_handle函数。当收件箱合约接收到指向智能合约的消息时,它将调用名为handle的外部函数。handle函数会在多次检查后调用_handle。所以_handle函数实际上是智能合约接收和响应跨链消息的地方。
其次,有一个路由注册系统,充当每个合同的白名单。。Hyperlane连接的协定不能向另一个未注册的协定发送消息(如果目标使用路由器协定)。路由器契约将有许多外部函数,这些函数将应用onlyRemoteRouter修饰符。,来调用上面的白名单系统。
在部署时,必须与路由注册系统进行交互,让互连契约知道向哪个契约发送消息。
但是在部署之前,请先检查SimpleGeneralMessage智能协定中的sendMessage函数。如果你读过我们之前介绍Axelar和LayerZero的博客,你就能猜到这个功能类似于跨链发送消息。。超级飞机';的路由契约提供了目前可能可用的最简单的版本,只需要目标链的域名(Hyperlane's版本)和开始跨链消息的有效载荷。
第一行将消息发送者和字符串消息打包成一个byte对象,这是大多数跨链通用消息传递系统用来发送和接收数据的格式。第二行将消息发送到本地链的发件箱契约。,并使用InterchainGasPaymaster支付目标链中消息的执行成本。
请注意,此消息是收费的。。由于_dispatchewithGas函数的调用包含msg.value作为其第三个参数,事务的全部值将作为Gas发送,以支付目标链上的执行成本。以及为什么需要第二次支付汽油费的原因。因为在事务执行时支付的Gas只针对源链,所以需要发送额外的值来支付目标链的执行,以完成一个完整的跨链消息。
现在您可以看到互连契约是如何接收消息的。。当收件箱合约接收到指向互连合约的消息时,它将调用合约的外部句柄函数,并传入相关数据。您的互连协定继承的路由器函数包括这个句柄函数。以及额外的幕后逻辑它调用内部的overridable_handle函数(如下所示),这将允许开发人员在接收消息时自定义他们的智能合约逻辑。在这种情况下,_handle函数做的第一件事是解码由远程契约的sendMessage函数打包的消息。接下来,要读取的结果消息存储在第二行。
代码相对简单,所以现在您将部署契约!实践是最好的学习方法。,所以请试着按照这个教程,自己在MoonbaseAlpha上部署和执行消息传递。
3通过Remix
部署在月球基地Alpha部署演示合同的最简单方法是通过重新混合。戴夫需要部署在月球基地阿尔法。如果你不';还没有开发,你可以从我们提供的水龙头。
部署脚本,可以先把合同复制粘贴到Remix里,或者直接从这个Remixgist链接打开。然后在Solidity编译器标签中编译。同时,请确保您的元掩码连接到月球基地阿尔法网络。然后,在Remix的DeployRunTransactions选项卡中,将环境设置为InjectedWeb3。。这将使用MetaMask作为Web3提供程序。
部署在每个链上,您将需要上面提到的两个契约的本地实例地址:AbacusConectionManager和InterchainGasPaymaster。此外,在接下来的步骤中,您将需要Hyperlane域名。。下表显示了所选测试网络的所有相关数据。你可以在Hyperlane上找到其他网络的终端';的文档页面。在月球基地阿尔法部署合同后,确保复制其地址,并使用连接到Hyperlane的任何其他EVM测试网络重复该过程,以便它可以跨链发送消息。
4注册远程路由
如前所述。路由器';的母智能合同带有白名单安全系统。如果你读过LayerZero的博文,你会注意到他们在设置可信远程地址时有一个类似的系统。
目前,路由协定仅允许每个链一个智能协定作为注册的远程路由,因为它假设每个链上只有一个部署相互通信。但这并不是网络本身的限制:你可以自己编写自定义的路由器智能合约。
要注册互连路由器合同,必须调用以下函数。只有契约所有者(在本例中是部署者)可以设置受信任的远程地址。_domain参数是契约应从其接收消息的链的Hyperlane域名标识符。,其中一些列在上表中(其余的在Hyperlane'的文档页面)。_router参数是您应该从中接收消息的互连协定的地址。除了地址存在于与域名标识符相同的链上。
您可能会注意到_router参数是bytes32,而不是通用地址。这是为了支持未来的非EVM连锁店。在Remix中提供输入时,需要在地址中额外填入24个零。例如如果我连接的合约地址是0xaf108ef646c8214c9DD9c13CBC5fadf964bb293,我会在Remix中输入以下内容:
。0x00000000000000000000000af108ef646c8214c9DD9c13CBC5fadf964bb293
现在我们将继续使用Remix来确保您的两个互联合同相互信任。您必须为已经部署的两个合同执行此操作。要在不同链上的合同之间切换,请通过MetaMask连接到目标网络。。确保您处于注入的提供者环境中,并且协定仍然是SimpleGeneralMessage。然后将目标合同的地址粘贴到地址输入框中。
要添加信任的远程地址。,请在SimpleGeneralMessage协定中找到enrollRemoteRouter函数并打开它。当你在阿尔法月球基地时。,将_domain设置为您选择的其他EVM测试网络的Hyperlane域名标识符(可在他们的文档或上表中找到)。将_router设置为您在其他EVM测试网络上部署的合同。,并确保它是一个格式正确的地址(用24个零填充)。之后在MetaMask进行交易和确认。
当您在备用EVM测试网络上时,,将_domain输入框设置为MoonbaseAlpha的Hyperlane域名标识符(0x6d6f2d61)。将_router输入框设置为你在MoonbaseAlpha上部署的契约。,并确保它是格式正确的地址。最后,在MetaMask中交易并确认。
在本部分教程中,您应该已经在两个链上发送了两个事务,以便在两个契约中设置一个受信任的远程地址。后来,您应该能够在互连合同之间发送事务。
5通过Hyperlane
从月球基地发送跨链消息,以自动目标链交易发送跨链消息。,必须使用Hyperlane终端消息支付额外的汽油,以抵消目标链的汽油成本。这种额外的汽油费用采取本地代币(GLMR、ETH等)的形式。)包含在事务中,并被设置为消息的值。
Hyperlane有一个易于使用的SDK来帮助估计跨链交易的汽油成本,但这超出了本博客的范围。为简单起见,最好通过跨链消息发送大量的本机令牌,比如300000000Gwei。。注意:不要在生产环境中发送如此大量的Token,这种高估Gas的方法仅用于测试网络的演示目的。在撰写本文时,Hyperlane'的气体退款功能仍在开发中,任何多余的气体将由中继器保留。
现在可以用Remix界面操作了。这个例子将发送一个跨链消息到雪崩富士测试网络,但是你可以用气体值和链名替换任何你想要的EVM网络。
接下来,检查以下内容:
Theenvironmentistheproviderofinjection-Web3(MoonbaseAlpha)[XY002][XY001]onthenetwork1287.Youhavealotofmoneyfromthefaucetinyourwallet.,支付交易费用和目标连锁气中包含的DEVn
。您在上一步中将燃气费设置为300000000Gwei,然后输入
。输入您选择的短信息("你好,来自月球基地阿尔法"在这个例子中)n
在由sendMessage调用的消息输入中。将目标链的Hyperlane域名标识符放入sendMessagen
调用的_destinationDomain输入框中完成上述步骤后,请执行交易并在MetaMask中确认。
6跟踪跨链消息
在您发送事务后,您应该能够进入MoonbaseAlphablock浏览器,并使用其事务哈希来查看事务。如果一切顺利,交易应该确认成功,当您以UTF-8格式查看时,,您将能够在底部看到交易输入的痕迹。
在一般交易中,交易状态和数据将在浏览器页面上可见。但是,因为这是跨链消息传递,所以实际上在两条链上有两个EVM事务。
如果一切顺利,交易将被批准,跨链交易成功后,您将能够看到源链中更新的lastMessage!如果没有';t自动更新,请不要';别担心。一般来说,完成交易大约需要30秒到一分钟。
如果你想查看保存在合约中的消息,可以通过Remix来实现。首先,通过MetaMask连接到目标网络。接下来,确保您处于注入的提供者环境中。并且选择的合同仍然是"SimpleGeneralMessage"。然后,获取目标合同的地址,并将其粘贴到地址输入字段中。单击后,您应该能够使用获得的合同结果查看最后一条消息。
如果你不';t查看消息的结果,Hyperlane有一个浏览器来跟踪事务,您可以使用第一个源链消息的事务哈希来跟踪跨链消息的状态。