在本教程中,我们将会让您安装一个 Tron 钱包,然后对之前部署在 Nervos 的 Layer2 测试网上的以太坊智能合约进行函数调用。我们将向您展示如何利用 Nervos 的灵活性,让您的 dApp 支持来自其他区块链生态系统的钱包,并允许它们的用户与以太坊智能合约交互,即使它们从未被设计为这样做。
你不能在 Nervos 上部署以太坊智能合约,然后让 Tron 用户和以太坊钱包互动,对吧?
错了,你可以!
在本教程中,我们将会让您安装一个 Tron 钱包,然后对之前部署在 Nervos 的 Layer2 测试网上的以太坊智能合约进行函数调用。我们将向您展示如何利用 Nervos 的灵活性,让您的 dApp 支持来自其他区块链生态系统的钱包,并允许它们的用户与以太坊智能合约交互,即使它们从未被设计为这样做。
注意:在开始任务之前,建议您检查任务提交部分,这样您就知道您需要提供哪些材料给裁判,以审查您的任务提交。
这个任务的大致流程如下:
其中一些步骤在之前的任务中已经完成,您可以复用这些工作,这样就不必再做一次。我们会尽可能在步骤中指出这一点。
在你开始这个任务之前,你需要安装 Godwoken Example 工具包。这应该已经从以前的任务中设置过了,但如果因为任何原因没有设置,您可以使用这里的说明再次设置。
第一步是在 Nervos CKB Layer 1 测试网上创建一个帐户,充值一点 CKBytes ,然后导出帐户私钥,以便提供给其他脚本使用。
这可以使用包含在 CKB Node 软件中的 ckb-cli 命令行工具轻松完成。免费的测试网 CKBytes 可以通过 Nervos 水龙头 获取。
有关完成此步骤的完整说明,请参考任务1中的步骤。
在先前的任务中我们用了 Metamask 账户,但是这次我们将会时候用 Tron 上面的账户。
在这个步骤中,你可以安装 TronLink 钱包并用 TronLink 来创建 Tron 账户。你可以参照这个教程去做。
这个步骤中,我们将会导出私钥好让他可以在稍后的步骤被其他工具使用。这个步骤可以参考此教程。
在这个步骤,你必须要从 Layer1 存入 CKbytes 到 Layer2。这个步骤对于要在 Godwoken 创建 Layer2 账户而言是必要的。我们之前使用的是以太坊的 MetaMask 账户,现在我们将使用 TronLink 钱包中的 Tron 账户进行同样的操作。
可以使用下面教程中提供的示例脚本代码进行存款。请确保您的 Layer 1 私钥可用,因为示例脚本将需要用到它。
有关使用 Tron 钱包完成本步骤的说明,请参见本教程。
为了在智能合约上执行函数调用,必须部署智能合约,并且必须拥有在代码最初编译时生成的 ABI。“ABI” 表示应用程序二进制接口(Application Binary Interface),它包含应用程序在智能合约上接口和调用函数所需的信息。
在 Layer 2 部署以太坊智能合约是在任务 2 中完成的。您可以重用这个智能合约,而不必重复 Task 2。 如果它不再可用,请重复任务 2 中的步骤。
示例智能合约是 SimpleStorage.sol
,对应的 ABI 值可以在编译合约后的 2-deploy-contract/build/contracts/SimpleStorage.json
中找到。下面是从这个文件中提取的 ABI 值。
[
{
"inputs": [],
"stateMutability": "payable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "x",
"type": "uint256"
}
],
"name": "set",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "get",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
]`
SimpleStorage 合约也被部署到测试网中,地址如下。您可以选择将此用于测试目的,但评委将要求您使用自己的合约来完成此任务。
0xC46e27169824290EcaEf6E14503C1a6DE72d41B0
接下来,我们将使用示例代码在您的智能合约中调用函数。使用你的编辑器打开 gw-gitcoin-instruction/src/examples/11-tron/index.mjs
文件。
这个示例代码类似于任务 3 中的代码,在任务 3 中,我们使用 MetaMask 帐户对部署的以太坊智能合约进行函数调用。现在我们将做同样的事情,但用的是 Tron 账户。
替换 index.mjs
文件中的一下值:
您需要做的第一件事就是用您的 Tron 地址更新 index.mjs
。您可以从您的 Tron 钱包中获得 Tron 地址,并用该地址替换 <YOUR_TRON_ADDRESS>
。
const TRON_ADDRESS = '<YOUR_TRON_ADDRESS>';
你需要做的第二件事就是用指定的 Tron 地址匹配的私钥更新 index.mjs
。
确保您在 Layer 2 使用的 Tron 私钥, 而不是 Nervos CKB Layer 1 的私钥,或者以太坊私钥,并用该私钥替换 <YOUR_TRON_PRIVATE_KEY>
。始终确保您私钥的前缀为「0x」。
const ACCOUNT_PRIVATE_KEY = '<YOUR_TRON_PRIVATE_KEY>';
接下来,将你的合约 ABI 添加到脚本中,即使用在编译期间生成的 JSON 文件中的 ABI 值替换 <YOUR_CONTRACT_ABI>
。
注意:CONTRACT_ABI 常量将会是一个数组,而其索引 0 为你的 ABI 值。确保这是一个数据结构,就像在 SimpleStorage.Json 中一样,而不是作为一个字符串被输入。
const CONTRACT_ABI = [<YOUR_CONTRACT_ABI>]; // Array
用您将调用的以太坊合约地址替换 <YOUR_CONTRACT_ADDRESS>
。这个值应该是一个十六进制字符串,在部署合约之后返回。
const CONTRACT_ADDRESS = '<YOUR_CONTRACT_ADDRESS>';
在 readCall()
函数中找到 <YOUR_READ_FUNCTION_NAME>
。这必须替换为你合约中用于读取的函数名。
const callResult = await contract.methods.<YOUR_READ_FUNCTION_NAME>().call();
在 readCall()
函数中找到 <YOUR_WRITE_FUNCTION_NAME>
。这必须替换为你合约中用于写的函数名。
const callData = contract.methods.<YOUR_WRITE_FUNCTION_NAME>().encodeABI();
替换所有值后,在控制台中使用以下命令执行脚本。
cd ~/projects/gw-gitcoin-instruction/src/examples/11-tron
node index.mjs
➜ node index.mjs
Using Tron address: TFrSJCrSJai8H2Kc32TP3nEzuWsXu8YnUJ
Calling contract...
Read call result: 400
{
tx: {
from: '0x4088F10C8D7EC48D19035D8C0709397E2FEC18C3',
to: '0x3E3b7616812290B60ceEcF412C9CDf941Da841A9',
nonce: '0x0',
gasPrice: '0x0',
gas: '0x271110',
value: '0x0',
data: '0x60fe47b10000000000000000000000000000000000000000000000000000000000000309'
}
}
Write call transaction hash: 0x03120a01d066fb973f4cbce4eb70b684312c05a373a8e99218b349bb6de81eae
Waiting for tx receipt doesn't work for Tron calls, but if transaction was submitted then you can check the smart-contract state after 120s and the state should be changed successfully. Waiting 2 minutes...
Write call finished.
Read call result: 777
如果您看到了交易哈希和智能合约状态更改,那么恭喜您!您已经成功地在 Nervos Layer 2 上发行了一个智能合约写调用。
为了完成任务,你需要提交以下材料供评委评审:
ckb-cli
中创建的账户(account list
)的截屏。交易哈希值
(文本格式)。合约地址
(文本格式)。如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!