在本任务中,我们将学习如何对前一个任务中部署的智能合约进行函数调用。我们将提供一些使用流行的 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()函数将为智能合约写入一个新值,这就需要产生交易,因为状态更改只能通过交易产生。这种行为与以太坊链上的行为相同。