Nervos x Gitcoin bounty 任务 11:使用 Tron 钱包来执行智能合约的呼叫

  • CKB 中文
  • 更新于 2021-09-17 21:12
  • 阅读 3430

在本教程中,我们将会让您安装一个 Tron 钱包,然后对之前部署在 Nervos 的 Layer2 测试网上的以太坊智能合约进行函数调用。我们将向您展示如何利用 Nervos 的灵活性,让您的 dApp 支持来自其他区块链生态系统的钱包,并允许它们的用户与以太坊智能合约交互,即使它们从未被设计为这样做。

你不能在 Nervos 上部署以太坊智能合约,然后让 Tron 用户和以太坊钱包互动,对吧?

错了,你可以!

在本教程中,我们将会让您安装一个 Tron 钱包,然后对之前部署在 Nervos 的 Layer2 测试网上的以太坊智能合约进行函数调用。我们将向您展示如何利用 Nervos 的灵活性,让您的 dApp 支持来自其他区块链生态系统的钱包,并允许它们的用户与以太坊智能合约交互,即使它们从未被设计为这样做。

注意:在开始任务之前,建议您检查任务提交部分,这样您就知道您需要提供哪些材料给裁判,以审查您的任务提交。

这个任务的大致流程如下:

  1. 创建并充值 Layer1 的 CKB帐户。
  2. 安装一个 Tron 钱包并创建一个 Tron 账户。
  3. 使用你的 Tron 账户创建一个 Nervos Layer 2 账户并提供资金。
  4. 准备并部署一个 solidity 智能合约到 Nervos 的 Layer2 。
  5. 使用范例代码来使用您的 Tron 帐户进行智能合约调用。

其中一些步骤在之前的任务中已经完成,您可以复用这些工作,这样就不必再做一次。我们会尽可能在步骤中指出这一点。

先决条件

在你开始这个任务之前,你需要安装 Godwoken Example 工具包。这应该已经从以前的任务中设置过了,但如果因为任何原因没有设置,您可以使用这里的说明再次设置。

1. 创建并充值 CKByte 到一个 Layer1 的账户中

第一步是在 Nervos CKB Layer 1 测试网上创建一个帐户,充值一点 CKBytes ,然后导出帐户私钥,以便提供给其他脚本使用。

这可以使用包含在 CKB Node 软件中的 ckb-cli 命令行工具轻松完成。免费的测试网 CKBytes 可以通过 Nervos 水龙头 获取。

有关完成此步骤的完整说明,请参考任务1中的步骤。

2. 安装一个 Tron 钱包并且创建账户

在先前的任务中我们用了 Metamask 账户,但是这次我们将会时候用 Tron 上面的账户。

在这个步骤中,你可以安装 TronLink 钱包并用 TronLink 来创建 Tron 账户。你可以参照这个教程去做。

3. 导出 Tron 账户的私钥

这个步骤中,我们将会导出私钥好让他可以在稍后的步骤被其他工具使用。这个步骤可以参考此教程

4. 用你的 Tron 账户来创建并且充值 Nervos 上的 Layer2 账户

在这个步骤,你必须要从 Layer1 存入 CKbytes 到 Layer2。这个步骤对于要在 Godwoken 创建 Layer2 账户而言是必要的。我们之前使用的是以太坊的 MetaMask 账户,现在我们将使用 TronLink 钱包中的 Tron 账户进行同样的操作。

可以使用下面教程中提供的示例脚本代码进行存款。请确保您的 Layer 1 私钥可用,因为示例脚本将需要用到它。

有关使用 Tron 钱包完成本步骤的说明,请参见本教程

5. 准备智能合约地址和 ABI

为了在智能合约上执行函数调用,必须部署智能合约,并且必须拥有在代码最初编译时生成的 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

6. 准备并运行调用智能合约的示例代码

接下来,我们将使用示例代码在您的智能合约中调用函数。使用你的编辑器打开 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

接下来,将你的合约 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>';

替换 Read Function Name

readCall() 函数中找到 <YOUR_READ_FUNCTION_NAME> 。这必须替换为你合约中用于读取的函数名。

const callResult = await contract.methods.<YOUR_READ_FUNCTION_NAME>().call();

替换 Write Function Name

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 上发行了一个智能合约写调用。

任务提交

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

  1. 你在ckb-cli 中创建的账户(account list)的截屏。
  2. 你充值的 Layer 1 地址在测试网浏览器上的链接。
  3. 在你成功充值 CKByte 到 Layer 2 的 Tron 账户后,控制台输出的截屏。
  4. 在你成功在 Layer 2 上发行一个智能合约调用后,控制台输出的截屏。
  5. 来自控制台输出的“合约调用 ”的 交易哈希值(文本格式)。
  6. 你所调用的合约地址 (文本格式)。
  7. 你调用过的合约 ABI(文本格式)。
  8. 你的 Tron 地址(文本格式)。
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
104 订阅 14 篇文章

0 条评论

请先 登录 后评论
CKB 中文
CKB 中文
首个基于 PoW + UTXO 的 BTC Layer 2