美文网首页
调试以太坊智能合约

调试以太坊智能合约

作者: Simth | 来源:发表于2017-12-13 15:56 被阅读189次

原文:
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
  1. 打开一个新的终端,进入项目根目录,通过如下命令进入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进行单步执行

相关文章

网友评论

      本文标题:调试以太坊智能合约

      本文链接:https://www.haomeiwen.com/subject/banaixtx.html