Moonbeam与Wormhole的Relayer Engine之间的跨链互连合约

本文介绍如何利用Wormhole协议实现跨链消息传递,包括设置中继器、守护者网络间谍及通过Remix在MoonbaseAlpha上部署合约等步骤。文中详细解释了Wormhole的工作原理及其在Moonbeam互操作性生态中的角色。

如果您不了解Moonbeam,用一句话简单概括来说Moonbeam是跨链通信的中心枢纽。像AxelarLayerZeroHyperlane等的协议允许不同EVM上的智能合约互相通信,为Web3 dApp解锁功能方面前所未见的规模。但就目前来说,上述的几个协议的智能合约通信仅限于EVM链。这就是为什么Wormhole与像Solana、NEAR、以及Algorand的非EVM链通信的能力在Moonbeam的互能合约世界中备受关注。

大多数多链dApp目前作为跨多个不同EVM协议的整合接口。使用Wormhole的VAA(Verifiable Action Approval)消息传递系统,dApp能够实现多链部署,在原先孤立的生态系统之间实现进阶的互操作性和功能。

Wormhole与其他Moonbeam涵盖的跨链协议相当不同,所以即便您已熟悉其他跨链协议,您仍需注意以下操作步骤。作为示范,您将完成一个Demo演示,其将通过Wormhole将字符串从一个测试网发到另一个上。该项目需要您安装Docker以运行一个叫中继器的组件。如果您还未设置MetaMask,您可以在文档网站添加Moonbase Alpha网络。

Wormhole概览

Wormhole是一个多签解决方案协议,通过VAA验证并保护跨链通信。VAA(Verifiable Action Approval)是Wormhole的跨链消息传递格式。简单地说,Wormhole的协议有19个守护者(又称节点/验证者),他们收取并验证跨链消息。如果这19个守护者中的13个验证了某条消息,该消息就会被批准并可在其他链上收到。

与守护者网络(其以Wormhole协议的验证人身份运作)相邻的是网络间谍。他们不进行任何验证工作,只负责机密性的间谍监测行动。他们会监视守护者网络并作为一个页面以允许用户和应用查看哪些VAA已获得批准。

正如其他Moonbeam涵盖的跨链协议,当消息被验证后,称为中继器的链下参与者可以将数据以无信任方式发送至其他区块链。但不同于其他Moonbeam涵盖的跨链协议,Wormhole目前没有一个完成的通用中继器。

中继器的职责是为目标链的执行支付费用,且在许多通用中继器中,中继器又是由用户支付费用。Wormhole目前还没有该功能,所以Wormhole的架构需要dApp开发者创建并维护其自己的专用中继器。一个开发者如果想要合约调用者为目标链上支付gas费用的,则需要设计自己的系统。这可能看起来工作量很大,但这允许对消息处理的方式进行微调。举例而言,一个中继器可以同时发送相同的消息至多条链。

图片来源于Wormhole

要发送跨链消息,你将需要使用一个智能合约。每条连接至Wormhole的链都会有某种Wormhole核心桥接的实现,其功能为发布和验证VAA。每一个核心桥接合约(每条链一个)的实现均由守护者网络上的守护者监视,这便是他们得知何时开始验证一条消息的方式。

作为一名开发人员,您将通过发送和验证VAA直接与核心Wormhole智能合约交互。您还需要运行一个非验证间谍节点和一个专用中继器。本文会将会手把手教你如何进行操作。

连接SimpleGeneralMessage合约

不同于其他跨链合约,Wormhole并不提供用户可以继承并在其上构建的母合约。这是因为Wormhole的第一条链Solana,不像Solidity一样在其智能合约中提供特有的继承。为了让每条链上的设计体验相似,Wormhole让他们的Solidity开发者直接与EVM链上的Wormhole核心桥接智能合约交互。

本文中要部署的智能合约储存在一个由Wormhole的Relayer Engine存储库分叉出来的Git存储库中。您将通过Remix部署合约,且该合约可自动通过此Remix链接访问。

首先,该智能合约中的代码是基于Wormhole的最佳开发文档,但某些方面(如安全性)已被简化。当您编写用于生产环境的智能合约时,请检查文档以更好地了解其标准。请注意,以下智能合约不能用于生产环境。本教程中的操作仅作演示用途,以便更好地了解系统运作原理。

发送VAA

在源文件或是下方图片中查看智能合约的消息发送部分。面向外部的函数包括了三个参数:消息字符串、目标地址以及目标链ID。区块链映射的destChainId值可在Wormhole文档中找到。

请注意目标地址是地址类型而不是bytes32类型。这很重要,因为像NEAR、Algorand和Solana这些链用的是bytes32地址(该地址空间更大)。SimpleGeneralMessage智能合约使用地址类型是因为之前的博客中也使用该类型地址,但若你要构建自己的dApp,我们建议用bytes32 address输入,从而能够与非EVM区块链进行通信。

函数本身有两行。第一行调用一个将于Wormhole核心桥接交互的私密函数。该功能从sendMessage函数独立出来是因为Wormhole有一个从所有消息发布函数返回一个序列值的设定。该序列值代表一个Wormhole消息被从一个智能合约发送的次数。例如,发送第一条消息会返回0,第二条则会返回1等等。该值对于按顺序接收消息非常有用,本文将不展开描述。

第二行增加全局nonce值(该数值只使用一次)。Nonce可以被再次使用以批处理VAA。在这个情况下,每条消息会有一个唯一的nonce值以确保该nonce实际上是一个nonce。虽然可以将所有消息的nonce都保留为0,系统仍可以运行。

继续深入消息发送的解析,sendMessage和_sendMessageToRecipient调用的私有函数将在下方提及。第一行代码将数据编码为字节负载。这将收件人地址、消息应发送至的chainId、消息发送者以及消息本身进行编码。解析该信息对于中继器和目标互连合约都很重要。

第二行代码与Wormhole核心桥接合约交互以发布消息。请注意输入内容包括一个nonce、负载以及一致性级别值。该nonce值从sendMessage注入且对该情况无任何作用。负载是在前一行代码中编码的内容。一致性级别控制从交易最初发生以来,守护者网络在消息开始验证过程之前应等待的区块数量。出于安全原因,这可能会有所帮助,因为某些区块的最终确定性比其他区块(如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值