Nervos x Gitcoin bounty 任务2: 在 Polyjuice 上部署一个简易的以太坊智能合约

  • CKB 中文
  • 更新于 2021-09-04 11:51
  • 阅读 2263

在 Nervos 的 EVM兼容的 Layer2 上编译和部署智能合约的过程,与以太坊上的过程有很多相似之处。我们只需要做一些小小的改变即可。

Polyjuice 的最终目标是提供与所有基于 EVM 的 dApp 和 EVM 工具的 100% 兼容性。然而,开发工作仍在进行中。这个目标还没有完全实现,但它正在日益接近。

在 Nervos 的 EVM兼容的 Layer2 上编译和部署智能合约的过程,与以太坊上的过程有很多相似之处。我们只需要做一些小小的改变即可。

Polyjuice 的最终目标是提供与所有基于 EVM 的 dApp 和 EVM 工具的 100% 兼容性。然而,开发工作仍在进行中。这个目标还没有完全实现,但它正在日益接近。

任务说明

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

在本次的任务中,您将使用以太坊的 solidity 编写一个非常基本的智能合约,将其编译为 EVM bytecode 的形式,并将其部署到 Nervos 的 Layer2 - Polyjuice 上。

我们将在此步骤中使用的代码将用来编译并部署智能合约。它使用了以太坊的 Web3.js 和 Truffle 的原始版本,唯一的区别是在此我们使用了自定义的 Web3.js 提供者。

以下的任务说明会提供一个你可以使用的最基本的智能合约,但你可以自由使用你选择的任何智能合约。但是,我们建议只使用具有读写基本值功能的基本智能合约,以确保您能够完成这个任务和往后的任务。

开始本任务的先决条件

在开始这个任务之前,您必须完成前面的任务,也就是在 Nervos 的 EVM Layer 2 测试网上创建一个 Godwoken 帐户。您还需要前一个任务中的私钥和测试网地址才能继续。如果您还没有完成,请现在先去完成哦。

1. 准备你的以太坊私钥

在前面的任务中,您导出了Nervos CKB 的帐户私钥。接下来,我们需要为你的以太坊兼容层的账户提取私钥。在这里我们将使用此私钥做为工具在 Layer2 上部署智能合约。我们不建议将 Layer1 私钥回收来做为 Layer2 的私钥,这可能会导致之后的过程产生失败。

注意:对于这些我们在 Gitcoin 上布置的任务,永远不要使用与真实帐户相关联的私钥。下面的步骤将向您展示如何从 MetaMask 导出您的私钥,但请您永远不要使用用于实际资产的 MetaMask 钱包来这样做,因为这可能会泄露信息,从而危及您的帐户里的资产。

如过你需要些说明来告诉你如何从 Metamask 导出私钥,可以看这篇教学文

2.克隆并设置一个 Gitcoin Task Instruction 仓库

在这一步骤中,您将克隆 Gitcoin Task Instructions 的范例仓库。他包含了此任务和未来任务所需的各种范例代码。

如果不存在~/project 目录的话,创建一个。

Linux/MacOS 命令行语句:

mkdir -p ~/projects

Windows (PowerShell) 命令行语句:

New-Item -ItemType Directory -Force -Path ~/projects

进入~/project 目录然后克隆仓库。

cd ~/projects
git clone <https://github.com/kuzirashi/gw-gitcoin-instruction>
cd gw-gitcoin-instruction

再来我们会安装所有的依赖

yarn run install-all

3.编译智能合约并且复制物件

在部署智能合约之前,需要对其进行编译。这可以通过几种方式实现,这次我们的指令将使用 Truffle 编译器来编译它。如果你有自己喜欢的替代方法,当然也可以随意使用。

使用 Truffle 编译器

下方提供的是一个你可以拿来使用的简易智能合约范例,但是你可以在这个任务中使用任何你想使用的智能合约 。下面的 solidity 智能合约示例是 SimpleStorage.sol ,它位于src/examples/2-deploy-contract/contracts 这个目录中。

pragma solidity >=0.8.0;

contract SimpleStorage {
  uint storedData;

  constructor() payable {
    storedData = 123;
  }

  function set(uint x) public payable {
    storedData = x;
  }

  function get() public view returns (uint) {
    return storedData;
  }
}

下面的命令可以使用 Truffle 编译器将 solidity 编译成 EVM bytecode。这个过程我们将使用Docker。如果您没有安装 Docker,请重新访问任务设置和需求页面。

cd ~/projects/gw-gitcoin-instruction/src/examples/2-deploy-contract/
yarn compile

在这些命令完成了以后,你将会在 build/contracts 的目录下找到编译好的文件夹。举个例,他可能长得像这样src/examples/2-deploy-contract/build/contracts/SimpleStorage.json

替代方案:使用 Remix 编译器

如果出于某些原因,Truffle 编译器不能工作,你可以使用基于网页端的 Remix 编译器作为替代,但我们不会提供使用 Remix 的详细说明。只有当您已经熟悉这个工具,或者您在使用 Truffle 编译器时遇到困难时,才建议您使用这个工具。

在上传和编译你的 Solidity 代码后,你会收到一个 JSON 文件,并且可以在 Remix 的 “artifacts” 目录中找到。之后请您将这个文件的内容放在src/examples/2-deploy-contract/build/contracts目录中。

4.用 Web3.js 部署一个智能合约

[gw-gitcoin-instruction/src/examples/2-deploy-contract/](<https://github.com/Kuzirashi/gw-gitcoin-instruction/blob/master/src/examples/2-deploy-contract>) 目录中,您将发现部署智能合约到 Nervos Layer 2 所需的脚本。

首先,更新文件 gw-gitcoin-instruction/src/examples/2-deploy-contract/index.js 中的以太坊私钥。用你的以太坊私钥替换< YOUR_ETHEREUM_PRIVATE_KEY> 。这应该是与之前你充值的以太坊账户对应的私钥。这将用于在 Layer2 部署智能合约。

透过控制台使用以下命令来运行 [gw-gitcoin-instruction/src/examples/2-deploy-contract/index.js](<https://github.com/Kuzirashi/gw-gitcoin-instruction/blob/master/src/examples/2-deploy-contract/index.js>) 脚本

cd ~/projects/gw-gitcoin-instruction/src/examples/2-deploy-contract/
node index.js SimpleStorage.json

运行该命令后,应该部署合约时不会出现任何错误。到时您将看到一个交易哈希和一个以太坊合约地址。交易哈希由 Godwoken 提供,以太坊合约地址由 Polyjuice 提供。记录这些值,因为它们在将来的任务提交中会需要用到的。

输出示例:

➜ node index.js SimpleStorage.json
Deploying contract...
Transaction hash: 0x266c4887b8ad47456cc12e135858d8cd96b4795f8a93036b18d917df970781ec
Deployed contract address: 0xC46e27169824290EcaEf6E14503C1a6DE72d41B0

任务提交

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

  1. 成功部署智能合约后,控制台输出的屏幕截图。
  2. 合约成功部署的交易哈希( text 格式)。
  3. 合约部署后的合约地址( text 格式)。
点赞 1
收藏 0
分享

0 条评论

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