Solidityで書かれたスマートコントラクトを可視化してくれるツールが出てきました。
Pietというツールでとても使いやすく、役立ちそうだったので紹介します。
公式の紹介はこちらです。
Pietの使い方
pietはnpmでserverを立ち上げて起動しますが、2019年8月19日現在時点ではまだ安定していないようですので、ライブデモURL(https://piet.slock.it/?container=examples%2Fexport1562664060589.piet.json )にアクセスすると簡単に試せます。
pietの使い方は起動した後、
のいずれかを選んでSolidityファイルを読み込みます。
.solファイルが格納されているgithubリポジトリのURLを設定する場合、piet起動URLの後ろに以下3つのパラメータを設定します。
- gitHubUser=
- gitHubRepo=
- subDir=
ブログではライブデモの例として以下URLを設定しています。
https://piet.slock.it/?gitHubUser=gnosis&gitHubRepo=safe-contracts&subDir=contracts
MCHのHeroトークンコントラクトを可視化してみる
世界一位ブロックチェーンゲームのMyCryptoHeroesのHeroトークンコントラクトを可視化してみます。
コントラクトのSolidityコードはEtherscanで公開されていますので、このコードを保存してPietにロードさせます。
https://etherscan.io/address/0x273f7f8e6489682df756151f5525576e322d51a3#code
約1200行の長いコードなのですが、このようにとてもわかりやすく可視化されます。
これから、何が可視化されるのかをみていきます。
継承構造の可視化
Solidityはオブジェクト指向言語です。
pietでは矢印で継承構造が表現されます。次の画像ではHeroAssetコントラクトが、ERC721MintableコントラクトとERC721Pausableコントラクトを継承している事が分かります。
かなり分かりやすいですね。
状態変数、関数、修飾子、イベントの可視化
右側で可視化されたコントラクトをクリックすると、コントラクトの構成要素である状態変数(State Variables)、関数(Functions)、修飾子(Modifiers)、イベント(Events)を表示してくれます。
左画面からは、HERO_TYPE_OFFSET, tokenURIPrefix, heroTypeSupplyLimitという状態変数があるのが分かりますね。実際のコードは以下で、状態変数としてそれぞれ定義しています。
contract HeroAsset is ERC721Mintable, ERC721Pausable { uint16 public constant HERO_TYPE_OFFSET = 10000; string public tokenURIPrefix = "https://www.mycryptoheroes.net/metadata/hero/"; mapping(uint16 => uint16) private heroTypeToSupplyLimit; constructor() public ERC721Full("MyCryptoHeroes:Hero", "MCHH") {}
定数の中の値(HERO_TYPE_OFFSETの10000)まではpietでみられませんが、定数までは表示されます。
修飾子(Modifiers)とイベント(Events)も表示されます。修飾子は関数を叩ける条件(権限など)で、イベントはログを記録するための実行コードです。このHeroAssetコントラクト自体には修飾子とイベントがなかったので、スクリーンショットでは継承されたものを表示しています。通常の内容は黒字ですが、継承された内容はグレーで表示されます。
ドキュメントの自動生成
Solidityコントラクトを元に、簡易的なドキュメントを自動生成してくれます。
修飾子やイベントはドキュメント化してくれないものの、関数については関数名、引数と返り値のドキュメントを自動生成してくれます。
まとめ
Pietはコントラクトから構造を可視化してくれてとても分かりやすくしてくれます。また、ドキュメントまで自動生成してくれます。コントラクトの設計を考える時に他コントラクトを可視化しながら参考にしたり、完成したものをドキュメント化する時に使ったりと色々使えると思います。