第一行代码:以太坊(3)-使用更多的工具编写和测试智能合约

 《第一行代码:以太坊》开始连载了

 

在上文中已经使用了Remix环境运行和测试了本书编写的第一个智能合约程序,不过编写和测试智能合约的测试方式很多,例如,在testrpc环境测试;在Intellij IDEA集成开发环境中用Solidity语言编写智能合约;在纯Web环境中测试智能合约;使用AJAX方式测试智能合约等。本文将详细介绍这些用于编写和测试智能合约的方法。

1.安装本地remix环境(Windows、Mac OS X和Linux)

在本节使用Remix环境运行和测试了Calc智能合约,不过使用的是在线Remix环境。由于某些原因(如没有网络,或网络速度很慢),我们希望使用本地的Remix环境运行和测试智能合约,这就要就将Remix环境安装在本地。Remix是跨平台的,所以本节介绍的安装方法同时适用于Windows、Mac OS X和Linux。

不管是在什么操作系统下安装Remix,都必须安装Node.js,读者可以到https://nodejs.org下载Node.js的最新版直接安装即可。

安装完Node.js后,需要使用git命令下载Remix的代码库(browser-solidity),命令行如下:

git clone https://github.com/ethereum/browser-solidity

在Mac OS X和Linux下,一般会集成git命令,但在Windows下,默认是没有git命令的,所以需要到下面的页面下载Windows版的git工具,下载完后直接安装即可。

https://git-scm.com/download/win

使用git命令下载完Remix的代码库后,使用cd命令进入browser-solidity目录,该目录在下载Remix代码库的过程中自动在当前目录中创建。

在browser-solidity目录中执行下面的命令安装browser-solidity。

npm install

安装browser-solidity的过程比较漫长,读者要耐心等待。下图是在Windows下安装browser-solidity环境的效果。

image.png

如果成功安装了browser-solidity,可以使用下面的命令启动Remix服务。

npm start

下图是Mac OS X下启动Remix服务后的输出信息,Windows和Linux会输出类似的信息。

image.png

Remix服务默认的端口号是8080,如果在浏览器地址栏中输入下面的Url,就可以使用本地的Remix环境编写和测试智能合约。

下图是Windows下启动testrpc服务的效果。

image.png

我们可以看到,不管是在哪一个平台上启动testrpc服务,都会自动生成10个账号(Accounts)和10个私钥(Private Keys)。这些账号和私钥都是用于测试的,而且每一个账号拥有的以太币几乎是无限大的,因此,不用担心进行某些操作后没有以太币可用。

testrpc本身是一个服务,默认的端口号是8545,这个端口号是用于像web3.js、web3.py一样的程序库连接以太坊节点的,testrpc其实也相当于一个用于测试的以太坊节点。

3.使用testrpc测试智能合约

本节会将智能合约部署到testrpc服务上,然后使用web3.js连接testrpc服务,并调用智能合约中的函数。具体的操作步骤如下:

(1)编写智能合约

启动本地的Remix环境,然后在Remix环境中输入下面的智能合约代码。

本例编写了一个名为Factorial的智能合约程序,在该智能合约中有一个factorial函数,用于计算n的阶乘。

pragma solidity ^0.4.0; contract Factorial  {     /*  计算n的阶乘  */    function factorial(uint n) returns (uint)    {         if (n == 0 || n == 1)             return 1;         else             return n * factorial(n - 1);     } }

这个智能合约用于计算n的阶乘。

(2)将智能合约部署在testrpc节点上

在Remix环境的右侧进入“Run”页面,并在“Environment”列表中选择“Web3 Provider”,如下图所示。

image.png

在Web3 Provider环境下,Remix可以将智能合约直接部署到testrpc服务上。进入Web3 Provider之前,会弹出一个对话框,询问是否连接以太坊节点,单击“OK”按钮,会弹出如下图所示的对话框。在该对话框中有一个文本框,默认值是http://localhost:8545,如果要连接本地的testrpc节点或以太坊节点,直接单击“OK”按钮即可。如果testrpc节点已经启动,那么Remix本地环境会成功连接到testrpc节点上。

image.png

单击“Run”页面的“Deploy”按钮,会将Factorial智能合约部署到testrpc上。部署成功后,会在“Run”页面的下方出现“factorial”按钮,如下图所示。在按钮右侧的文本框输入要计算阶乘的n的值,然后点击该按钮即可在以太坊测试环境(testrpc)下执行factorial函数,不过在日志区域点击“Details”按钮后,并没有看到factorial函数的输出结果,这是因为factoria函数是直接在以太坊网络中运行的,所有的数据都存在于以太坊网络中,并不会直接将数据返回给以太坊客户端。

在“factorial”按钮的上方是Factorial智能合约的地址,如果在客户端要访问这个智能合约,需要使用这个地址。

image.png

(3)安装Solidity编译器

Solidity编译器是用于编译Solidity源代码文件(.sol文件)的,可以将Solidity源代码文件编译成多种目标文件。使用下面的命令行可以安装Solidity编译器。

npm install -g solc

(4)编译Solidity源代码文件

在当前目录创建一个Factorial.sol文件,然后将例3.2中的代码复制到Factorial.sol文件中。接下来会使用上一步安装的Solidity编译器对Factorial.sol文件进行编译。要注意,尽管安装的是solc,但编译器命令行工具是solcjs。这个工具可以将Solidity源代码文件编译成多种目标文件,对于本例来说,只需要abi文件即可,该文件是智能合约的接口文件。也就是说,使用Web3.js调用智能合约,需要使用abi文件才能调用智能合约中函数。

使用下面的命令可以将Factorial.sol文件编译生成abi文件。其中--abi是命令行参数,表示生成的目标文件类型是abi。

solcjs --abi Factorial.sol

执行完上面的命令后,会在当前目录生成一个Factorial_sol_Factorial.abi文件,该文件就是Factorial.sol对应的abi文件。

(5)安装Web3.js

在使用Web3.js之前必须安装Web3.js,Web3.js是Node.js的一个模块,所以需要使用下面的命令安装。

npm install web3

使用上面的命令会安装web3的最新版,如果读者使用web3最新版不太习惯,可以使用下面的命令安装指定版本。

npm install web3@0.20.6

(6)用Web3.js连接testrpc节点

现在执行node命令进入Node.js的REPL环境(命令行交互环境),然后在Node的REPL环境执行下面的命令。要注意,在执行这些命令之前,要先启动testrpc节点,并且利用Remix环境将例3.2中的智能合约部署到testrpc节点上。

> var Web3 = require("web3"); > var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));  undefined > var eth = web3.eth undefined > var abi = JSON.parse(fs.readFileSync("Factorial_sol_Factorial.abi").toString()); undefined > var contract = eth.contract(abi); undefined > var instance = contract.at('0x371f45db1a077bbcbeb50d2a21bc85e4e18c1f1f') undefined > instance.factorial.call(3) { [String: '6'] s: 1, e: 0, c: [ 6 ] } > instance.factorial(10, {from:eth.accounts[0]}) 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信