今回はみんなが待ち望んでいたと思われる非常に便利なツールを紹介します。
それがこちら。sol-traceです!
github.com
Readme.mdを見て分かる通り、truffleのtestに組み込むことでrevertが発生した時に、エラーの対象のソースファイルと行数を表示してくれます!
ちなみに、上記のバージョンだとviewやpureなどのconstantな関数を呼び出した時には反応しなかったので、eth_callでも行数が表示されるように修正してPRを出しています!
github.com
以下、使い方を簡単に説明します。
インストール
npm i nakajo2011/sol-trace#pre_release
# pre/eth_call_stack_traceはとりあえず動かすようにbuild済みのファイルを含んだrepositoryです。
2018/09/14追記: 先行配布用にpre_releaseを作りました。今後は修正をこのブランチにmergeしていきます。
truffle testに導入
導入したいtestの先頭行に以下を追加します。
es 記法(要babel)
import { injectInTruffle } from 'sol-trace' injectInTruffle(web3, artifacts)
babel不要バージョン
const injectInTruffle = 'sol-trace'.injectInTruffle injectInTruffle(web3, artifacts)
新しいganache-cliを入れる
現状、ganache-cli@6.1.6以上のバージョンでしか'eth_call'時のtraceができないので最新版を入れましょう。
npm i ganache-cli
ganache-cliに接続してtestを動かす
truffle.jsにganache-cliとの接続設定を追加します。
truffle.jsの設定
module.exports = { networks: { live: { host: "127.0.0.1", port: 8545, network_id: "*" } } };
ganace-cliに繋げてtestを実行
truffle test --network live
実行結果
うまく動かない時
build/contracts/以下を全て削除して、truffle compileし直してみてください。
まとめ
Solidityの開発環境はかなり揃ってきていて、昔に比べても非常に開発がしやすくなってきました。しかし、今現在においてもtruffleでtestを実行した際にrevert errorが発生した時に、その発生箇所を通知することができません。
今まではrevert errorが起きた場合は、コードをコメントアウトしてどこまで通るかtry & errorで試すという昔ながらのデバッグ方法しかありませんでした。。。。
今回のツールを使うことで、revert error発生時に問題のソースファイルと発生箇所まで教えてくれるので格段にデバッグ作業がやりやすくなったと思います。
作者の@jdkanani に今後の拡張予定を聞いたところ invalid opcodeなどにも対応すると言っていたので非常に楽しみです!
今回はデバッグ用ツールの拡張を行うためにSolidity及びEVMのdebugger周りのことをかなり詳しく調べました。そのおかげで、debuggerがどのように作られているのかかなりの知見を得られましたので、また後日改めてそのあたりの内容をまとめたいと思います。