スマコン監査ツールMythXの使い方(Truffle編)


#はじめに

今回は、solidityでスマートコントラクトを書いて、Dappsを作りたい！
DeFiで俺も一稼ぎしたい！という人に必須な、スマコン監査ツール、MythXの使い方を紹介していきます。

Dappsを作る場合でなくとも、solidityでスマートコントラクトを書き、Ethereumにコードをデプロイしようという人は、皆、監査ツールを使って、コードに脆弱性がないかを確かめてからデプロイするようにしましょう。
全世界のEthereumノードのストレージに、あなたが生んだ不具合のあるコードを置くことはしたくないはずです。
世界にゴミをポイ捨てするようなものです。全世界に公開されて一生残るポイ捨てですよ！

監査ツール！！使っていきましょう。

##アジェンダ
- MythXとは
- MythXのアカウント作成
- 監査環境の用意
- MythX実行のための設定

##MythXとは
MythXとは、Consensysが提供しているスマートコントラクトのコード監査を行うためのツールです。Consensysに買収される前はMythrilという名前でした。
基本的には無料のプランと、それとは別にMythX Proという二つのプランが存在しています。
VScodeのプラグインとして組み込んで利用することもできるので、開発しながら随時脆弱性がないかチェックしたり、会社として大きめのプロダクトを作る、という場合は別ですが、小規模な個人で用意したコードであれば、全然無料プランで問題ないです。

公式サイト:https://mythx.io/

今回の記事ではTruffleを用いたコントラクトのデプロイ開発環境にMythXを用いてコード監査を行うことができるnodeモジュールを追加して、使う方法を紹介していきます。

##MythXのアカウント作成
早速アカウントの作成をして行きます。
MythXのアカウント登録には、メールアドレスとEthereumのアドレスの2つが必要です。
アカウント登録の際に使うEthereumアドレスはMetamaskから参照する手順となっているので、Metamaskを扱うことのできる環境のブラウザから登録フォームに接続しましょう。

まずは、登録するメールアドレスを入れて、適当に人間であることを証明してください。

<img width="1068" alt="スクリーンショット 2019-12-16 3.01.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124904/bc104ed9-36b5-7ae3-dc69-67fa906ec847.png">

COMPLETE REGISTRATION
を押すと、Metamaskが立ち上がり、署名を求めて来ます。
<img width="359" alt="スクリーンショット 2019-12-16 3.07.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124904/c472d70f-fcdd-873f-4a0f-aa182145e9d3.png">

署名を行うと、次の画面が出ます。表示される赤字のパスワードはしっかりと控えておいてください。
<img width="1046" alt="スクリーンショット 2019-12-16 3.08.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124904/76b06c1e-8110-4525-297c-cec160f4dbe1.png">

これで先程登録したメールアドレスに、確認のメールが飛んでいるはずなので、
認証をしてあげてください。

これにてMythXのアカウント作成は終わりです。
今後ログインする場合は、Metamaskのアカウントを用いて、署名するだけで簡単にログインできるようになります。

ログインすると以下のようなダッシュボードが出ます。
![スクリーンショット 2019-12-16 21.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124904/131c7feb-6894-c8fa-c503-ad4946296c91.png)
無事アカウントの作成ができました。


##開発環境の用意
Truffleの開発環境を用意してください。
ここら辺の記事がおすすめです。
Truffleからデプロイをする際の秘密鍵は、MythXに登録したアドレスのものを使ってくださいね。

【Truffle5.0対応】シンプルなERC20トークンを作成しよう！
http://kojiryo.com/968/

INFURA.IOを利用してみる
https://qiita.com/SAengineer/items/4369e6d5cf843d449430

**Nodeのバージョンが、12系だと以下のようなエラーがでるかもしれません。その場合は10系にバージョンを落としてみてください**

```
Error: The module '/Users/hogehogeman/node_modules/scrypt/build/Release/scrypt.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 64. This version of Node.js requires
NODE_MODULE_VERSION 72. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
```

##インストール！

Truffleのプロジェクトフォルダでtruffle-securityモジュールをインストール

```
$ npm install truffle-security
```

これが成功すると、自動的にtruffle.js(もしくはtruffle-config.js)に

```
module.exports = {

  // ...

    plugins: [ "truffle-security" ],

  // ...

};
```

とプラグインが追加されているはずです。なければ足してあげましょう。

これで準備は完了です。おそろしく簡単！！

## MythXを実行！

フォルダ内にある全てのsolidityファイルを監査する場合は以下を実行

```
$ truffle run verify
```

個別のファイルを監査したい場合はファイルを指定してあげてください。

```
$ truffle run verify contract.sol
```

無事実行されると、それぞれのsolidityファイルを読み込んで、監査の進捗状況が表示されます。

こんな感じ
<img width="895" alt="スクリーンショット 2019-12-16 21.40.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124904/004aa9bb-8e55-2337-da6d-15f115198825.png">

監査が終了すると、どのファイルにどの程度の脆弱性があったのかの一覧を出してくれます。

```
║ Line     │ Column   │ Type     │ Message                                                │ Rule ID              ║
╟──────────┼──────────┼──────────┼────────────────────────────────────────────────────────┼──────────────────────╢
║ -1       │ 0        │ warning  │ Upgrade to MythX Pro to unlock the ability to test     │ N/A                  ║
║          │          │          │ for even more vulnerabilities, perform deeper          │                      ║
║          │          │          │ security analysis, and more.                           │                      ║
║          │          │          │ https://mythx.io/plans                                 │                      ║

╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ 0 Errors                                                                                                       ║
╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║ 1 Warning                                                                                                      ║
╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
```

各ファイルごとのレポートもURLとして吐いてくれるので詳細を知りたい場合は、そのURLに飛んで見てみましょう。
以下のように詳細を出してくれます。
IDの所に書いてあるSWC-103っていうのは、監査の時にツールが見て、このファイルの中で見つけた脆弱性の規格の一つのこと。Severityはlowとのことなので、一応心配はないはず。
<img width="1423" alt="スクリーンショット 2019-12-16 21.45.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124904/b18e95a1-c492-92e3-fd87-4b759c82f85a.png">

以上がMythXのTruffleでの使い方でした。

## 最後に

Truffleを既に扱っている人からすれば、びっくりするぐらい簡単に監査ツールが使えるようになったと思います。

すごいぜMythX

すごいぜConsensys

MythXを使って脆弱性のないコードを書いて世界を変えていきましょう。

## 一番読んで欲しい所
そんな凄いコード監査ツールを作ってしまっているMythX,Consensysと提携している
***HashHubでは、エンジニアを募集しております。***

Consensysとも協力しながら、ブロックチェーン事業をゴリゴリ進めていますので、興味のある方はぜひWantedlyの方を覗いてみてください！

Wantedly：https://www.wantedly.com/companies/hashhub/projects

提携プレスリリース:https://prtimes.jp/main/html/rd/p/000000014.000033743.html


##参照
MythXによるスマートコントラクトの脆弱性検知-Yuya Sugano
https://link.medium.com/wIYKVSpSs2