目次
はじめに
実用的なスマートコントラクトを実装しようとすると、セキュリティーリスクが大きな課題です。
作成者の意図しないバグで取り返しのつかない大きな損害を引き起こしてしまう可能性もあります。
今回はSolidityで書かれたコントラクトを簡単に可視化して、脆弱性が無いかどうかを直感的に判断するのに役立つツールを紹介します。
動作環境
- macOS High Sierra 10.13.3
- solgraph 0.2.6
- graphviz version 2.40.1
solgraphとは
Solidityコントラクトの処理フローを、DOT言語と呼ばれるデータ記述言語で出力するツールです。
関数をノードとしてグラフ表示することができます。
また、ノードの色によって関数の定義が可視化され、各関数の潜在的な危険度が分かるようになっています。
- Black
パブリック関数 - Gray
インターナル関数 - Red
外部アドレスに送信する関数 - Blue
コンスタント関数
コントラクトを可視化
それではツールを使用して見ましょう。
solgraphをインストール
1 |
$ npm install -g solgraph |
コントラクト(.sol)ファイルを準備
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
contract MyContract { uint balance; function MyContract() { Mint(1000000); } function Mint(uint amount) internal { balance = amount; } function Withdraw() { msg.sender.send(balance); } function GetBalance() constant returns(uint) { return balance; } } |
DOT形式で出力
1 2 3 4 5 6 7 8 9 10 |
$ solgraph MyContract.sol > MyContract.dot strict digraph { MyContract Mint [color=gray] Withdraw [color=red] UNTRUSTED GetBalance [color=blue] MyContract -> Mint Withdraw -> UNTRUSTED } |
Graphvizをインストール
Graphvizはグラフ作成用のツールで、DOTファイルを画像ファイルに変換することが出来ます。
MacだとHomebrewでインストール出来ます。
1 |
$ brew install graphviz |
バージョン確認できればインストール成功
1 2 |
$ dot -V dot - graphviz version 2.40.1 (20161225.0304) |
画像ファイルへ変換
pngファイルへ変換します。
1 |
$ dot -Tpng MyContract.dot > MyContract.png |
コントラクトコードの潜在的な危険性を画像ファイルで確認することができます。
最後に
コントラクトコードの安全性はかなり重要な課題です。簡単に使えてかつ直感的にチェックすることができるので、コードの監査にかなり使えるんじゃないかと思います。
現在のバージョンでは複数ファイルにまたがるコントラクトの可視化には対応してないみたいですが、今後の開発に期待です。