使用Truffle作smart contract測試及debug - III debug

版本 - truffle 4.1.11

一不小心,就寫到了III...沒有偷文章數的意思阿~~~

不過我在這邊先破題,truffle的debug功能,還在發展中,其實沒有想像中的方便跟powerful,例如在debug的過程還滿常會發生exception的(這還滿常發生的)、無法得知global變數內容...等等。官方一樣有很詳細的解說,可以看這裡

要debug其實很簡單,先複製你要debug的transaction hash,然後
$ truffle debug 0x1d8791c26e7aa941c295bed8ed81a3d5fb4790ed9f84a76e2d4341c6c4b09131

接著會看到指令
Commands:
(enter) last command entered (step next)
(o) step over, (i) step into, (u) step out, (n) step next
(;) step instruction, (p) print instruction, (h) print this help, (q) quit
(b) toggle breakpoint, (c) continue until breakpoint
(+) add watch expression (`+:<expr>`), (-) remove watch expression (-:<expr>)
(?) list existing watch expressions
(v) print variables and values, (:) evaluate expression - see `v`
o/i/u/n:一般有在用IDE debug的都知道,就不做解釋
+:可以加觀察的變數
v:就是顯示目前變數的值(global目前都是空值)

一步一步debug就會看到在哪行source code,像是這樣
Token777.sol: 277: if(_to==address(0x00)) return; 278: TokenReceiver x; 279: if(doesContractImplementInterface(_to, x.tokensReceived.selector)) { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

debug的部分,大概就到這裡,使用的心得是沒有很順手,一個是速度慢(每次debug會重新compile一次),一個是你需要真的debug的地方,常會有exception出現,畢竟還在開發中,不過我自己是滿期待的。


最後提一下truffle console前兩篇都沒提到,因為truffle console沒有很好用,而且command大部分都有互通,例如
    truffle test --> 可以先執行truffle console,在console裡直接執行 test

不過,truffle console裡可以直接執行contract 的function,在測試上也滿方便的,支援的是 js 語法,先打
$ truffle console

進到console後,就可以直接執行function
Token.deployed().then(function(instance){return instance.doesContractImplementInterface("0x5bc6...","0x0023de29");});

或是你想直接指定某個contract,而不是用最新的那份
Token.at("0xbd9d44474deeb0d3f8d255b39a8f723f2a7184b7").balanceOf(0x284...);

成功後,會直接回傳transaction receipt的內容
","0xf40994ded2ab0494b679bf964cf7e6d2ceaa9da8","0xf40994ded2ab0494b679bf964cf7e6d2ceaa9da8",10000000000000000,"","");}); { tx: '0x74bdc1877e3871bdd27fab3513fce9e23de0b3204d815d8c7ec5eeee41595e70', receipt: { transactionHash: '0x74bdc1877e3871bdd27fab3513fce9e23de0b3204d815d8c7ec5eeee41595e70', transactionIndex: 0, blockHash: '0xde7920278e710b67d8301b37f466b9836e170291c2932a34afcde5a911504e8e', blockNumber: 110, gasUsed: 34712, cumulativeGasUsed: 34712, contractAddress: null, logs: [ [Object] ], status: '0x01', logsBloom: '0x000000000000000000000000000000000000000000000000000000.....' }, logs: [ { logIndex: 0, transactionIndex: 0, transactionHash: '0x74bdc1877e3871bdd27fab3513fce9e23de0b3204d815d8c7ec5eeee41595e70', blockHash: '0xde7920278e710b67d8301b37f466b9836e170291c2932a34afcde5a911504e8e', blockNumber: 110, address: '0x22b329e798fbef287adf367a837c189ab129759a', type: 'mined', event: 'EvGotToken', args: [Object] } ] }


這系列就到這邊囉,有錯誤的歡迎指正,內容有所不足的,也歡迎一起分享。

之後會找時間研究一下oyente,可以跑code coverage!

留言

這個網誌中的熱門文章

What's New in Ethereum Serenity (2.0)

瑞士滑雪分享2 - 策馬特

動手實做零知識 - circom