4

Nervos x Gitcoin bounty 任务3:发起一个智能合约呼叫来部署智能合约

 3 years ago
source link: https://learnblockchain.cn/article/2947
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Nervos x Gitcoin bounty 任务3:发起一个智能合约呼叫来部署智能合约

在本任务中,我们将学习如何对前一个任务中部署的智能合约进行函数调用。我们将提供一些使用流行的 Web3.js 库的简单范例代码。这段代码将允许您与运行在 Nervos 的 Layer 2 i 上的智能合约进行交互,其方式与运行在以太坊上的智能合约几乎相同。

在本任务中,我们将学习如何对前一个任务中部署的智能合约进行函数调用。我们将提供一些使用流行的 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作为命令输出的一部分。

为了完成这项任务,你需要提交以下材料供评委评审:

  1. 成功发出智能合约调用后,控制台输出的屏幕截图。
  2. 控制台输出的transaction hash (文本格式)。
  3. 您调用的合约地址 (文本格式)。
  4. 您调用的ABI (文本格式)。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK