
目次
はじめに
前回は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コマンドでインストールします。
1 2 |
$ npm install -g truffle |
新規プロジェクト作成
コントラクトアプリを作成していきます。
以下の手順通りにプロジェクトフォルダを作成し、初期化コマンドを実行します。
1 2 3 4 |
$ mkdir SampleContract $ cd SampleContract $ truffle init |
するとプロジェクトフォルダ以下にデフォルトファイルが生成されます。
contractsフォルダに以下のコントラクトコードファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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; } } |
単純にステート変数を持たせて、値を設定または取得するだけのシンプルなコントラクトです。
コントラクトのコンパイル
次にコントラクトをコンパイルします。
1 2 3 4 5 |
$ 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
1 2 3 4 5 6 |
const SampleContract = artifacts.require("SampleContract"); module.exports = (deployer) => { // deployment steps deployer.deploy(SampleContract); }; |
ファイル名は必ず数字から始める必要があり、この数字順にマイグレーションが実行されます。
デプロイ
マイグレーションファイルが作成できたらデプロイを実行します。
以下のコマンドでテスト環境(localhost:9545)が起動し、コンソールモードが使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ 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)> |
マイグレーションを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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... |
コントラクトがデプロイされました。
コントラクトのアドレスは以下の通りです。
1 2 |
SampleContract: 0x345ca3e014aaf5dca488057592ee47305d9b3e10 |
コントラクトオプジェクトを生成します。
コントラクトアドレスはSampleContract.address
でアクセスできます。
1 2 |
sampleContract = SampleContract.at(SampleContract.address) |
コントラクトオブジェクトの中身を見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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 } |
オブジェクトからパラメータや関数にアクセスすることができます。
コントラクトの実行
コントラクトに値を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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: [] } |
設定した値を取得することもできました。
1 2 |
truffle(develop)> sampleContract.get() 'Hello' |
まとめ
Truffleを使ったスマートコントラクト開発を試してみました。
サンプルコードを実行してみるだけならともかく、実際に商用アプリを開発する場合はTruffleのようなフレームワークは必須です。
このまま開発環境が整ってくればスマートコントラクトの開発がもっと盛り上がるかもしれませんね。
スマートコントラクトのDevOpsをもっと研究していきたいと思います。
それでは!