在本教程中,我们将在WAGMI和Fuji之间架起一座桥梁。这座桥将帮助我们将包裹在wWGM中的原生WGM通证从 WAGMI 链来回转移到 Fuji 链。使用本指南,您可以在任何基于 EVM 的链之间为任何 ERC20 通证部署一座桥梁。
用熟悉的语言学习 以太坊Web3 DApp开发 : Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart
原生通证的包装版本是其挂钩的 ERC20 表示。用 ERC20 标准包装它可以使委托交易等某些流程更加容易。你可以通过将原生通证发送到打包的通证合约地址来轻松获得打包的ERC20通证。
WAGMI 是一个基于 EVM 的独立测试链,部署在 Avalanche 网络的自定义子网上。
我们将使用Chainsafe的网桥存储库,轻松建立一个强大且安全的EVM跨链网桥。
WAGMI 和 Fuji 链默认不互连,但是我们可以让它们通信。中继器监视一条链上的事件(通过轮询块),并使用另一条链上的这些事件执行必要的操作。这样,我们还可以通过使用智能合约将通证从一条链桥接到另一条链。
下面是跨链桥接的工作流程描述 -
将通证从源链桥接到目标链涉及锁定和铸币方法。而将通证从目标链连接到源链涉及销毁和释放方法。我们不能铸造和燃烧我们无法控制的通证。因此,需要将它们锁定在源链上的通证保险箱中。并在目标链上生成相应的通证(我们将部署并因此控制它)。

