Zihao

Make small but daily progress

0%

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工具栏

主要关心当前的调试步进,还有当前的变量值。

三、完整实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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);

}

}

四、其他常见智能合约资源

下面一些例子网站去参考一些成熟的代码,方便快速迭代学习,常见的例子网站如下:

  • https://github.com/ethereum/wiki/wiki/Solidity-Collections

  • http://ether.fund/contracts/

  • https://github.com/chriseth/solidity-examples

  • https://github.com/ethereum/dapp-bin

  • https://github.com/fivedogit/solidity-baby-steps

  • http://dapps.ethercasts.com

  • http://ether.fund/contracts

开发框架

常用的有3个:

  • Truffle:说明书地址http://truffle.readthedocs.io/en/latest/
    以太坊目前很流行的开发框架Truffle的说明书,这个框架比较流行。(主要推荐)

  • Dapple:说明书地址http://dapple.readthedocs.io/en/master/
    这个开发框架是在gitter chart上看到的,感觉用的人不多,先观察

  • Meteor:说明书地址https://github.com/ethereum/wiki/wiki/Dapp-using-Meteor
    这个开发框架是以太坊官方推荐的,写进了以太坊的官方wiki,值得学习,当然,以太坊官方经常转换方向,以后换别的也没准

  • 本文作者: Zihao Yao
  • 本文链接: https://yaozihao.com/eth_0x02_debugging/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道