本文不是指南,只是个人学习记录,仅供参考。
首先,我们需要去安装他说的模板,这一步已经难倒了90%的外行人。
安装模板
外行人:
按照上图操作下载ZIP包,然后解压进入。
内行人:
找个地方(放项目),执行下面命令。
1 | git clone https://github.com/zeta-chain/template.git |
安装Yarn
关于Node.js的安装,可以查看我的这篇文章Windows安装Node.js。
yarn是一个包管理工具,类似于npm,但是比npm更加强大,可以并行下载依赖包。
1 | npm install -g yarn |
我们在项目文件下启动终端,来执行以下命令:
1 | yarn |
该命令默认安装依赖模块。(你无需理会专业术语)
更多Yarn相关请查看:Yarn安装与使用详细介绍
创建账号
我们根据github的文档来操作,创建账号使用的命令是:
1 | npx hardhat account --save |
该操作会生成测试账号,并且将私钥保存在名为.env的文件中。
从上图可以看到,他直接在控制台输出了钱包的私钥地址等信息,建议手动保存一份。
查询余额
我们根据文档来操作,执行下面的命令:
1 | npx hardhat balances |
这可能有点慢,但是他还给你画了一个表,的确不错。
如果想查询不同的地址,可以使用address命令,操作如下:
1 | npx hardhat balances --address ADDRESS |
自己把地址替换一下就好了。
领取水龙头
根据文档操作,获取水龙头代币。
1 | npx hardhat faucet |
我遇到了错误:
暂时还不知道是哪里出问题了,我们尝试其他的命令。
请求将代币发送到不同的链,比如goerli testnet:
1 | npx hardhat faucet --chain goerli_testnet |
还是遇到了同样的错误,就不截屏了。
以下内容为后续补充:(2023年11月21日)
1
2 npm install -g @zetachain/faucet-cli
zetafaucet --drip --address 0x4bB9089ee3B86e97b171838205483362966f9dE8需要验证Github账号,如何申请之前有写过教程,不再赘述。
发送代币
直接跳过了一些部分,来到了我感兴趣的地方,也是我本次学习的目的。
首先,我用其他账号再Goerli链上给他发送了,0.05GETH 和 2 ZETA。
前者拿来当手续费,后者来测试跨链,想看看是如何操作的,毕竟什么获取水龙头失败了。
所以,ZETA是从uniswap里面兑换的,合约如下:
1 | 0x0000c304D2934c00Db1d51995b9f6996AffD17c0 |
我们的测试账号也的确拥有了测试代币。
我们开始下一步,看看文档怎么说,从Goerli转移ZETA到ZetaChain链上,使用下面的代码:
1 | npx hardhat send-zeta --amount 1 --network goerli_testnet --destination zeta_testnet |
操作截图如下所示:
他一会儿就给出了成功的哈希值,我们去链上看看他做了什么。
然后看看具体使用了什么方法和参数:
方法叫:approve
有两个参数分别是地址、代币数量
如果使用的是etherscan是可以解析数据的,如上图所示,但是我还是不理解这个地址。
然后我又去搜索了一下,发现这是一个合约地址。
最后,我需要去看看,有没有在ZetaChain链收到代币。
我们再次使用查询命令,当然你也可以去ZetaScan上面查询:
https://explorer.zetachain.com/
发送代币2
这次我们从mumbai上面发送到ZetaChain链上。
关于ZETA在不同链的代币合约:ZETA Testnet Token
这次我发送了0.1wMATIC 和 139ZETA到测试用户mumbai链上。
文档说明没有给案例,但是无非是修改一个单词而已,把Goerli改成mumbai,所以命令如下:
1 | npx hardhat send-zeta --amount 139 --network mumbai_testnet --destination zeta_testnet |
刚开始我遇到了一个错误,如下图所示:
然后我查询了一下余额:
随后有再次尝试,结果成功了。
所以,我现在还不知道为什么会出错,就莫名其妙成功了。
这种行为表现在链上就是:
肯定是Send这一条成功了,最开始调用Approve却是失败了。
最后,我们这次去ZetaScan去查看:
跨链返回
我们尝试将代币从ZETA跨链回来,我们就选择跨会Goerli吧。
1 | npx hardhat send-zeta --amount 2 --network zeta_testnet --destination goerli_testnet |
其实就是把两个单词的位置调头了而已,如此简洁优雅。
不出意外的话,出意外了。
我不小心复制错了,将Goerli上面最后1个ZETA也跨过去了。
还好问题不大,我们跨回来就是的。
所以,我选择了一次性跨2个ZETA回来,但是结果如下:
这是变成了包裹代币吗???
在官方的文档中,我们找到了这样一句话:
send-zeta
将本机 ZETA 发送到 ZetaChain 上的包装 ZETA 合约,批准连接器合约使用包装的 ZETA ,然后最终调用连接器的send
方法将包装的 ZETA 发送到连接的链。
ZRC20
你可以理解为ERC20的扩展,将各种链上的主流资产全部当成ZRC20代币,比如GETH、tBNB等。
我们尝试将GETH充值到ZetaChain链上当ZRC20资产:
1 | npx hardhat send-zrc20 --amount 0.01 --network goerli_testnet --destination zeta_testnet |
无非就是将 send-zeta 换成了 send-zrc20 仅此而已,所以说这语法看着很舒服。
我们成功的发送了0.01GETH到ZetaChain上,但是在这个命令行里面看不到代币。
我们得去ZetaSan浏览器里面看:
虚线部分为补充内容。
过了一段时间,他上面才会显示出代币,例如这样:
我们尝试将代币全部跨回去:
1 | npx hardhat send-zrc20 --amount 0.01 --network zeta_testnet --destination goerli_testnet |
又调转单词位置,优雅。
同样的,在跨回去的过程中,又遇到问题了。
An unexpected error occurred:
Error: cannot estimate gas; transaction may fail or may require manual gas limit
第二天,我想明白了,这不就是没有GAS费吗?
因为我们需要发送回去,所以在Goerli链上交易的GAS费也要我们承担,也就是说0.01Geth ZRC20代币是不可能全部跨回去的,我开始忘记了这一点。
所以,这次我跨链0.009个回去就成功了。
我就说嘛,输出信息如下:
Transaction hash: 0x52dd9f6ce29a23a6bcc6e9848078a190d51837fd92fd368f689d59f023392570
跨链取回ZRC20代币成功!
全链合约Hello
根据github文档操作,现在创建一个新的全链合约:
创建合约:
1 | npx hardhat omnichain MyContract |
创建完成后,会多出来一个文件夹和SOL合约文件:
好了,现在我们看具体教程:
编译合约:
1 | npx hardhat compile --force |
部署合约:
1 | npx hardhat deploy --network zeta_testnet |
合约部署成功,显示信息摘录:
Successfully deployed contract on ZetaChain.
Contract address: 0xBbbbc34C0Ee6b48332EBfC6367B8c1d3D8FA17cb
Explorer: https://athens3.explorer.zetachain.com/address/0xBbbbc34C0Ee6b48332EBfC6367B8c1d3D8FA17cb
调试合约:
1 | npx hardhat interact --contract 0xBbbbc34C0Ee6b48332EBfC6367B8c1d3D8FA17cb --amount 0.005 --network goerli_testnet |
将上面的合同地址替换成你刚才部署的,修改要发送的GETH代币数量,我改成了0.005更具有辨别度。
他显示我是成功了的。
Successfully broadcasted a token transfer transaction on goerli_testnet network.
Transaction hash: 0xb6bdcc893769fa90a1b7d5f481c594b1699e997502f9212569530cae3d416e51
我不确定,所以去浏览器看看。
在Goerli链上确实有这笔操作:
但是ZetaScan上面没有,我又去看了看,这个教程作者的那笔交易。
发现他Goerli上面的时间是:Aug-01-2023 08:56:00 AM +UTC
然后Zeta的确定时间是:August 1st 2023, 4:57:28 PM
相隔接近8个小时,所以现在一时半会看不到估计也是正常的。
全链合约swap
我以为完了,结果才是第一部分。
我们就跳过抵押部分,直接来swap吧。
创建新合约:
1 | npx hardhat omnichain Swap |
我们将合约修改一下,直接拷贝下面的文件,内容太长请自行访问:
https://github.com/zeta-chain/example-contracts/blob/main/omnichain/swap/contracts/Swap.sol
然后再修改一下 tasks/interact.ts 文件,也去复制。
这一复制过来全红。
我准备删除文件,看到这个你就知道不小心删除文件有多痛苦了。(我忘记了我还有git)
我决定了,重新建合约不再听他鬼话,先不修改部署一下。
把.env文件复制到新项目中去,还是使用刚才的账号哦。
部署合约:
1 | npx hardhat deploy --network zeta_testnet |
等等还是报错,我找下原因。
他说找不到合约swap这个文件???怎么可能呢?
我想想看,哪里出问题了。
EVM定律:先编译,后运行。
艹,没编译,我看着教程来,估计教程作者忘记写了,这……
果然如此,经验主义害死人。
控制台输出合约相关信息:
Successfully deployed contract on ZetaChain.
Contract address: 0x62D3aFd4E8A7D0b77983a13e11BF7F329730eA34
Explorer: https://athens3.explorer.zetachain.com/address/0x62D3aFd4E8A7D0b77983a13e11BF7F329730eA34
调用合约:
我们来尝试调用他,发送0.01个GETH兑换到MATIC链。
请自行修改相关信息,如合约地址,发送的代币数量,跨链的来源和去处。
1 | npx hardhat interact --contract 0x62D3aFd4E8A7D0b77983a13e11BF7F329730eA34 --amount 0.01 --network goerli_testnet --recipient 0x4C521B3b696Dfa7e7c96391d4c820f7A4524A681 --destination mumbai_testnet |
奶奶的,该作者又复制错指令了,npx少了一个n,我是说怎么看着奇奇怪怪的。
我上面已经修改好语句了,这不是误人子弟吗?
你可以使用cctx的指令来跟踪你的跨链交易信息:
1 | npx hardhat cctx 0xb2f6273f2b7f8c46702e3c13dffc3c597289325621f0183b417f7dc4538d60f0 |
上面的这个指令都成功了。
我们去链上查询一下:
首先是Goerli链,的确有扣币的交易:
然后,Mumbai上面有收到打过来的币:
从时间上面来看,这笔跨链交易花了6分钟,在10分钟以内还是比较快的。
交易ZETA->MATIC:
我们尝试一下其他的,比如zeta兑换mumbai:
1 | npx hardhat interact --contract 0x62D3aFd4E8A7D0b77983a13e11BF7F329730eA34 --amount 1 --network zeta_testnet --recipient 0x4C521B3b696Dfa7e7c96391d4c820f7A4524A681 --destination mumbai_testnet |
控制台输出信息如下:
Successfully broadcasted a token transfer transaction on zeta_testnet network.
Transaction hash: 0x7083e512a857726d0b2b33c2a6fe49338cc322c260d9d9134bbcd98e70da7dee
我们跟踪一下:
1 | npx hardhat cctx 0x7083e512a857726d0b2b33c2a6fe49338cc322c260d9d9134bbcd98e70da7dee |
我看估计得等到明天才有结果。
交易ZETA->BNB:
趁早无聊,干脆尝试一下从ZetaChain到Bsc Testnet,毕竟文档上没有说这个。
而且生成的默认钱包也不显示bsc testnet,但是我还是想试试看。
1 | npx hardhat interact --contract 0x62D3aFd4E8A7D0b77983a13e11BF7F329730eA34 --amount 1 --network zeta_testnet --recipient 0x4C521B3b696Dfa7e7c96391d4c820f7A4524A681 --destination bsc_testnet |
我又震惊了,成功了???
1 | npx hardhat cctx 0x70c5766db9b9c31d7c762c97706b1f259f8bf4fb0f78bcd4f6a426d96a8506d1 |
还是把跟踪指令也复制一遍,估计又是跨链好长时间的那种。
第二天,还是未跨链成功……
交易MATIC->ZETA
我准备将mumbai上面的MTAIC交换为ZetaChain上面的ZETA,我想试试看这种交易能不能成功。
1 | npx hardhat interact --contract 0x62D3aFd4E8A7D0b77983a13e11BF7F329730eA34 --amount 0.01 --network mumbai_testnet --recipient 0x4C521B3b696Dfa7e7c96391d4c820f7A4524A681 --destination zeta_testnet |
理论上这个语法是没有毛病可以执行的。
控制台输出信息如下:
Successfully broadcasted a token transfer transaction on mumbai_testnet network.
Transaction hash: ex7e63494da6680882bf7d895ebec2ca00b3da11d4fe238dd24d4ce1887f8aaa97
我们跟踪一下:
1 | npx hardhat cctx ex7e63494da6680882bf7d895ebec2ca00b3da11d4fe238dd24d4ce1887f8aaa97 |
我就不该有期望这能成功的,估计和上面两个一样,这个合约只能跨链交易原生代币。
应该不包括ZETA,这沾边的都在漫长的等待。