原文:
http://truffleframework.com/tutorials/debugging-a-smart-contract
翻译:Smith
一个简单的智能合约
pragma solidity ^0.4.0;
contract SimpleStorage {
uint myVariable;
function set(uint x) {
myVariable = x;
}
function get() constant returns (uint) {
return myVariable;
}
}
这个合约做了两个事
1.设置一个变量值
2.获取一个变量值
部署这个简单的合约
1.创建一个文件夹用来存储该合约demo
mkdir simple-storage
cd simple-storage
2.建立一个truffle项目
truffle init
目录结构如下面所示
contracts migrations test truffle-config.js truffle.js
3.在contracts目录下新建智能合约文件Store.sol,代码如下
pragma solidity ^0.4.0;
contract SimpleStorage {
uint myVariable;
function set(uint x) {
myVariable = x;
}
function get() constant returns (uint) {
return myVariable;
}
}
4.在migrate目录下新建2_deploy_contracts.js,代码如下
var SimpleStorage = artifacts.require("SimpleStorage");
module.exports = function(deployer) {
deployer.deploy(SimpleStorage);
};
5.编译合约
truffle compile
- 打开一个新的终端,进入项目根目录,通过如下命令进入truffle开发模式
sudo truffle develop
显示如下
truffle(develop)>
7.部署合约
migrate
和合约进行交互
truffle(develop)>
1.在上面的终端输入命令
SimpleStorage.deployed().then(function(instance){return instance.get.call();}).then(function(value){return value.toNumber()});
输出结果是0,说明solidity语言声明的变量会自动初始化。
2.调用合约中的set方法
SimpleStorage.deployed().then(function(instance){return instance.set(4);});
3.验证上面的命令
SimpleStorage.deployed().then(function(instance){return instance.get.call();}).then(function(value){return value.toNumber()});
输出4
为了掩饰debug功能,特意设计了如下错误情况
1.无限循环
修改contracts目录下面的Store.sol文件中set方法,如下所示
function set(uint x) {
while(true) {
myVariable = x;
}
}
测试这个合约
在Truffle Develop终端执行如下命令
1.部署合约
migrate --reset
2.为了方便查看log日志,打开一个新的终端,进入项目根目录,执行如下命令
sudo truffle develop --log
显示如下标识正常
Connected to existing Truffle Develop session at http://localhost:9545/
3.在truffle develop模式下测试set方法
SimpleStorage.deployed().then(function(instance){return instance.set(4);});
错误信息如下
Error: VM Exception while processing transaction: out of gas
log日志信息如下
develop:testrpc eth_sendTransaction +0ms
develop:testrpc +1s
develop:testrpc Transaction: 0xd7ff6d16d4c522f8837dd3fd4ae4d52d0d6243eb5e86a1064ea56d7937c2c27d +1ms
develop:testrpc Gas usage: 6721975 +0ms
develop:testrpc Block Number: 6 +1ms
develop:testrpc Block Time: Wed Dec 13 2017 14:43:00 GMT+0800 (CST) +0ms
develop:testrpc Runtime Error: out of gas +0ms
develop:testrpc +0ms
4.debug这个问题使用debug txid命令。
debug 0xd7ff6d16d4c522f8837dd3fd4ae4d52d0d6243eb5e86a1064ea56d7937c2c27d
你将会看到如下输出
Store.sol | 0x345ca3e014aaf5dca488057592ee47305d9b3e10:
1: pragma solidity ^0.4.0;
2:
3: contract SimpleStorage {
^^^^^^^^^^^^^^^^^^^^^^^
debug(develop:0xd7ff6d16...)>
Store.sol | 0x345ca3e014aaf5dca488057592ee47305d9b3e10:
4: uint myVariable;
5:
6: function set(uint x) {
^^^^^^^^^^^^^^^^^^^^^
debug(develop:0xd7ff6d16...)>
按enter进行单步执行
网友评论