在 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 帐户。您还需要前一个任务中的私钥和测试网地址才能继续。如果您还没有完成,请现在先去完成哦。
在前面的任务中,您导出了Nervos CKB 的帐户私钥。接下来,我们需要为你的以太坊兼容层的账户提取私钥。在这里我们将使用此私钥做为工具在 Layer2 上部署智能合约。我们不建议将 Layer1 私钥回收来做为 Layer2 的私钥,这可能会导致之后的过程产生失败。
注意:对于这些我们在 Gitcoin 上布置的任务,永远不要使用与真实帐户相关联的私钥。下面的步骤将向您展示如何从 MetaMask 导出您的私钥,但请您永远不要使用用于实际资产的 MetaMask 钱包来这样做,因为这可能会泄露信息,从而危及您的帐户里的资产。
如过你需要些说明来告诉你如何从 Metamask 导出私钥,可以看这篇教学文。
在这一步骤中,您将克隆 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
在部署智能合约之前,需要对其进行编译。这可以通过几种方式实现,这次我们的指令将使用 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
目录中。
在 [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
为了完成这项任务,你需要提交以下材料:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!