上周,本体宣布支持 EVM 的测试网正式部署并向全球开发者开放 EVM 兼容公测。同时,与知名代码审计机构慢雾科技合作发布《本体安全漏洞与威胁情报赏金计划》(https://slowmist.io/en/ontology/)正式启动,上报单个有效漏洞奖励最高可达12,000美金。
为方便广大社区开发者们能够快速便捷地熟悉本体 EVM 开发环境,我们特地为您准备了“关于本体 EVM 合约开发,你必须知道的事!”,助力您的开发。
上一期,我们介绍了和本体 EVM 相关的 ChainID、RPC URL、浏览器地址等配置信息,开发者可以根据上述信息,配置 MetaMask 数据客户端到本体网络。这一期,我们将介绍在本体上开发和部署 EVM 合约的工具,以及如何使用 MetaMask 插件数据客户端来管理以太坊数据客户端。
鉴于 EVM 合约使用 Solidity(https://solidity-cn.readthedocs.io/zh/develop/index.html) 语言开发,我们将介绍如何搭建 Remix、Truffle 和 Hardhat 开发环境,进合约开发、编译、部署、调试等一系列工作。此外,开发者也可直接复用现有的以太坊合约框架在 Ontology 上开发和部署 EVM 合约。
2.1 Remix 开发环境
Remix IDE 是一个开源的 Solidity 合约集成开发环境,支持用户进行合约开发、编译、部署、调试等工作。Remix IDE 的官方英文版文档请见此链接(https://remix-ide.readthedocs.io/en/latest/)。
下面我们通过一个 Hello World 合约样例来展示如何使用 Remix。
2.1.1 安装开发环境
首次使用 Remix 需要在 PLUGIN MANAGER 里面找到并添加 Solidity Compiler 和 Deploy and Run Transactions 模块到编译器中。
然后选择 Solidity 环境,创建新文件并命名为 HelloWorld.sol,再将已经写好的 Hello World 合约代码(https://github.com/ontio/ontology/blob/master/docs/specifications/evm_refernce/contract-demo/helloworlddemo/helloworld.sol)复制到该文件中。
2.1.2 编译合约
点击 Solidity Compiler 按钮,选择编译器版本为 0.5.10,开始编译 HelloWorld.sol。
2.1.3 部署合约
编译后可以将合约部署到本体网络中。下面将以测试网作为范例。在部署合约之前,需要将 MetaMask 数据客户端连接到本体网络(可参考上期技术视点),并在本体Faucet地址(https://developer.ont.io/)上领取测试 ONG 作为手续费。
然后,在 Remix 环境中选择“Injected Web3”,最后点击“Deploy”完成合约部署。
2.1.4 调用合约
合约部署后,开发者可以调用合约中的方法。部署示例中的 Hello World 合约时, Hello 字符串会存入合约,我们可以调用合约的 message 方法来查询这个字符串,如下图:
2.2 Truffle 开发环境
Truffle 是一个用于辅助以太坊智能合约开发、测试和管理的框架,官方文档请参考此链接(https://truffle.tryblockchain.org/Truffle-introduce-介绍.html)。下面我们用这段测试代码(https://github.com/ontio/ontology/tree/master/docs/specifications/evm_refernce/contract-demo/truffledemo)作为范例介绍 Truffle 的使用。
2.2.1 安装开发环境
初始化开发环境,首先安装 Truffle 环境需要的配置文件。
Node.js v8+ LTS and npm (https://nodejs.org/en/)(comes with Node)
Git(https://git-scm.com/)
然后通过以下命令安装 Truffle。
$ npm install -g truffle
2.2.2 配置 truffle-config
2.2.3 部署合约到本体网络
执行如下的命令部署合约。
$ truffle migrate --network ontology
显示如下输出则代表部署成功。
注意: 编写测试脚本时尽量不要使用以太坊通证的单位(如 wei、gwei、ether 等)。
2.3 Hardhat 开发环境
Hardhat 是一个编译、部署、测试和调试以太坊应用的开发环境。下面我们用这段测试代码(https://github.com/ontio/ontology/tree/master/docs/specifications/evm_refernce/contract-demo/hardhatdemo)作为范例介绍 Hardhat 的使用。
2.3.1 安装开发环境
请参考此安装教程(https://hardhat.org/getting-started/)进行安装。
2.3.2 配置 hardhat-config
按照如下代码修改 hardhat.config.js 文件
2.3.3 部署合约
在项目根目录下执行下面的命令,部署合约到本体测试网。
$ npx hardhat run scripts/sample-script.js --network ontology_testnet
执行结果
$ npx hardhat run scripts/sample-script.js --network ontology_testnet
Contract deployed to: 0xB105388ac7F019557132eD6eA90fB4BAaFde6E81
本体网络支持开发者使用 MetaMask 插件来管理以太坊数据客户端私钥。
MetaMask 是一个非托管的数据客户端,用户的私钥通过助记词加密并储存在本地浏览器,一旦用户丢失私钥将无法恢复对其的使用。MetaMask 通过 Infura 接入以太坊,更多详细信息可复制链接浏览(https://metamask.io/)。
3.1 安装 Web3环境
第一步,在 dApp 内安装 web3环境:
$ npm install --save web3
创建一个新的文件,命名为 web3.js ,将以下代码复制到该文件:
简言之,只要在 Chrome 浏览器上安装了 MetaMask 插件,就可以使用该插件注入的 ethereum 全局变量。
第二步,在你的 client 里引入如下代码:
import getWeb3 from '/path/to/web3';
调用如下函数:
3.2 设置账户
我们需要从以上创建的 web3实例中获取一个账户来发送交易。
getAccounts() 函数返回用户在 MetaMask 中的所有账户。accounts[0]是用户当前选择的账户。
3.3 合约初始化
完成以上步骤后,对你的合约进行初始化。
3.4 调用函数
现在你可以使用你刚才创建的合约实例调用任何你想调用的函数。需要特别说明的是:函数 call() 用来完成合约的预执行操作,例如:
下期,我们将为您带来本体 EVM 合约开发流程演示,敬请期待!