下面列出跟进本教程的要求 -
让我们创建一个新目录deploy-bridge,我们将在其中保存桥代码。我们将使用以下存储库 -
使用以下命令,我们可以克隆和安装 Chainbridge 的命令行工具。这将有助于我们建立桥接合约并展示跨链转移。部署桥接合约后,你可以使用其 ABI 和合约地址来设置你的 UI。
git clone -b v1.0.0 --depth 1 https://github.com/ChainSafe/chainbridge-deploy \
&& cd chainbridge-deploy/cb-sol-cli \
&& npm install \
&& make install
这将构建合约并安装cb-sol-cli命令。
让我们设置环境变量,这样我们就不需要在每次发出命令时都写入它们的值。移回deploy-bridge目录(主项目目录)并创建一个新文件configVars。将以下内容放入其中 -
SRC_GATEWAY=https://subnets.avax.network/wagmi/wagmi-chain-testnet/rpc
DST_GATEWAY=https://api.avax-test.network/ext/bc/C/rpc
SRC_ADDR="<Your address on WAGMI>"
SRC_PK="<your private key on WAGMI>"
DST_ADDR="<Your address on Fuji>"
DST_PK="<your private key on Fuji>"
SRC_TOKEN="0x3Ee7094DADda15810F191DD6AcF7E4FFa37571e4"
RESOURCE_ID="0x00"
source ./configVars
我们需要如下设置源链 -
命令行工具cb-sol-cli将帮助我们部署合约。在加载配置变量的终端会话中运行以下命令。它将添加SRC_ADDR为默认中继器,用于将事件从 Wagmi 链(源)中继到 Fuji 链(目标)。
部署桥接合约时要注意的最重要参数之一是expiry值。这是一个提议被认为被取消的块数。默认情况下,它设置为100。在 Avalanche 主网上,使用此值,提案可能会在 3-4 分钟内过期。你应该根据要部署桥接的链选择一个非常大的到期值。否则,如果没有按时收到限制数量的提案,你的提案将被取消。
你还应该记住这一点,有时在高网络活动期间,交易可能会卡住很长时间。提案交易卡在这种情况下,可能会导致之前的提案被取消。因此,到期值应该足够大,中继者应该以具有竞争力的最大 gas 价格发布交易。
cb-sol-cli --url $SRC_GATEWAY --privateKey $SRC_PK --gasPrice 25000000000 deploy \
--bridge --erc20Handler \
--relayers $SRC_ADDR \
--relayerThreshold 1 \
--expiry 500 \
--chainId 0
输出将返回已部署合约的(桥接和处理程序)地址。更新configVars文件,添加以下 2 个变量并将它们加载到环境中:
SRC_BRIDGE="<resulting bridge contract address>"
SRC_HANDLER="<resulting erc20 handler contract address>"
确保使用source命令加载这些环境变量。
运行以下命令将wWGM通证注册为源桥上的资源。
cb-sol-cli --url $SRC_GATEWAY --privateKey $SRC_PK --gasPrice 25000000000 bridge register-resource \
--bridge $SRC_BRIDGE \
--handler $SRC_HANDLER \
--resourceId $RESOURCE_ID \
--targetContract $SRC_TOKEN
我们需要按如下方式设置目标链 -
运行以下命令,在 Fuji 链上部署 Bridge、ERC20 Handler 和wWGM合约。它将再次设置DST_ADDR为将事件从 Fuji 链(目标)中继到Wagmi 链(源)的默认中继器。对于此示例,两者SRC_ADDR和DST_ADDR代表相同的事物。
cb-sol-cli --url $DST_GATEWAY --privateKey $DST_PK --gasPrice 25000000000 deploy\
--bridge --erc20 --erc20Handler \
--relayers $DST_ADDR \
--relayerThreshold 1 \
--chainId 1
使用你将通过运行上述命令获得的详细信息更新环境变量。不要忘记加载这些变量。
DST_BRIDGE="<resulting bridge contract address>"
DST_HANDLER="<resulting erc20 handler contract address>"
DST_TOKEN="<resulting erc20 token address>"
运行以下命令将wWGM注册为网桥上的资源。
cb-sol-cli --url $DST_GATEWAY --privateKey $DST_PK --gasPrice 25000000000 bridge register-resource \
--bridge $DST_BRIDGE \
--handler $DST_HANDLER \
--resourceId $RESOURCE_ID \
--targetContract $DST_TOKEN
当收到通证存款时,桥有两种选择 -
我们不能铸造或燃烧任何我们无法控制的通证。虽然我们可以通过将它们放入通证保险箱来锁定和释放这些通证。桥必须知道它可以烧掉哪个通证。使用以下命令,我们可以将资源设置为可烧录。网桥将根据通证是否可烧来相应地选择操作。
cb-sol-cli --url $DST_GATEWAY --privateKey $DST_PK --gasPrice 25000000000 bridge set-burn \
--bridge $DST_BRIDGE \
--handler $DST_HANDLER \
--tokenContract $DST_TOKEN
现在让我们允许处理程序在目标链上铸造已部署的 ERC20 (wWGM) 通证。运行以下命令。
cb-sol-cli --url $DST_GATEWAY --privateKey $DST_PK --gasPrice 25000000000 erc20 add-minter \
--minter $DST_HANDLER \
--erc20Address $DST_TOKEN
合约的部署者(此处SRC_ADDR或DST_ADDR)拥有管理员权限。管理员可以添加或删除新的中继者、铸币者、管理员等。 它还可以在目标链上铸币新的 ERC20 通证。你可以使用这些文件cb-sol-cli中提到的选项发出这些命令。除非需要一些干预, 否则当中继者未能按时在目标链上铸造代币时,不应手动使用铸币命令。
部署网桥、处理程序、通证等所有链上设置都已完成。但这两条链并不相互连接。我们需要一些链下中继器来在链之间传递消息。中继者将对一条链上的存款事件进行投票,并提交投票提案以在另一条链上铸造或释放相应的通证。
由于我们将中继器阈值设置为 1,因此在部署网桥和处理程序时,我们只需要来自 1 个中继器的投票提案。但在生产中,我们应该使用大量阈值较高的中继器,以避免权力集中。
为此,我们将使用 Chainsafe 的中继器。按照下面描述的步骤部署中继器。
打开一个新的终端会话,同时保持前一个会话加载环境变量。我们也必须在这个会话中加载环境变量。source也可以使用命令在此会话中加载这些变量。
现在,移动到该deploy-bridge目录并运行以下命令来克隆中继器 repo(在 Go 中实现),并构建其二进制文件。
git clone -b v1.1.1 --depth 1 https://github.com/ChainSafe/chainbridge \
&& cd chainbridge \
&& make build
这将在chainbridge/build目录中创建一个二进制文件chainbridge.
中继器需要一些配置,如源链、目标链、网桥、处理程序地址等。运行以下命令。它将制作一个config.json包含所需详细信息的文件。你可以根据需要更新这些详细信息。
echo "{
\"chains\": [
{
\"name\": \"WAGMI\",
\"type\": \"ethereum\",
\"id\": \"0\",
\"endpoint\": \"$SRC_GATEWAY\",
\"from\": \"$SRC_ADDR\",
\"opts\": {
\"bridge\": \"$SRC_BRIDGE\",
\"erc20Handler\": \"$SRC_HANDLER\",
\"genericHandler\": \"$SRC_HANDLER\",
\"gasLimit\": \"1000000\",
\"maxGasPrice\": \"50000000000\",
\"http\": \"true\",
\"blockConfirmations\":\"0\"
}
},
{
\"name\": \"Fuji\",
\"type\": \"ethereum\",
\"id\": \"1\",
\"endpoint\": \"$DST_GATEWAY\",
\"from\": \"$DST_ADDR\",
\"opts\": {
\"bridge\": \"$DST_BRIDGE\",
\"erc20Handler\": \"$DST_HANDLER\",
\"genericHandler\": \"$DST_HANDLER\",
\"gasLimit\": \"1000000\",
\"maxGasPrice\": \"50000000000\",
\"http\": \"true\",
\"blockConfirmations\":\"0\"
}
}
]
}" >> config.json
检查并确认config.json文件中的详细信息。
在上面的命令中,可以看到blockConfirmations设置为0. 这对于像 Avalanche 这样的网络非常有效,因为一旦提交,区块就会得到确认。
不像其他链,比如以太坊,需要 20-30 个区块确认。因此,请谨慎使用此配置,具体取决于你使用的链类型。如果基于未确认的区块铸造或释放相应的通证,可能会导致严重问题。
让中继器访问你的密钥。使用这些密钥,中继者将提议存款事件并执行提议。它将要求设置密码以加密这些密钥。每次启动中继器时,它都会要求输入此密码。
./build/chainbridge accounts import --privateKey $SRC_PK
./build/chainbridge accounts import --privateKey $DST_PK
设置现已完成 - 链上和链下。现在我们只需要启动中继器并测试网桥。出于测试目的,我们将用于cb-sol-cli在桥上进行存款交易。但是你可以制作前端并使用 ABI 将其与网桥集成。
运行以下命令启动中继器。它将打印与我们的网桥相关的所有事件的日志,这些事件发生在两条链上。所以保持中继器运行并在另一个终端会话中执行下一个命令。
./build/chainbridge --config config.json --verbosity trace --latest
现在,让我们在 WAGMI 桥上存入通证。但在此之前,我们需要批准处理程序代表我们(此处)使用(锁定或销毁)通证SRC_PK。此处的金额以 Wei 为单位(1 以太 (WGM) = 10^18 Wei)。我们将批准 0.1 wWGM。
cb-sol-cli --url $SRC_GATEWAY --privateKey $SRC_PK --gasPrice 25000000000 erc20 approve \
--amount 100000000000000000 \
--erc20Address $SRC_TOKEN \
--recipient $SRC_HANDLER
一旦获得批准,我们就可以发送存款交易。现在让我们在桥上存入 0.1 wWGM。处理程序将从我们的地址(此处SRC_PK)锁定(转移到
通证保险箱)0.1 wWGM,并将目标链上的新通证铸造给接收者(此处DST_ADDR)。
cb-sol-cli --url $SRC_GATEWAY --privateKey $SRC_PK --gasPrice 25000000000 erc20 deposit \
--amount 100000000000000000 \
--dest 1 \
--bridge $SRC_BRIDGE \
--recipient $DST_ADDR \
--resourceId $RESOURCE_ID
该交易会将 0.1 wWGM 转移到通证保险箱并发出一个Deposit事件,该事件将被中继器捕获。在此事件之后,它将向目标链发送投票提案。由于阈值为 1,桥将执行提案,并将新的 wWGM 铸造到收件人的地址。这是中继器输出的屏幕截图。

同样,我们可以将代币转回 WAGMI 链。
与上述过程类似,你可以在任意 2 个基于 EVM 的链之间部署一座桥。我们使用命令行工具进行审批和存款。这可以进一步扩展以构建
与桥集成的前端。目前,它依赖于单个中继器,这是不安全的。我们需要大量的中继器和高门槛来避免任何形式的中心化。
可以通过阅读 ChainSafe 的Chainbridge文档来了解有关这些合约和实现的更多信息。
原文链接:Deploying Cross-Chain EVM <-> EVM Bridge
汇智网翻译整理,转载请标明出处