0x02 智能合约开发之调试
一、调试模式
目前browser-solidity有两种常用的调试方式,一个是采用本地虚拟机调试模式,一个是连接到本地的私有链进行调试。
1.本地虚拟机调试模式
本地虚拟机调试,就是不连接任何一个节点,在内存虚拟出一个以太坊节点进行调试,优点是速度快,配置简单,缺点是因为只是虚拟调试,可能最后放到真正的区块链节点上运行智能合约会和预想的结果不同。
-
首先在DEBUG环境设置中,选择JavaScript VM以设置本地虚拟调试模式。
-
智能合约代码编写好后,点击“Create”按钮部署智能合约到内存中,并进行调试,如果部署成功,会出现智能合约的函数运行按钮和参数输入框,然后就可以调试你的智能合约了。
-
运行函数后,会出现相应的交易数据,可以完成整个智能合约调试。
-
如果想逐步调试智能合约,那么选择小虫子图标,切换到逐步调试界面,即可实现单步运行智能合约,注意这里的单步运行不是指代码而是指智能合约编译后的OPCODE。
2.连接到本地私有链调试
连接到本地私有链调试,就是通过RPC接口,连接本地的以太坊节点,实际部署并调试智能合约,缺点是速度较慢,配置复杂,优点是能够真实运行智能合约,最大程度的防止出错,关于私有链的配置,请参考我原先发表的文章《区块链开发(一)搭建基于以太坊的私有链环境》。
-
首先在DEBUG环境设置中,选择Web3 Provider以设置本地虚拟调试模式,同时默认会给出一个连接地址为http://localhost:8545,如果你配置的私有链RPC端口修改了,记得要改成对应的端口
-
然后,切换到账号状态栏,此时显示的可用账号,应该都是你部署的私有链里面的账号,如果不是,说明没有成功连接私有链。可能的原因有两个,一是私有链提供的端口是用http访问,而browser-solidity的网页访问地址是https,解决的方法就是将browser-solidity访问地址改为http协议的地址即可http://ethereum.github.io/browser-solidity/;二是系统的时间没有和网络同步,使用windows系统自带的时间同步功能同步一下即可。
二、调试手段
1. 变量查看
-
(1)变量可设置为public address public withDrawAddress= 0x0;
-
(2)在rimix函数变量调试栏,点击变量同名按钮,即可查看当前值
2. 日志查看
-
(1)增加event事件的事件声明 event TransferWithDraw(uint balance);
-
(2)在要调用日志的地方,执行事件调用 TransferWithDraw(withDraw);
-
(3)执行函数时,remix在logs列,有TransferWithDraw日志输出语句
3 使用remix的Debug功能
-
(1)在remix右侧,点击执行要执行的函数
-
(2)查看remix下方,有执行结果输出
-
(3)点击remix下半部分的“Debug”按钮,在右侧弹出Debug工具栏
主要关心当前的调试步进,还有当前的变量值。
三、完整实例代码
pragma solidity ^0.4.14;
contract testFundContract {
address owner;
address public withDrawAddress = 0x0;
event TransferWithDraw(uint balance);
function testFundContract() {
owner = msg.sender;
}
function withDrawAddress(address a) {
require(msg.sender == owner);
withDrawAddress = a;
}
function addFund() payable returns (uint) {
return this.balance;
}
function withDraw() {
require(this.balance > 0);
if (0x0 == withDrawAddress ){
revert();
}
uint withDraw = this.balance;
withDrawAddress.transfer(withDraw);
TransferWithDraw(withDraw);
}
}
四、其他常见智能合约资源
下面一些例子网站去参考一些成熟的代码,方便快速迭代学习,常见的例子网站如下:
开发框架常用的有3个:
- Truffle:说明书地址http://truffle.readthedocs.io/en/latest/
以太坊目前很流行的开发框架Truffle的说明书,这个框架比较流行。(主要推荐)
- Dapple:说明书地址http://dapple.readthedocs.io/en/master/
这个开发框架是在gitter chart上看到的,感觉用的人不多,先观察
这个开发框架是以太坊官方推荐的,写进了以太坊的官方wiki,值得学习,当然,以太坊官方经常转换方向,以后换别的也没准