使用Truffle作smart contract測試及debug - III debug
版本 - truffle 4.1.11
一不小心,就寫到了III...沒有偷文章數的意思阿~~~
不過我在這邊先破題,truffle的debug功能,還在發展中,其實沒有想像中的方便跟powerful,例如在debug的過程還滿常會發生exception的(這還滿常發生的)、無法得知global變數內容...等等。官方一樣有很詳細的解說,可以看這裡。
要debug其實很簡單,先複製你要debug的transaction hash,然後
接著會看到指令
+:可以加觀察的變數
v:就是顯示目前變數的值(global目前都是空值)
一步一步debug就會看到在哪行source code,像是這樣
debug的部分,大概就到這裡,使用的心得是沒有很順手,一個是速度慢(每次debug會重新compile一次),一個是你需要真的debug的地方,常會有exception出現,畢竟還在開發中,不過我自己是滿期待的。
最後提一下truffle console,前兩篇都沒提到,因為truffle console沒有很好用,而且command大部分都有互通,例如
truffle test --> 可以先執行truffle console,在console裡直接執行 test
不過,truffle console裡可以直接執行contract 的function,在測試上也滿方便的,支援的是 js 語法,先打
進到console後,就可以直接執行function
或是你想直接指定某個contract,而不是用最新的那份
成功後,會直接回傳transaction receipt的內容
這系列就到這邊囉,有錯誤的歡迎指正,內容有所不足的,也歡迎一起分享。
之後會找時間研究一下oyente,可以跑code coverage!
一不小心,就寫到了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!
留言
張貼留言