Moonbeam与LayerZero之间的跨链互连合约

LayerZero旨在成为适用于跨链消息传递的轻量级互操作性协议。LayerZero互连合约设计的优势包含随机排序消息和可进行配置的无需信任。使用LayerZero的互连合约解决方案,开发人员可以构建能够访问波卡、以太坊、Avalanche、Swimmer等公链功能的dApp。

多链dApp目前作为跨多个不同EVM协议的整合接口。协议将能够使用LayerZero的消息传递将其合约进行跨链整合,从而实现多链部署,在原先孤立的生态系统之间实现进阶的互操作性和功能。

为展示互连合约的强大功能,此演示将会把一个字符串自一个EVM测试网发送并存储至另一个EVM测试网。该演示需要一个已添加Moonbase Alpha网络的MetaMask帐户,您可以通过访问Moonbeam文档库页面来完成此操作。

LayerZero概览

LayerZero是一种可配置信任的协议,提供安全的跨链通信功能。智能合约形式的超轻节点(ULN)将为区块链提供其他被桥接链的区块头,但仅会以效率为导向提供。LayerZero终端为包含ULN的智能合约,与预言机和中继器进行通信。

预言机组件负责提供和接收区块头。应用可以从包括Chainlink在内的预言机市场中进行选择,并将预言机组件设计成需要多个实体同意。区块头将被发布到目标链,允许对消息进行链上验证。中继器将在接收后提供跨链消息的证明,这些证明可以通过区块头进行验证,其后允许消息在目标链上完成执行。

任何人都可以维护中继器,在实际应用中,LayerZero负责管理当今应用可以使用的中继服务。在接下来的数月中,中继器的开源实现将会创建一个中继器市场,让应用可以从中选择并设计类似于预言机组件,让中继器系统更加去中心化。系统的安全性依赖于预言机和中继器系统之间的分离,因此系统的无需信任功能来自对中继器和预言机执行者的信任程度。

图片来源于LayerZero

这个简易的智能合约范例只包含一个智能合约,NonblockingLzApp。该智能合约将与LayerZero终端交互以接收和发送消息,并通过停止接收未来消息来阻止失败交易的发生。

连接SimpleGeneralMessage合约

现在我们可以用最基本的方式实践。要了解您在做什么,请查看您即将部署的合约,该合约已在GitHub gist中提供。

首先,该合约的母合约为NonblockingLzApp,它是从LayerZero GitHub库导入的。该母合约简化了使用LayerZero终端智能合约的技术细节,因此可以非常容易接收跨链消息。

请注意,NonblockingLzApp继承自LzApp。要了解两个合约之间的区别,首先要知道,如果任何连接的合约收到来自LayerZero的消息,并且在收到该消息时,发生未捕获的异常,则将无法收到来自LayerZero的其他消息。

在这种情况下,导致异常的消息通常是正在阻止接收其他消息,并且将持续阻挡消息直到该消息停止造成异常。从LzApp继承时失败的消息会被阻挡,但通过使用NonblockingLzApp,所有导致异常的消息都将会被自动捕获。

简单查看NonblockingLzApp合约是如何接收下面的消息,很明显可以看到,LzApp母合约的_blockingLzReceive函数(由blockingLzReceive调用)被覆盖了。这是当互连合约收到跨链消息时会调用的函数。此外,这个实现还有一行代码调用函数nonblockingLzReceive,以检查是否成功。

接着,您可以查看nonblockingLzReceive函数的实现。它所做的只是确保合约正在调用自身(因此是前一个函数),然后调用开发者可以覆盖的打包函数。这个函数链(blockingLzReceive、_blockingLzReceive、nonblockingLzReceive)所做的唯一一件事就是捕获每个异常并将调用转发给_nonblockingLzReceive,以便开发者可以在收到消息时根据需求编写自定义逻辑。

接着,可以查看SimpleGeneralMessage合约是如何实现_nonblockingLzReceive函数。基本上,它所做的只是获取有效负载并将其写入映射,以便稍后进行读取!

至于发送消息,在讨论如何发送消息前,请再次思考发送消息的流程。用户将向源链上的SimpleGeneralMessage发送一笔交易,然后由LayerZero的预言机和中继器接收,最后,第二笔交易则将由LayerZero的中继器发送到目标链上。

回到代码的部分,实现该操作实际上只需要两行代码。首先,合约将消息编码为字节格式,以便进行跨链发送。第二,消息将会被跨链发送到它所连接的合约。这些参数大多易于理解,而那些不是的参数则与本合约的目的无关。此处重点是目标链ID需被设置为函数输入,负载设置为消息,退款地址设置为消息发送者,目标链的Gas支付(_nativeFee)则设置为消息的值。

此处需要通过_lzSend函数支付Gas费用的原因是有两笔交易:一笔在源链上,另一笔在目标链上。源链上的交易支付方式与您通常使用的交易支付方式相同:通过继承区块链交易的交易费用。第二笔交易是通过LayerZero协议发送额外的原生Token(值)来支付的,用于弥补LayerZero中继器支付的Gas费用。

实践是最好的学习方式,因此请您尝试跟随此演示教程,自己在Moonbase Alpha上部署和执行消息传递。

通过Remix在Moonbase Alpha上进行部署

部署一个Demo合约最简单的方式是通过Remix。您将需要DEV以在Moonbase Alpoha上部署,如果您尚未拥有DEV,您可以从我们提供的Faucet获取。

如需部署脚本,首先请将合约复制并粘贴至Remix,或通过此Remix链接访问。接着在Solidity Compiler标签页面下编译合约,请同时确保您的MetaMask已连接至Moonbase Alpha网络。随后,在Remix的Deploy & Run Transactions标签中将环境设置为Injected Web3,此设置将会把MetaMask作为Web3的提供者。

