Sūrya(スーリヤ)とは
Sūryaはイーサリアム関連事業を展開するConsesSys社が提供するスマートコントラクトの視覚化ツールです。Sūryaはインド神話に伝わる太陽神スーリヤ(上記画像が開発元で掲載されていたイメージです)がこのツール名の語源になっているようです。(参考:GitHub)複数のスマートコントラクトから構成されるDAppsを解析するときに利用することができます。複数のコントラクトの継承関係や複数のコントラクトに跨って呼び出される関数のフローの図などを複数の色の配色を使ってわかりやすくpngファイル(gifも可能)にして視覚化してくれます。既存のスマートコントラクトのライブラリーや自分以外の人が書いたコードを素早く理解するのに向いています。
Sūryaの使い方
インストール
Sūryaはnpmでインストールすることができます。
~$npm install -g surya
npm WARN deprecated sha1-file@1.0.4: Development of this module has been stopped.
/Users/YukinoriHamada/.nvm/versions/node/v8.15.0/bin/surya -> /Users/YukinoriHamada/.nvm/versions/node/v8.15.0/lib/node_modules/surya/bin/surya
+ surya@0.2.11
added 7 packages from 4 contributors, removed 3 packages and updated 12 packages in 12.877s
「dot」コマンドを利用してグラフを出力する為に、graphvizをインストールする必要があります。まだの方はそちらもインストールしてください。
以降ではopenzeppelinのERC20ライブラリをsuryaを使って簡単化していきます。
継承関係をみる
openzeppelinのERC20ライブラリの継承関係をpngファイルにしていきます。openzeppelinをインストールします。
~$npm install openzeppelin-solidity
npm WARN saveError ENOENT: no such file or directory, open '/Users/YukinoriHamada/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/Users/YukinoriHamada/package.json'
npm WARN YukinoriHamada No description
npm WARN YukinoriHamada No repository field.
npm WARN YukinoriHamada No README data
npm WARN YukinoriHamada No license field.
+ openzeppelin-solidity@2.3.0
updated 1 package and audited 772 packages in 5.983s
found 0 vulnerabilities
ターミナル(シェル)で、インストールしたopenzeppelin内のERC20ディレクトリまでカレントディレクトリを移動します。そして以下のコマンドを実行します。
openzeppelin-contracts$surya inheritance contracts/token/ERC20/*.sol | dot -Tpng > erc20-inheritance.png
実行するとカレントディレクトリ配下に以下のpngファイルが作成されます。以下のファイルを利用することで、oepnzeppelinが実装したERC20の継承関係がとてもわかりやすくなります。
出力できる画像拡張子
png以外にも以下拡張子で出力することが可能です。適宜活用してください。
- gif
- png
- jpg
- jpeg
- bmp
関数のフローをみる
複数のコントラクトによってERC20が実装されていることがわかったので、それらのコントラクト内でどのように関数が定義されて、実行されるのかというフロー図を作成します。以下のコマンドを実行します。作成したpngファイルをみることで、複数のコントラクトで実装されている規格の機能を一覧化でき、どのように呼び出されるかを確認することが可能です。
openzeppelin-contracts$surya graph contracts/token/ERC20/*.sol | dot -Tpng > erc20-graph.png
その他
上記以外にも機能があるため以下のURLより確認してみてください。またこのSūryaの機能は「Visual Stadio Code」の拡張機能としても提供されており、上記で紹介した、機能はVSCodeの拡張機能でより簡単に実行・確認することが可能です。
https://github.com/ConsenSys/surya
VSCode拡張機能
Sūryaを提供するConsenSys社はVSCodeの拡張機能として「Solidity Visual Auditor」を提供しています。まず以下にアクセスして、その拡張機能をインストールしてください。
https://marketplace.visualstudio.com/items?itemName=tintinweb.solidity-visual-auditor
拡張機能は、以下のようにsolidityコードをデコレートして、コードの視認性をあげてくれます。
以下のようにERC20.solファイルのコードの一番上に並んでいる拡張機能のうちから「inheritance」をクリックします。
すると、隣のエディタに以下のようにERC20の継承関係の図が出力されます。1度目は、読み込みがうまく行かず、現れないかもしれないので、その場合は再度「inheritance」をクリックします。また最初は継承関係が全て把握されていないです。なので、関係するコントラクトの継承関係も「inheritance」で、表示させ拡張機能に継承関係の情報を学習させると最終的に以下のように関連するコントラクトの継承関係が全て出力されるようになります。
他にも「graph」を利用することで、関連するコントラクト全ての関数の呼び出しフローが一覧で出力できます。
出力した関数の呼び出しフローが複雑な場合は、個別の関数をクリックすることで、そのフローだけくっきりわかるように表示してくれます。
reportを選択すると以下のように、各コントラクト内の関数の名前・可視性・Mutability(その関数が状態変数を変更できるかどうか)・関数修飾子を表にして出力してくれます。
parseを選択すると、コントラクト内の関数を構成要素(引数や戻り値、関数修飾子、変数、可視性)に分解してくれます。
flatternを選択するとそのコントラクトが継承している全てのコントラクトのコードとそのコントラクトのコードを出力してくれます。
funcSigsを選択するFunction Signature Hashesが出力されます。
まとめ
上記の機能を使いこなすことで、より効率的なスマートコントラクト開発が行えます。VSCodeの拡張機能の場合、ファイルにして出力できないという欠点があります。スマートコントラクトに関する資料を作成する場合は、Sūryaを利用してpngやgifファイルを作成して使用する方が便利です。
GitHub
https://github.com/ConsenSys/surya
免責事項
本記事に掲載されている記事の内容につきましては、正しい情報を提供することに務めてはおりますが、提供している記事の内容及び参考資料からいかなる損失や損害などの被害が発生したとしても、弊社では責任を負いかねます。実施される際には、法律事務所にご相談ください。
技術・サービス・実装方法等のレビュー、その他解説・分析・意見につきましてはblock-chani.jp運営者の個人的見解です。正確性・正当性を保証するものではありません。本記事掲載の記事内容のご利用は読者様個人の判断により自己責任でお願いいたします。