
1. 文章摘要
【本文目标】 本文目标是指导如何使用REMIX完成一次智能合约交易调试。 【前置条件】 学习过Solidity语言,需要进行调试。 【技术收获】 1). 使用REMIX进行单步调试 2). REMIX的Debugger界面介绍
【实操课程列表】 第一课 如何在WINDOWS环境下搭建以太坊开发环境 第二课 如何实现以太坊最简智能合约“Hello World”的运行 第四课 以太坊开发框架Truffle从入门到实战 第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例) 第七课 技术小白如何在45分钟内发行通证(TOKEN)并上线交易 第八课 如何调试以太坊官网的智能合约众筹案例 第九课 如何在Remix环境下进行Solidity代码单步调试 第十课 Solidity语言编辑器REMIX指导大全
【说明】未列出的课程为知识普及的非实操类课程,所有区块链文章参考“区块链入口”专栏。
2. 开始调试
REMIX有2种方式启动调试。 新建一个智能合约文件”Donation.sol”,复制以下代码:
contract Donation {
address owner;
event fundMoved(address _to, uint _amount);
modifier onlyowner { if (msg.sender == owner) _; }
address[] _giver;
uint[] _values;
function Donation() {
owner = msg.sender;
}
function donate() payable {
addGiver(msg.value);
}
function moveFund(address _to, uint _amount) onlyowner {
uint balance = this.balance;
uint amount = _amount;
if (_amount <= this.balance) {
if (_to.send(_amount)) {
fundMoved(_to, _amount);
} else {
throw;
}
} else {
throw;
}
}
function addGiver(uint _amount) internal {
_giver.push(msg.sender);
_values.push(_amount);
}
}
2.1 从用户界面开始
RUN运行环境选择JavaScript VM ,它用于模拟客户自定义环境,开始点击Create按钮执行智能合约:

设置´value´的值为10,单位选择ether,点击Donate 表示从当前账号捐赠10个ETH给该智能合约。

Remix显示交易相关的一些信息。在终端输出器,此次交易被记录,点击”Debug”按钮可开始调试。
2.2 从调试器开始
在”Debugger”控制面板进入,在对应的编辑框输入transaction hash / block number、transaction index信息也可以开始会话。

3. 使用调试器



3.1 Instructions面板

Instructions面板显示当前高亮显示的运行合约的汇编语言。 注意:当该面板隐藏时,滑动条的运行粒度是一个course的,即使在多EVM环境构建,也只会在语法边界停止;当该面板显示时,才可能逐步进入到构建函数内部,即使对应相同的语句。
3.2 Solidity Locals面板

3.3 Solidity State面板

3.4 Low level面板

3.5 交易回滚(Reverted Transaction)

3.6 Breakpoints断点和单步调试
导航栏的5,7按钮按钮用于回滚到前一个断点和执行到下一个断点。 在左侧编辑框的行数处单击即可增加和删除断点。 作为样例,在18行和20行双击,设置2个断点,在Run面板的moveFund输入框内输入参数,给第二个账号转移0.0005个ETH。点击”MoveFund”执行该交易函数。
"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",500000000000000
合约交易执行成功后,点击终端输出器中的Debug按钮,点击调试面板的“Jump to the next breakpoint”程序会运行到第一个断点处。

再点击“Jump to the next breakpoint”按钮一次,直接运行到20行第二个断点处。 点击”Jump out”函数跳出该函数,运行完成后可以看到第二个账号余额发生了改变,增加了0.0005个ETH。 点击展开Detail,可以看到EVENT事件记录的参数信息。

3.7 切换账号调用存量合约
REMIX在“Environment”采用“Injected WEB3”的方式下,切换账号会导致智能合约呈现消失。 此时可以通过调用合约地址的方式把合约和命令复原回来。 例如我有一个部署在ropsten的智能合约,地址为"0xbb7695fe978176cbe86d27b9e2b4e9eff1a04f82",恢复方法如下图所示:记得输入合约地址框不要加"" 哦。

4.参考文档
1),REMIX调试英文官网文档 2), SOLIDITY语言官网中文版
尊重知识输出,如需引用,敬请说明本文链接和作者-笔名辉哥。