LoginSignup
0
0

このチュートリアルでは、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;
}

publicview関数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ランタイムで、直接スマートコントラクトと対話したり、トランザクションを送信したりすることができます。

参考文献

  1. Truffleの公式ドキュメント

これらの文書は、Truffleを使った開発の詳細について学ぶための優れたリソースです。特に公式ドキュメントは、Truffleの全ての機能について詳しく説明しています。このチュートリアルでは紹介できなかった詳細な内容も含まれているため、是非一読してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0