Nervos x Gitcoin bounty 任务3:发起一个智能合约呼叫来部署智能合约
在本任务中,我们将学习如何对前一个任务中部署的智能合约进行函数调用。我们将提供一些使用流行的 Web3.js 库的简单范例代码。这段代码将允许您与运行在 Nervos 的 Layer 2 i 上的智能合约进行交互,其方式与运行在以太坊上的智能合约几乎相同。
在本任务中,我们将学习如何对前一个任务中部署的智能合约进行函数调用。我们将提供一些使用流行的 Web3.js 库的简单范例代码。这段代码将允许您与运行在 Nervos 的 [Layer 2](https://github.com/Kuzirashi/gw-gitcoin-instruction/blob/master/src/conceptual-explainers/structure.md#layer-1--layer-2) i 上的智能合约进行交互,其方式与运行在以太坊上的智能合约几乎相同。 > *注意:你可以自由使用与说明书中包含的不同的智能合约,但你的智能合约至少包括一个读取值的函数,和至少一个写入值的函数。* 您的智能合约应该像在以太坊上一样运行,但实际上,它将运行在 [Polyjuice](https://github.com/Kuzirashi/gw-gitcoin-instruction/blob/master/src/conceptual-explainers/frameworks.md#polyjuice) 提供的 EVM 环境中。当与提供了具有 optimistic rollups 的 Layer2 解决方案的 [Godwoken](https://github.com/Kuzirashi/gw-gitcoin-instruction/blob/master/src/conceptual-explainers/frameworks.md#godwoken) 相结合时,总吞吐量性能会显著提高。这意味着,与使用以太坊相比,所有用户将体验到更低的费用和更可靠的交易确认。 ## 任务说明 > 注意:在开始任务之前,建议您检查[任务提交](https://github.com/Kuzirashi/gw-gitcoin-instruction/blob/master/src/tasks/3.issue.contract.call.md#task-submission)部分,这样您就知道您需要提供哪些材料,以便于检视您的任务提交。 ### 先决条件 在你开始这项任务之前,你必须完成第任务一和任务二。如果您还没有完成,请现在就完成。 您将需要来自上一个任务中使用的以太坊地址的私钥。确保这是以太坊 Layer2 的私钥,而不是来自你 Nervos CKB Layer2 地址的私钥。如果没有,可以按照本教程中的说明从 MetaMask 中导出您的私钥。 该任务需要在任务2中设置的 Gitcoin 任务指令示例 repo (gw-gitcoin-instruction)。如果基于任何原因而没有这个 repo ,请现在就设置它。 ### 1. 准备智能合约地址和 ABI 为了在智能合约上执行函数调用,必须部署智能合约,并且必须拥有在代码最初编译时生成的ABI。“ABI”代表应用程序二进制接口,它包含应用程序在智能合约上接口和调用函数所需的信息。 在前面的任务中,您编译并部署了一个以太坊智能合约。对于此任务,您可能能够重用该智能合约。如果它不再可用,请重新访问之前的任务并重新完成它。 上一个任务中的示范的智能合约是 `SimpleStorage.sol`,在编译合约后,对应的 ABI 值可以在 `2-deploy-contract/build/contracts/SimpleStorage.json` 中找到。下面是从这个文件中提取的ABI值。 SimpleStorage契约也被部署到Testnet中,地址如下。您可以选择将此用于测试目的,但评委将要求您使用自己的合同来完成此任务。 ```json [ { "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` ### 2. 准备并运行调用智能合约的范例代码 接下来,我们将使用范例代码在智能合约中调用函数。在选择的编辑器中打开文件 `gw-gitcoin-instruction/src/examples/3-call-contract/index.js`,找到 `readCall()` 和 `writeCall()` 函数。 函数 `readCall()` 将从智能合约中读取一个值而不改变状态。这不需要交易,因为没有数据被更改。`writeCall()`函数将为智能合约写入一个新值,这就需要产生交易,因为状态更改只能通过交易产生。这种行为与以太坊链上的行为相同。 接下来,您需要更新`index.js`中的值,以匹配您的私钥和智能合约。 ### 私钥 你需要做的第一件事是用你的以太坊私钥更新 `index.js`。这个私钥将用于进行函数调用,并且它应该与之前任务中存入资金的账户的以太坊私钥相同。记得确保在 Nervos Layer2 环境使用以太坊私钥,而不是Nervos CKB Layer1 私钥。并且用这个值来替换`<YOUR_ETHEREUM_PRIVATE_KEY>`。始终确保您私钥的前缀为「0x」。 ```rust const ACCOUNT_PRIVATE_KEY = '<YOUR_ETHEREUM_PRIVATE_KEY>'; ``` ### **ABI** 接下来,通过使用编译期间生成的 JSON 文件中的 ABI 值替换 `YOUR_CONTRACT_ABI`,将合约ABI 添加到脚本中。 > 注意 :CONTRACT_ABI 常量期望一个索引为 0 的ABI 数组。确保这是一个数据结构,就像在`SimpleStorage.Json` 中一样, 并且不以字符串形式输入。 ```jsx const CONTRACT_ABI = [<YOUR_CONTRACT_ABI>];/ / Array ``` ### 合约地址 将 `<YOUR_CONTRACT_ADDRESS>` 替换为您将要调用的以太坊合约地址。这个值应该是一个十六进制字符串,在部署合约之后返回。 ```jsx const CONTRACT_ADDRESS = '<YOUR_CONTRACT_ADDRESS>; // Array ``` ### **替换 Read 函数名** 在 `readCall()` 函数中找到 `<YOUR_READ_FUNCTION_NAME>` 。这必须替换为用于读取的合约中的方法名。 ```jsx const callResult = await contract.methods.<YOUR_READ_FUNCTION_NAME>().call({ from:account.address });“ ``` ### **替换 Write 函数名** 在 `writeCall()` 函数中找到 `<YOUR_WRITE_FUNCTION_NAME>` 。这必须替换为用于写入的合约中的方法名。 ```jsx const callResult = await contract.methods.<YOUR_WRITE_FUNCTION_NAME>().call({ from: account.address, gas: 6000000, gasPrice: '0' }); ``` ### **运行脚本** 替换所有值后,在控制台中使用以下命令执行脚本。 ```jsx cd ~/projects/gw-gitcoin-instruction/src/examples/3-call-contract node index.js ``` 输出范例 ```jsx node index.js Calling contract... Read call result: 123 Write call transaction hash: 0x2a706f6cc50d4edc3e078920023872df82e03168992d2ea55308d441ab4933fb Write call transaction receipt: { transactionHash: '0x2a706f6cc50d4edc3e078920023872df82e03168992d2ea55308d441ab4933fb', blockHash: '0xe6287bea27e792e94833219ad3412068d1aebc235c8c8f5621a6db46e0ed1681', blockNumber: 20941, transactionIndex: 0, gasUsed: 20374, cumulativeGasUsed: 20374, logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', contractAddress: null, status: true, events: {} } Read call result: 888 ``` 如果你看到了交易哈希和交易收据,那么恭喜你! 您已经成功地在 Nervos Layer2 发出了一个智能合约的写入调用。 ## 任务提交 作为上一步中的合约调用的结果,您应该已经接收到 `Transaction hash`作为命令输出的一部分。 为了完成这项任务,你需要提交以下材料供评委评审: 1. 成功发出智能合约调用后,控制台输出的屏幕截图。 2. 控制台输出的`transaction hash` (文本格式)。 3. 您调用的`合约地址` (文本格式)。 4. 您调用的`ABI` (文本格式)。
在本任务中,我们将学习如何对前一个任务中部署的智能合约进行函数调用。我们将提供一些使用流行的 Web3.js 库的简单范例代码。这段代码将允许您与运行在 Nervos 的 Layer 2 i 上的智能合约进行交互,其方式与运行在以太坊上的智能合约几乎相同。
注意:你可以自由使用与说明书中包含的不同的智能合约,但你的智能合约至少包括一个读取值的函数,和至少一个写入值的函数。
您的智能合约应该像在以太坊上一样运行,但实际上,它将运行在 Polyjuice 提供的 EVM 环境中。当与提供了具有 optimistic rollups 的 Layer2 解决方案的 Godwoken 相结合时,总吞吐量性能会显著提高。这意味着,与使用以太坊相比,所有用户将体验到更低的费用和更可靠的交易确认。
任务说明
注意:在开始任务之前,建议您检查任务提交部分,这样您就知道您需要提供哪些材料,以便于检视您的任务提交。
先决条件
在你开始这项任务之前,你必须完成第任务一和任务二。如果您还没有完成,请现在就完成。
您将需要来自上一个任务中使用的以太坊地址的私钥。确保这是以太坊 Layer2 的私钥,而不是来自你 Nervos CKB Layer2 地址的私钥。如果没有,可以按照本教程中的说明从 MetaMask 中导出您的私钥。
该任务需要在任务2中设置的 Gitcoin 任务指令示例 repo (gw-gitcoin-instruction)。如果基于任何原因而没有这个 repo ,请现在就设置它。
1. 准备智能合约地址和 ABI
为了在智能合约上执行函数调用,必须部署智能合约,并且必须拥有在代码最初编译时生成的ABI。“ABI”代表应用程序二进制接口,它包含应用程序在智能合约上接口和调用函数所需的信息。
在前面的任务中,您编译并部署了一个以太坊智能合约。对于此任务,您可能能够重用该智能合约。如果它不再可用,请重新访问之前的任务并重新完成它。
上一个任务中的示范的智能合约是 SimpleStorage.sol
,在编译合约后,对应的 ABI 值可以在 2-deploy-contract/build/contracts/SimpleStorage.json
中找到。下面是从这个文件中提取的ABI值。
SimpleStorage契约也被部署到Testnet中,地址如下。您可以选择将此用于测试目的,但评委将要求您使用自己的合同来完成此任务。
[
{
"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
2. 准备并运行调用智能合约的范例代码
接下来,我们将使用范例代码在智能合约中调用函数。在选择的编辑器中打开文件 gw-gitcoin-instruction/src/examples/3-call-contract/index.js
,找到 readCall()
和 writeCall()
函数。
函数 readCall()
将从智能合约中读取一个值而不改变状态。这不需要交易,因为没有数据被更改。writeCall()
函数将为智能合约写入一个新值,这就需要产生交易,因为状态更改只能通过交易产生。这种行为与以太坊链上的行为相同。
接下来,您需要更新index.js
中的值,以匹配您的私钥和智能合约。
私钥
你需要做的第一件事是用你的以太坊私钥更新 index.js
。这个私钥将用于进行函数调用,并且它应该与之前任务中存入资金的账户的以太坊私钥相同。记得确保在 Nervos Layer2 环境使用以太坊私钥,而不是Nervos CKB Layer1 私钥。并且用这个值来替换<YOUR_ETHEREUM_PRIVATE_KEY>
。始终确保您私钥的前缀为「0x」。
const ACCOUNT_PRIVATE_KEY = '<YOUR_ETHEREUM_PRIVATE_KEY>';
ABI
接下来,通过使用编译期间生成的 JSON 文件中的 ABI 值替换 YOUR_CONTRACT_ABI
,将合约ABI 添加到脚本中。
注意 :CONTRACT_ABI 常量期望一个索引为 0 的ABI 数组。确保这是一个数据结构,就像在
SimpleStorage.Json
中一样, 并且不以字符串形式输入。
const CONTRACT_ABI = [<YOUR_CONTRACT_ABI>];/ / Array
合约地址
将 <YOUR_CONTRACT_ADDRESS>
替换为您将要调用的以太坊合约地址。这个值应该是一个十六进制字符串,在部署合约之后返回。
const CONTRACT_ADDRESS = '<YOUR_CONTRACT_ADDRESS>; // Array
替换 Read 函数名
在 readCall()
函数中找到 <YOUR_READ_FUNCTION_NAME>
。这必须替换为用于读取的合约中的方法名。
const callResult = await contract.methods.<YOUR_READ_FUNCTION_NAME>().call({
from:account.address
});“
替换 Write 函数名
在 writeCall()
函数中找到 <YOUR_WRITE_FUNCTION_NAME>
。这必须替换为用于写入的合约中的方法名。
const callResult = await contract.methods.<YOUR_WRITE_FUNCTION_NAME>().call({
from: account.address,
gas: 6000000,
gasPrice: '0'
});
运行脚本
替换所有值后,在控制台中使用以下命令执行脚本。
cd ~/projects/gw-gitcoin-instruction/src/examples/3-call-contract
node index.js
输出范例
node index.js
Calling contract...
Read call result: 123
Write call transaction hash: 0x2a706f6cc50d4edc3e078920023872df82e03168992d2ea55308d441ab4933fb
Write call transaction receipt: {
transactionHash: '0x2a706f6cc50d4edc3e078920023872df82e03168992d2ea55308d441ab4933fb',
blockHash: '0xe6287bea27e792e94833219ad3412068d1aebc235c8c8f5621a6db46e0ed1681',
blockNumber: 20941,
transactionIndex: 0,
gasUsed: 20374,
cumulativeGasUsed: 20374,
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
contractAddress: null,
status: true,
events: {}
}
Read call result: 888
如果你看到了交易哈希和交易收据,那么恭喜你! 您已经成功地在 Nervos Layer2 发出了一个智能合约的写入调用。
任务提交
作为上一步中的合约调用的结果,您应该已经接收到 Transaction hash
作为命令输出的一部分。
为了完成这项任务,你需要提交以下材料供评委评审:
- 成功发出智能合约调用后,控制台输出的屏幕截图。
- 控制台输出的
transaction hash
(文本格式)。 - 您调用的
合约地址
(文本格式)。 - 您调用的
ABI
(文本格式)。
- 发表于 2021-09-07 09:33
- 阅读 ( 331 )
- 学分 ( 1 )
- 分类:Nervos
- 专栏:Nervos x Gitcoin 黑客松培训
评论