ღ Miranda

在Mac上编写测试以太坊智能合约

测试环境

这里使用truffle框架和ganache在本地编写智能合约并且进行测试。truffle是本地的用来编译、部署智能合约的工具,前一篇文章提到了gethgeth是真正的以太坊环境,而ganache是在本地模拟的一个以太坊环境,当你的合约在ganache中测试通过后,再可以部署到geth中去。

首先需要安装node.js,在官网直接下载pkg安装包安装即可。

然后需要在本地为/usr/local/lib/node_modules目录添加写权限,否则使用npm安装会报错,然后使用下面的命令安装两个命令行工具:

测试安装:

ganache-cli运行后会默认新建十个测试账户,并且监听端口:

ganache-cli的作用与之前的testrpc是一样的,只是现在truffle更推荐使用ganache的整套工具,除了ganache-cli外,ganache还提供了图形化界面,可以直接在github库中下载:

使用truffle新建合约

新建一个项目文件夹,并且初始化项目文件,可以看到项目结构:

contracts文件夹里就是智能合约文件,在这个目录下新建一个Hello.sol,并写入内容,这里的合约有两个简单的打印功能:

编译合约

使用下面的命令编译合约:

默认只编译有改动的文件,也可以使用下面的命令来重新编译所有文件:

编译后会生成build目录:

部署合约

migrations文件夹里是合约的部署脚本,为我们的合约添加一个新脚本2_deploy_Hello.js:

然后还需要修改truffle.js文件,添加配置信息,官方文档:

这里把truffle.js内容修改为:

然后部署合约,部署时要保证ganache-cli是运行状态:

ganache-cli窗口会输出信息:

truffle migrate会执行所有migrations目录下的js文件,如果之前执行过这个命令,再次执行只会部署新的js文件。如果部署出错的话,可以尝试加上--reset参数重新部署所有脚本。

测试合约

接下来可以进入truffle的命令行测试部署好的合约,首先获得Hello合约的对象,赋值给contract,这里如果成功的话会打印合约信息,如果有任何报错可以使用--reset参数重新部署合约:

可以调用我们写好的函数,有直接调用和使用call调用两种方式,与Javascript类似:

在geth私有链上部署合约

要部署合约需要在私有链上有一个已经解锁的账户,并且账户中有余额。这里使用上一篇文章中搭建的私有链来进行部署,首先启动命令行,确认账户信息:

接下来需要获取合约的abi(Application Binary Interface),需要通过编译Hello.sol获取,官方推荐的方法是使用在线的IDEremix来进行编译。编译后查看详情会有一项WEB3DEPLOY:

直接把第一行复制到geth命令行中创建合约:

接下来把剩下的代码放到终端中,可能会有如下错误:

这是因为我们在创世区块文件中设置了gas的最大值:

可以看到是2000000,而部署需要的gas值为4700000,所以超过了限制,可以简单的修改合约中的gas值小于2000000即可:

可以看到这时hello对象的address是空的,因为还没有经过挖矿放到链上,需要启动挖坑,合约部署成功后会输出消息:

这时hello对象有了address,测试函数成功:

发表评论

电子邮件地址不会被公开。