コントラクトのセキュリティ
週末にブロックチェーン勉強仲間とのもくもく会があり、コントラクトのセキュリティに関して、Ethereum Smart Contract Best Practicesを読み学習しました。
※この記事では特に気になった部分のみ載せておりますので、Solidity開発者の方は本家サイトの一読をオススメします。
Ethereum Smart Contract Best Practicesとは
『Ethereum Smart Contract Best Practices』は、ConsenSys社によって維持管理されているEthererumのSolidity開発者向けのセキュリティに関するドキュメントです。
日本語訳もあります。
Ethereum Smart Contract Best Practices(日本語訳)
また内容としては、少しでもブロックチェーンやEthereumのSolidityに関する知識をもっている方向けの内容となっていると思いますので、初学者の方には下記の書籍をオススメします。
こちらにもベストプラクティスで謳われているセキュリティに関して、攻撃者のコードなど、実演コードレベルで記載してありオススメです。
僕はこの書籍を先に読んでいましたので、より理解が進みました。
推奨される実装について
・関数名に信頼性を明記する(外部呼び出しする関数等にはUntrustedを)
・Transferよりもwithdraw型を推奨する
・pragmaのハットは外してバージョンをロックする
・コントラクトから呼び出されることを意識する
既知の攻撃方法について
・call.value()による送金後に残高を更新している(The Dao事件)
・nowはブロック生成時間となる為、Minerによって操作される恐れがある
・uintが大きな値に近づくか検討する必要がある
・ガスLimitを考慮してもループ処理は危険(複数ブロックに分かれる場合もあり)
リスクの備えについて
・失敗に備える(一般的なアプリ開発と同じ)
・防止策としてサーキットブレーカー等の実装(Paused実装)
・更新可能なコントラクト(decentralaizedとの兼ね合いで議論が必要)
診断ツール
・Mythrilが一番使いやすそう
https://consensys.net/diligence/mythril.html
インストールしてすぐに使えました。
(GithubにはDockerfileがあるのでDockerも可能です。)
$ brew update
$ brew upgrade
$ brew tap ethereum/ethereum
$ brew install leveldb
$ brew install solidity
$ pip3 install mythril
診断用に継承元も含めて一纏めにしたコントラクト.solが必要ですが、
こちらもtruffle-flattenerを使って作成できます。
$ npm install truffle-flattener -g
$ truffle-flattener contracts/JunoToken.sol > Combined.sol
Mythrilでの検証も簡単です。
$ myth -x Combined.sol:JunoToken > analysis.txt
実際に僕が作成したコントラクトで検証しましたが、Orverflowに関する指摘がいくつかありました。。精進します。。
その他
まだ読めていませんが、Loom Networkさんもコントラクトのセキュリティに関して纏めておりましたので要チェックです。
以下、検証ツールのところで参考にさせていただきました。
http:// http://www.blockchainengineer.tokyo/entry/security-mythril-erc20