Ethereumアプリの開発フレームワークTruffle入門

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
         

はじめに

前回はMistを使ったトークン開発について解説しました。

本格的にスマートコントラクト開発を進めていくために、現在メジャーな開発フレームワークであるTruffleを使ってみます。

動作環境

  • macOS High Sierra Version 10.13
  • Mist Version: 0.9.3
  • Geth Version: 1.7.2
  • truffle: 4.0.4

Truffleとは?

Ethereumアプリケーションの開発フレームワーク。コントラクトのコンパイルやデプロイ、テストなどが可能です。

コントラクトの言語はSolidityで、フロントにReactを使ったテンプレートなども公開されています。

スマートコントラクト系のアプリケーションはWebアプリ開発の知見がどうしても少ないので、先駆者としてコミュニティを引っ張ってくれている存在はありがたいです。

Truffleインストール

早速インストールして見ましょう。

公式通りnpmコマンドでインストールします。

$ npm install -g truffle

新規プロジェクト作成

コントラクトアプリを作成していきます。

以下の手順通りにプロジェクトフォルダを作成し、初期化コマンドを実行します。

$ mkdir SampleContract
$ cd SampleContract
$ truffle init

するとプロジェクトフォルダ以下にデフォルトファイルが生成されます。

contractsフォルダに以下のコントラクトコードファイルを作成します。

pragma solidity ^0.4.18;

contract SampleContract {
    string data;

    function set(string _message) public {
        data = _message;
    }

    function get() public constant returns (string _data) {
        return data;
    }
}

単純にステート変数を持たせて、値を設定または取得するだけのシンプルなコントラクトです。

コントラクトのコンパイル

次にコントラクトをコンパイルします。

$ truffle compile
Compiling ./contracts/Migrations.sol...
Compiling ./contracts/SampleContract.sol...
Writing artifacts to ./build/contracts

コンパイルが完了すると、以下のJSONファイルが生成されます。

./build/contracts/SampleContract.json

マイグレーション

Truffleではコントラクトデプロイをマイグレーションファイルで管理できます。

このマイグレーションファイルはJavaScriptで記述され、コントラクトへ渡すパラメータも定義することができます。

今回はシンプルなマイグレーションファイルを作成します。

./migrations/2_sample_contract_migration.js

const SampleContract = artifacts.require("SampleContract");

module.exports = (deployer) => {
  // deployment steps
  deployer.deploy(SampleContract);
};

ファイル名は必ず数字から始める必要があり、この数字順にマイグレーションが実行されます。

デプロイ

マイグレーションファイルが作成できたらデプロイを実行します。

以下のコマンドでテスト環境(localhost:9545)が起動し、コンソールモードが使えます。

$ truffle develop
Truffle Develop started at http://localhost:9545/

Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de

Private Keys:
(0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3
(1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f
(2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1
(3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c
(4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418
(5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63
(6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8
(7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7
(8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4
(9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5

Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat

truffle(develop)>

マイグレーションを実行します。

truffle(develop)> migrate
Using network 'develop'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x30e12c4b8c42845001fd091715167c460351a0d0aa19a98b328046a5f6f6e7ea
  Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
Saving successful migration to network...
  ... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956
Saving artifacts...
Running migration: 2_sample_contract_migration.js
  Deploying SampleContract...
  ... 0xcf2cb6f3d192e591e8e27bbd82deb30ad7922dbc086f77a0513ea10c925bac71
  SampleContract: 0x345ca3e014aaf5dca488057592ee47305d9b3e10
Saving successful migration to network...
  ... 0xf36163615f41ef7ed8f4a8f192149a0bf633fe1a2398ce001bf44c43dc7bdda0
Saving artifacts...

コントラクトがデプロイされました。
コントラクトのアドレスは以下の通りです。

SampleContract: 0x345ca3e014aaf5dca488057592ee47305d9b3e10

コントラクトオプジェクトを生成します。

コントラクトアドレスはSampleContract.addressでアクセスできます。

sampleContract = SampleContract.at(SampleContract.address)

コントラクトオブジェクトの中身を見てみます。

truffle(develop)> sampleContract
TruffleContract {
  constructor:
   { [Function: TruffleContract]
     _static_methods:
      { setProvider: [Function: setProvider],
        new: [Function: new],
        at: [Function: at],
        .
        .
        .
        estimateGas: [Function: bound ],
        getData: [Function: bound ],
        '': [Circular] },
     allEvents: [Function: bound ] },
  set:
   { [Function]
     call: [Function],
     sendTransaction: [Function],
     request: [Function: bound ],
     estimateGas: [Function] },
  get:
   { [Function]
     call: [Function],
     sendTransaction: [Function],
     request: [Function: bound ],
     estimateGas: [Function] },
  sendTransaction: [Function],
  send: [Function],
  allEvents: [Function: bound ],
  address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
  transactionHash: null }

オブジェクトからパラメータや関数にアクセスすることができます。

コントラクトの実行

コントラクトに値を設定します。

truffle(develop)> sampleContract.set("Hello")
{ tx: '0xa2eec1053700e55ef6524513b50ec42006cbd40717757ec57c80c1c676fb2eb5',
  receipt:
   { transactionHash: '0xa2eec1053700e55ef6524513b50ec42006cbd40717757ec57c80c1c676fb2eb5',
     transactionIndex: 0,
     blockHash: '0x61cf115fca9ae1b752296b88fa00efb5913a9045a737200fcaf15efa9c274319',
     blockNumber: 5,
     gasUsed: 42975,
     cumulativeGasUsed: 42975,
     contractAddress: null,
     logs: [],
     status: 1 },
  logs: [] }

設定した値を取得することもできました。

truffle(develop)> sampleContract.get()
'Hello'

まとめ

Truffleを使ったスマートコントラクト開発を試してみました。
サンプルコードを実行してみるだけならともかく、実際に商用アプリを開発する場合はTruffleのようなフレームワークは必須です。

このまま開発環境が整ってくればスマートコントラクトの開発がもっと盛り上がるかもしれませんね。

スマートコントラクトのDevOpsをもっと研究していきたいと思います。

それでは!

スポンサーリンク

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。