对于与LayerZero核心功能交互的合约,其需要使用LayerZero终端合约。Moonbase Alpha的终端是0xb23b28012ee92E8dE39DEb57Af31722223034747,您可以在LayerZero的文档页面上找到其他网络的终端。在您将合约部署到Moonbase Alpha时,可以在构造函数中使用此合约地址。

当您在Moonbase Alpha上成功部署合约后,请确保复制其地址并使用连接到LayerZero的任何EVM测试网重复该流程,以确保它可以跨链发送消息。

添加可信任源

由于手上的智能合约继承自LzApp母智能合约,因此其自带可信任的合约安全系统。为了让智能合约在收到消息时调用_nonblockingReceive,消息必须来自可信任源。

要将合约添加为可信任远程合约,您必须调用setTrustedRemote函数。只有合约拥有者(一般情况下默认为部署者)才能设置信任的远程地址。_srcChainId是源链的LayerZero链ID,您可以在他们的文档页面和以上表格中找到。_path是字节串格式的信任地址。

LzApp在trustedRemoteLookup映射中储存来自每个链的单个可信源。然而,它的存储方式相较于简单的地址更为复杂。该格式需要将两个地址打包成字节串格式:第一个是消息源,最后一个是消息目的地。虽然这种方式看上去比较奇怪,但在遭遇检查未经授权消息的情况时,它使LzApp更容易被实现。

举例来说,如果你想从lzID为100的链上合约0xAAAAAAAAAAAAAAAAAAAA向lzID为101的链上合约0xBBBBBBBBBBBBBBBBBBBB发送消息,您会将格式化后一条链上的可信任远程调用:

setTrustedRemote(101, 0xBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAA)

但是,还有一种更简单的方法可以做到这一点。LayerZero在其实现中提供了一个setTrustedRemoteAddress函数来帮助格式化消息。您仅需要输入LayerZero的链ID(_remoteChainId)和您希望合约在目标/远程链上信任的地址(_remoteAddress)。

现在您可以使用Remix来确保你的两个合约相互信任,您必须对已部署的两个合约执行此操作。要在不同链上的合约之间切换,请通过MetaMask连接到您想要的网络。同时,确保您处于Injected Provider环境中并且合约保持为“SimpleGeneralMessage”。接着,获取目标合约的地址,并将其贴至At Address输入栏中。

要添加受信任的远程地址,请在SimpleGeneralMessage合约中找到setTrustedRemoteAddress函数并将其打开。

当您在Moonbase Alpha上时,将_remoteChainId设置为您选择的另一个EVM测试网的LayerZero链ID(LayerZero链ID可以在他们的文档页面或上方表格中找到)。其后,将_remoteAddress设置为您在另一个EVM测试网上部署的合约的地址。最后,在MetaMask中进行交易和确认。

当您在备用EVM测试网上时,将_remoteChainId设置为Moonbase Alpha的LayerZero链ID(10126)。并将_remoteAddress设置为您在Moonbase Alpha上部署的合约的地址。最后,在MetaMask中进行交易和确认。

在本部分教程中,您应该已经在两条链上发送了两笔交易,以在两个合约中设置可信任的远程地址。未来,您应当可以在关联合约之间发送交易。

通过LayerZero从Moonbase传送跨链消息

要发送带有自动目标链交易的跨链消息,您必须使用LayerZero终端消息支付额外的Gas以抵消目标链的Gas成本。这种额外的Gas支付以您包含在交易中的原生Token(GLMR、ETH等)形式出现,并被设置为消息的值。

在此教程中,估算跨链交易Gas费用的方法超出了主题范围。为了简单起见,在测试网上,最好使用跨链消息发送一笔大数额的原生Token,例如500000000 Gwei。如果有剩余金额,若花费不大则可以进行退还。

现在您可以使用Remix接口操作。此范例将向Fantom测试网发送跨链消息,但您可以用Gas数值和链名称替换您想要的任何EVM网络。

接着,检查以下事项:

  • 环境为Injected Provider – Web3 on network 1287(Moonbase Alpha)同时,您的钱包里有来自faucet的大量资金,以支付交易成本和目标链Gas 包含的DEV

  • 您在上一步中将Gas费用设置为500000000 Gwei后输入

  • 在sendMessage调用的消息输入中输入您选择的短消息(在本例中为“gm”)

  • 将目标链的LayerZero ID放入sendMessage调用的destChainId输入栏中。由于您是在测试网上发送交易,因此ID应该在10000以上

当您完成上述步骤,请执行交易并在MetaMask中确认。

追踪跨链消息

在您发送交易后,您应该能够进入Moonbase Alpha区块浏览器使用其交易哈希查看交易。如果一切顺利,交易应当能够被成功确认,而当您以UTF-8格式查看时,您将能够在最底部看到交易输入的痕迹。

 在一般的交易中,交易的状态和数据将可在一个浏览器的页面上看到。但是,由于这是跨链消息传递,因此实际上在两条链上发生了两笔EVM交易。

如果一切顺利,交易将被批准,您将能够看到跨链交易成功后在源链中更新的lastMessage!如果它没有自动更新,请不要担心。一般来说,交易完成大约需要30秒到一分钟的时间。

如果您想查看储存在合约中的消息,您可以通过Remix操作。首先,通过MetaMask连接到目标网络。接着,确保您处于Injected Provider环境中,并且选择的合约仍然是“SimpleGeneralMessage”。然后,获取目标合约的地址,并将其粘贴到At Address输入栏中。点击后,您应该可以使用获得的合约结果查看最后一条消息。

如果您没有看到消息的结果,LayerZero有一个浏览器来追踪交易,您可以使用第一个源链消息的交易哈希来追踪跨链消息的状态。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值