このチュートリアルでは、Truffleを使ってEthereumのスマートコントラクトを開発する手順を学びます。
Truffleとは
TruffleはNode.jsベースのEthereum開発フレームワークです。スマートコントラクトの作成、コンパイル、デプロイ、テストに必要なツールがパッケージになっています。ローカルの開発環境またはCI/CDパイプラインで使用されます。
TruffleとRemixの違い
RemixはWebベースのIDEで、ブラウザ上でSolidityのコードを書き、コンパイル、デプロイ、テストすることができます。一方、Truffleはより大規模で複雑なプロジェクトのニーズを満たす機能を提供します。
開発環境の準備
まず、Node.jsをインストールします。Node.jsはJavaScriptランタイムで、TruffleはNode.js上で動作します。今回はNode Version Manager(nvm)を使用してNode.jsをインストールします。
nvmのインストール
Macの場合、Homebrewを使用してnvmをインストールします:
brew install nvm
次に、以下のコマンドを実行してnvmを初期化し、シェルの設定ファイル(.bash_profile
、.zshrc
、.profile
または.bashrc
)に追加します:
echo "source $(brew --prefix nvm)/nvm.sh" >> ~/.zshrc
echo "source $(brew --prefix nvm)/nvm.sh" >> ~/.zshrc
の文法について:
-
echo
:このコマンドは、指定した文字列を出力します。ここでは、"source $(brew --prefix nvm)/nvm.sh"
という文字列を出力しています。 -
"source $(brew --prefix nvm)/nvm.sh"
:source
コマンドは、シェルスクリプトを現在のシェルで実行します。$(brew --prefix nvm)/nvm.sh
は、brew --prefix nvm
コマンドによって得られるパスに/nvm.sh
を結合したものを表します。これにより、nvmの設定スクリプトのパスを取得しています。 -
>>
:この演算子は、左の出力を右のファイルに追加します。もし右のファイルが存在しなければ新規に作成します。ここでは、出力した文字列を.zshrc
ファイルの末尾に追加しています。いわゆるパスを通すってやつです。
ターミナルを再起動または新規に開き、以下のコマンドを実行して最新のNode.jsをインストールします:
nvm install node
nvm use node
Truffleのインストール
次に、NPM(Node Package Manager)を使用してTruffleをグローバルにインストールします:
npm install -g truffle
これでTruffleの準備ができました。
Truffleプロジェクトの作成
以下のコマンドで、新しいディレクトリFirstTruffle
を作成し、その中にTruffleプロジェクトを初期化します:
mkdir FirstTruffle
cd FirstTruffle
truffle init
これにより、新しいTruffleプロジェクトが作成され、基本的なディレクトリ構造と一部の設定ファイルが生成されます。
スマートコントラクトの作成
次に、新しいSolidityのスマートコントラクトを作成します。これをcontracts/SimpleStorage.sol
という名前で保存します。
今回は、Solidityのバージョンを0.8.0
に更新します。また、関数の可視性を明示的にするために、関数get()
にpublic
を付け加えます。
// SPDX-License-Identifier: MIT
このラインは、スマートコントラクトのライセンスを明示しています。SPDXとはSoftware Package Data Exchangeの略で、ライセンス情報を一貫した方法で交換するための標準です。
pragma solidity ^0.8.0;
このラインは、このスマートコントラクトがSolidityのバージョン0.8.0以上で動作することを指定しています。
contract SimpleStorage {
SimpleStorage
という名前の新しいスマートコントラクトを定義します。
uint storedData;
uint
(符号なし整数)型の変数storedData
を宣言します。この変数は、スマートコントラクトの状態を保持します。
function set(uint x) public {
storedData = x;
}
public
な関数set
を定義します。この関数は引数としてuint
を一つ受け取り、それをstoredData
に保存します。
function get() public view returns (uint) {
return storedData;
}
public
なview
関数get
を定義します。この関数は何も引数を受け取らず、storedData
の値を返します。
完成したコードは以下の通りです。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
このコントラクトは非常に単純です。set
関数でuint
値を格納し、get
関数でその値を取得します。
スマートコントラクトのデプロイメント
スマートコントラクトをデプロイするためのスクリプトを作成します。新しいファイルmigrations/2_deploy_contracts.js
を作成し、以下の内容を追加します:
const SimpleStorage = artifacts.require("SimpleStorage");
module.exports = function(deployer
) {
deployer.deploy(SimpleStorage);
};
このJavaScriptファイルは、TruffleにSimpleStorage
コントラクトをデプロイする方法を指示します。artifacts.require()
関数は、コンパイルされたスマートコントラクトの抽象をロードします。
テストの作成
スマートコントラクトをテストするためのスクリプトを作成します。新しいファイルtest/testSimpleStorage.js
を作成し、以下の内容を追加します:
const SimpleStorage = artifacts.require("SimpleStorage");
コンパイルされたSimpleStorage
スマートコントラクトの抽象をロードします。
contract("SimpleStorage", accounts => {
SimpleStorage
に対するテストスイートを定義します。accounts
引数は、利用可能なEthereumアカウントの配列です。
it("should store the value 89.", async () => {
should store the value 89.
という名前のテストケースを定義します。
const simpleStorageInstance = await SimpleStorage.deployed();
デプロイ済みのSimpleStorage
コントラクトのインスタンスを取得します。
await simpleStorageInstance.set(89, { from: accounts[0] });
accounts[0]
からset
関数を呼び出して値89
を保存します。
const storedData = await simpleStorageInstance.get.call();
get
関数を呼び出してstoredData
の値を取得します。
assert.equal(storedData, 89, "The value 89 was not stored.");
取得したstoredData
の値が89
であることを確認します。もし値が89
でなければ、"The value 89 was not stored."
というエラーメッセージを出力します。
});
このテストケースの定義を終了します。
});
このテストスイートの定義を終了します。
完成したコードは以下の通りです。
const SimpleStorage = artifacts.require("SimpleStorage");
contract("SimpleStorage", accounts => {
it("should store the value 89.", async () => {
const simpleStorageInstance = await SimpleStorage.deployed();
await simpleStorageInstance.set(89, { from: accounts[0] });
const storedData = await simpleStorageInstance.get.call();
assert.equal(storedData, 89, "The value 89 was not stored.");
});
});
このテストは、set
関数を使用して値89
を格納し、次にget
関数を使用して同じ値を取得することを確認します。
スマートコントラクトのコンパイルとテスト
作成したスマートコントラクトをコンパイルします:
truffle compile
コントラクトが正しくコンパイルされたら、テストを実行します:
truffle test
テストがパスすれば、スマートコントラクトの実装が正しいことが確認できます。
Truffleのコンソール
Truffleのコンソールを開いて、直接コマンドを実行することができます。開くには、以下のコマンドを使用します:
truffle develop
Truffleのコンソールは対話型のJavaScriptランタイムで、直接スマートコントラクトと対話したり、トランザクションを送信したりすることができます。
参考文献
これらの文書は、Truffleを使った開発の詳細について学ぶための優れたリソースです。特に公式ドキュメントは、Truffleの全ての機能について詳しく説明しています。このチュートリアルでは紹介できなかった詳細な内容も含まれているため、是非一読してみてください。