アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

sol-trace - truffleのtestでエラー行を表示する

今回はみんなが待ち望んでいたと思われる非常に便利なツールを紹介します。
それがこちら。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

実行結果

f:id:y_nakajo:20180803235808p:plain

うまく動かない時

build/contracts/以下を全て削除して、truffle compileし直してみてください。

まとめ

Solidityの開発環境はかなり揃ってきていて、昔に比べても非常に開発がしやすくなってきました。しかし、今現在においてもtruffleでtestを実行した際にrevert errorが発生した時に、その発生箇所を通知することができません。
今まではrevert errorが起きた場合は、コードをコメントアウトしてどこまで通るかtry & errorで試すという昔ながらのデバッグ方法しかありませんでした。。。。

今回のツールを使うことで、revert error発生時に問題のソースファイルと発生箇所まで教えてくれるので格段にデバッグ作業がやりやすくなったと思います。
作者の@jdkanani に今後の拡張予定を聞いたところ invalid opcodeなどにも対応すると言っていたので非常に楽しみです!

今回はデバッグ用ツールの拡張を行うためにSolidity及びEVMのdebugger周りのことをかなり詳しく調べました。そのおかげで、debuggerがどのように作られているのかかなりの知見を得られましたので、また後日改めてそのあたりの内容をまとめたいと思います。