为了使用在 Layer1 和 Layer2 之间移动的 SUDT 通证,您需要部署 ERC20 代理合约来与它们交互。这个特殊的 solidity 智能合约是由 Nervos 团队准备的,允许 EVM 与 Nervos 上的 SUDT 通证交互。
为了使用在 Layer1 和 Layer2 之间移动的 SUDT 通证,您需要部署 ERC20 代理合约来与它们交互。这个特殊的 solidity 智能合约是由 Nervos 团队准备的,允许 EVM 与 Nervos 上的 SUDT 通证交互。
ERC20 代理合约是修改后的 ERC20 solidity 合约,其中 token balance 和 transfer 的函数已被修改,好让他能直接与 Polyjuice EVM 兼容层交互。这允许以太坊智能合约使用 ERC20 接口在 Layer2 使用 SUDT 通证。
注意:在开始任务之前,建议您检查任务提交部分,这样您就知道您需要提供哪些材料,以审查您的任务提交。
我们将使用一些示例代码,你将需要用你的私钥和以太坊地址等值填充这些代码。更新这些值之后,我们将执行脚本来部署 ERC20 代理合约,然后我们将使用它在 Nervos 的 Layer2 上检查您的 SUDT余额!
注意:你的私钥是用来保护你的账户和账户内的所有资金和资产。重要的是要保证私钥的安全,并且只使用您可以信任的工具。然而,在这些任务中,我们将只使用测试网资金和没有价值的资产。你可以毫不担心地操作,因为这里没有任何风险。
要部署 ERC20 代理合约(也称为 SUDT-ERC20 代理合约),首先需要有 Layer2 上的 SUDT ID。这可以通过使用 account-cli 工具将 SUDT 存入 Layer2 来实现,这是在前面的任务中完成的。如果您还没有完成此任务,请在继续本任务之前完成。
该任务需要在任务2 中设置的 Gitcoin Task Instruction Examples repo (gw-gitcoin-instruction)。如果你出于任何原因还没有这个仓库,那请你现在设置它。
在部署智能合约之前,需要对其进行编译。我们的说明将向您展示如何使用 Truffle 编译器快速编译智能合约。
以下 SUDT-ERC20 代理的 solidity 智能合约为 SudtERC20Proxy.sol
。它位于 gw-gitcoin-instruction/src/examples/5-erc20-proxy/contracts/SudtERC20Proxy.sol 的文件中。
下面的命令可以使用 Truffle 编译器将 solidity 编译成 EVM 字节码。这个过程我们将使用 Docker。如果您没有安装 Docker,请重新访问任务设置和需求页面。
cd ~/projects/gw-gitcoin-instruction/src/examples/5-erc20-proxy
yarn compile
命令完成后,您将在 build/contracts
目录中找到编译后的文件。例如 src/examples/5-erc20-proxy/build/contracts/SudtERC20Proxy.json
接下来,我们将使用范例代码来部署智能合约。在选择的编辑器中打开 src/examples/5-erc20-proxy/index.js
文件。你需要更新 index.js
中的值,以匹配你的以太坊私钥和 SUDT ID。
Ethereum私钥
该私钥将用于部署智能合约,并且它应该与之前任务中添加资金的以太坊私钥相同。确保在 Layer2 使用以太坊私钥,而不是 Nervos CKB 的 Layer1 私钥。我们会用这个值替换<YOUR_ETHEREUM_PRIVATE_KEY>
。始终确保您私钥的前缀为「0x」
const ACCOUNT_PRIVATE_KEY = '<YOUR_ETHEREUM_PRIVATE_KEY>';
SUDT ID 所部署的合约需要 SUDT ID,以便将其与特定的 SUDT 通证相关联。这在以太坊智能合约和 Layer2 的 SUDT 通证之间创建了 1:1 绑定的关系,一旦部署就不能更改。用前面创建的通证中的 SUDT ID 替换<YOUR_SUDT_ID>。
const SUDT_ID = '<YOUR_SUDT_ID>';
SUDT_NAME, SUDT_SYMBOL, and SUDT_TOTAL_SUPPLY
其他常量 SUDT_NAME、SUDT_SYMBOL 和 SUDT_TOTAL_SUPPLY 可以保持不变。它们是为了与兼容 ERC20 而提供的,但是这些值目前没有任何作用。
运行脚本 替换所有值后,在控制台中使用以下命令执行脚本。
cd ~/projects/gw-gitcoin-instruction/src/examples/5-erc20-proxy
node index.js
运行该命令后,应该部署合约不会出现任何错误。您将看到一个交易哈希和一个以太坊合约地址。交易哈希由 Godwoken 提供,以太坊合约地址由 Polyjuice 提供。请把这些值记录下来,因为它们将在未来的任务中会用到。
成功输出范例
➜ node index.js
Using Ethereum address: 0xD173313A51f8fc37BcF67569b463abd89d81844f
Deploying contract...
Transaction hash: 0xcfa9a2e6d691fd095b4cb2edbea3437bd6de7fedd210e8a55c2ccc5c24b32ad5
Deployed SUDT-ERC20 Proxy contract address: 0xc013772cAAaBf6ca3F584B6D7b98e73a701233b5
一旦为您的 SUDT 部署了 SUDT- erc20 代理智能合约,您就可以检查任何账户的通证余额。这可以通过调用 ERC20ProxyContract.balanceOf
方法来实现。它接受帐户或智能合约地址作为第一个也是唯一一个的参数。但需要记住的一件重要的事情是这是一个 Polyjuice 地址 ,而不是您的以太坊地址。在智能合约调用中处理链上地址时,您几乎会总是想用 Polyjuice 地址的。
你会问 Polyjuice 的地址是什么? Polyjuice地址 是 Nervos 的 Layer2 内部用于记录其背后的以太坊地址的地址。Polyjuice 地址的概念是由于 Nervos 使用的是跨链 Layey2 架构而存在的。所以不能在 Nervos Layer 2 上使用以太坊地址,因为Nervos Layer 2 也被设计为支持许多其他类型的区块链以及区块链账户。来自所有这些不同区块链的地址必须标准化为 Nervos 可以在内部使用的单一格式。
不过不要担心,从以太坊地址变成 Polyjuice 地址非常容易,反之亦然。示例代码包含在examples/5-erc20-proxy/check-sudt-balance.js
。您还可以使用 account-cli
工具使用命令行执行一次转换。account-cli
的说明可以在这里找到。
接下来,我们将使用提供的范例代码来检查 SUDT余 额。在编辑器中打开src/examples/5-erc20-proxy/check-sudt-balance.js
文件。你需要更新 index.js
中的值,以匹配你的以太坊地址和ERC20 代理合约地址。
Ethereum地址
脚本需要知道我们将检查哪个以太坊地址的余额。将<YOUR_ETHEREUM_ADDRESS>
替换为您先前存放SUDT 的以太坊地址。
const ETHEREUM_ADDRESS = '<YOUR_ETHEREUM_ADDRESS>';
ERC20代理合约地址
通过本教程的上一步,您应该已经收到了SUDT-ERC20 代理合约的地址。将<YOUR_SUDT_PROXY_CONTRACT_ADDRESS>
替换为部署的ERC20代理合约的地址。
const SUDT_PROXY_CONTRACT_ADDRESS = '<YOUR_SUDT_PROXY_CONTRACT_ADDRESS>';
运行脚本 替换所有值后,在控制台中使用以下命令执行脚本。
cd ~/projects/gw-gitcoin-instruction/src/examples/5-erc20-proxy
node check-sudt-balance.js
范例输出
node check-sudt-balance.js
Using Ethereum address: 0xD173313A51f8fc37BcF67569b463abd89d81844f
Corresponding Polyjuice address: 0xa3cd0b1d997e5281dd574dd34155945febcf73a4
Checking SUDT balance...
80
恭喜你! 你在控制台输出的末尾看到的数字是你的以太坊账户在 Layer2 的 SUDT 通证的余额! (例如上面的 80)
此时你应该会看到一个大于零的值,因为指令表明你应该是使用已经有通证的以太坊账户。如果看到0,则重新检查上面以以太坊地址开始的步骤。
为了完成任务,你需要提交以下材料供评委评审:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!