Truffle(トリュフ)は、スマートコントラクトの開発に必要となる、コンパイラ、リンク、デプロイ、バイナリ管理の機能を持つ統合開発管理フレームワークです。
DApps(分散型アプリケーション)開発には必ず通る道ですのでしっかりおさえておきましょう。
- スマートコントラクトのコンパイル、リンク、デプロイ、バイナリ管理
- 迅速な開発を目的とするスマートコントラクトのテスト
- スクリプトで記述できる拡張可能なデプロイとマイグレーションのフレームワーク
- パブリックネットとプライベートネットにデプロイできるネットワーク管理
- ERC190規格を使用したEthPMとNPMによるパッケージ管理
- インテグレーションをサポートする設定変更可能なビルドパイプライン
- Truffle環境内でスクリプトを実行する外部スクリプトランナー
このTruffleフレームワークには、独自コインを作成してアカウント間でやり取りするコントラクトのサンプルがあります。
今回はその中の一つ、「MetaCoin」の実装をやっていきます。
Truffleの環境構築
macOS環境での環境構築をやっていきます。まずは、npmをインストールしていない方はインストールします。
node.jsにアクセスして、[macOS Installer]をクリックし、pkgファイルをダウンロードし、インストールします。
また、Homebrewでもインストール可能です。npmのインストールが完了したら、npmでTruffleをインストールします。
MetaCoinのサンプルコードをダウンロード
下記のコマンドを入力し、ディレクトリを作成してからその中でtruffle unboxコマンドを実行します。
truffle unboxコマンドはTruffleフレームワークが提供するサンプルをローカル環境にに展開するコマンドです。MetaCoin以外にもさまざまなサンプルがTruffle Boxesとして用意されているのでそちらも試してみてください。
コントラクトの解説
ここではダウンロードしたcontractsディレクトリにダウンロードされたMetaCoin.solを確認します。とにかく実装だけしたい方はここは飛ばしても大丈夫です。
①では、mapping型のbalancesを宣言します。keyがaddress型(ユーザーアカウントのアドレス)でvalueがuint型です。MetaCoinをいくら保持しているのかをここで管理します。
また、値変化の過程はブロックチェーンに保存されますが値そのものはブロックチェーン外のState Treeに保存されます。
②では、event型のTransferを宣言します。Transferはアドレス(_from)からアドレス(_to)にいくら(_value)が送金されたか記録します。
このログでウォレットなどがイベントを追跡可能になります。
③にあるコントラクトと同じ名前の関数は、Solidity0.5.0時点でのコンストラクタ関数の定義です。コントラクトが展開されて初期化される際に実行される関数です。①で定義したBalancesに、key = tx.originで10,000を入れます。tx.originはコントラクトを呼び出したアドレスです。このコントラクトを最初に作成したアカウントは無条件に10,000MetaCoinを入手することになります。
④のsendCoinは、送り先アドレスreceiverと送る数量amountを受け取ります。実行するアカウントmsg.senderが保持するMetaCoinをbalancesで確認します。amountよりも少ない場合はfalseを返し、そうでなければ次の処理に続きます。
msg.senderのbalancesからamountを引き、receiverのbalancesにamountを加えたのち、Transferイベントを実行します。実際にsenderからreceiverへamountのMetaCoin増減が発生したことをログに記録します。処理が成功したらtrueを返します。
⑥ではアドレス型のaddrを取得して、balancesに保持するMetaCoinの数量をuintで返しています。その1つ前の⑤でもアドレス型のaddrを取得して、getBalanceInEthでもConvertLibのconvertメソッドを投げてgetBalance(addr)を呼び出しています。
つぎは、呼び出しているConvertLibの内容を確認します。
libraryとして宣言することで、処理自体はライブラリに存在していても、呼び出し元の状態変数を参照可能になります。
convert関数は、uint型のamountとuint型のconversionRateを取り、それらを掛け合わせてuint型のconvertedAmountとして返す関数です。
getBalanceInEthを呼び出す際にgetBalance(addr)と2を渡しているので単純にMetaCoinの数量を2倍したものが返されます。
テストの実行
ターミナルでテストを実行します。SolidityテストとJavaScriptテストをそれぞれ実行します。
これらのテストはコントラクトに対して実行されて、テストの実行内容が表示されています。
コンパイルとマイグレーションの実行
スマートコントラクトをコンパイルします。
Truffleにはテストをのみ使用できる組み込みのパーソナルブロックチェーンがあります。
そのブロックチェーンを作成して、truffle developを使ってインタラクトできます。
ブロックチェーンとやり取りするときに使用できる10個のアカウント(およびそれらの秘密鍵)を示しています。
次にマイグレーションを行います。
これには、展開した契約のトランザクションIDとアドレスが表示されます。また、コストの概要とリアルタイムのステータス更新も含まれています。
デプロイの確認
以上で、Metacoinがデプロイされたので、正常にデプロイされているか確認していきます。
まず、getBalanceを呼び出して、アカウント0が10,000MetaCoinを保持していることを確認します。下記の通り、変数に保存することでMetaCoinのコントラクトを参照できます。
getBalanceを呼びだします。
次のコマンドを入力するとMetaCoinをいくら保有しているかをイーサリアムに変換して確認できます。
アカウント0からアカウント1にMetaCoinを送ります。
送金後に、アカウント0とアカウント1の残高を確認します。
まとめ
今回はTruffleフレームワークの公式サンプルMetaCoinのコントラクト内容を簡単に把握し、デプロイ確認まで行いました。
Truffleはまだまだ学ぶところが多いので気になる方は、引き続き学習を進めていきましょう。