1. 開発環境の準備
Truffleとは、ブロックチェーンのためのテスト・フレームワークとアセットパイプラインを提供する開発環境です。
Ganacheはコントラクトのデプロイ、アプリ開発、そしてテストの実行に使用することができる、パーソナルブロックチェーンです。
2. Truffleの使用方法
Truffleは、ブロックチェーンのためのテスト・フレームワークとアセットパイプラインを提供する開発環境です。このステップで基本知識を学んでみましょう。
Truffleを使えば, Solidityスマートコントラクトのコンパイル, JavaScriptを使ったブロックチェーンへのデプロイ、JavaScriptテストスーツの生成、そして統合型コンソールを使ってコントラクトとインタラクトすることができます。
1 2 3 4 5 6 7 |
truffle init # Creates an empty truffle project truffle unbox package # Clones an existing Truffle packaged project truffle develop # Starts truffle in-memory blockchain truffle compile # Compiles Smart Contracts truffle migrate # Deploys Smart Contracts to the configured blockchain truffle console # Starts a web3 console |
3. 新たなTruffleプロジェクト生成
- 新たなフォルダーを開きます。
123mkdir simple-storagecd simple-storagetruffle init
- Truffleプロジェクトを初期化します。
1truffle init
- ターミナルに次のような結果が表示されれば, このステップは成功です。
12345678910✔ Preparing to download✔ Downloading✔ Cleaning up temporary files✔ Setting up boxUnbox successful. Sweet!Commands:Compile: truffle compileMigrate: truffle migrateTest contracts: truffle test
次のようなファイルストラクチャを確認することができます:
├── contracts
│ └── Migrations.sol
├── migrations
│ └── 1_initial_migration.js
├── test
└── truffle-config.js
エディター例:
- ./contracts: すべてのスマートコントラクトはこのフォルダーに保存されます。
- ./migrations: デプロイスクリプトはこのフォルダーに保存されます。
- ./test: テストスクリプトはこのフォルダーに保存されます。
- ./truffle-config: Truffleの設定ファイルです。ここでインタラクトするネットワークを設定できます。
4. ブロックチェーンのローカル実行
- コマンドの実行:
1truffle develop - すでに生成されており利用可能なアカウントのリストを確認することができます:ブロックチェーンが実行されているポート(9545) も確認することができます。これはインメモリ・ブロックチェーンなので、他のユーザーが自動的に接続およびインタラクトすることはできません(テスト目的)。
123456789101112131415161718192021222324252627Truffle Develop started at http://127.0.0.1:9545/Accounts:(0) 0xb837f8e08a0582d40ac632906d45c089e421c3d2(1) 0x603aed64ca34f6749547ccc5f63241b15bf83c65(2) 0xea018f39c44c05188ccb916a2e98030e47f24d13(3) 0x1f3c5e719b1bbf6d02b46e90e579f93878efeeb5(4) 0xfb4ba2d0bde6d326214fb87b547657867cf86486(5) 0x34748138a9ff335843fad142103c2e6c786507d1(6) 0xc8e8c761d85c972ff8f08b38af50da26616549aa(7) 0xbcb7e6dd3f1967dcc0530b4f91c2abdc33e47b89(8) 0x1df83e0c4ffca4be573bb53e36108c85ef5f2a72(9) 0x0ccfcda6703dd112765ded666ee5b374eb9af0efPrivate Keys:(0) 714efac1672e54ac92a9c3d7fd0ede615a1a3d67940141f651c865c9fdf8a1b5(1) 4d4e6e4af17c594db05408d7bc57bf879bb24831ff608c5b348ff1f791f066e4(2) 94a7dde10356ff9ab8847f9f0fb8c0dd384ae39fbf978b70ae2b6826187a3ec5(3) 1643f36d4cc67122908f57f35381c8c20f33b44191889f0be918666cceff1013(4) 569225d5a9e77188ddd8031c5e2a9d1e666d039a8161eec70b4ac24f22ee5182(5) 26b648fad394391cf913a97a26031b0e063fe21f4271d51d3a19f94462ce0298(6) 3d710683d909cac4c3ba6e734f2562536e8d9abe7d42ded7f48d31dbcf648451(7) 0b99400dde58a4beba436848349a71fdd95f9bd61dab0a24ae0d8e675fabca5f(8) 550fc919aa9786535d4ee20caff1deababc900e6ad2749e94bd1f3d64c9d5549(9) 22be4e16a0fc59241706511c4bcb61402590ce9053068d73708823e9c185bbbbMnemonic: praise artist olive cat anxiety crawl garden always horror burden nuclear sweet⚠️ Important ⚠️ : This mnemonic was created for you by Truffle. It is not secure.Ensure you do not use it on production blockchains, or else you risk losing funds.truffle(develop)>
このコンソールを閉じないでください! すべてのデータが消失されます!
ブロックチェーンネットワークに接続するには、ノードRPCエンドポイントを使用するようにTruffleを設定する必要があります(後のステップで確認)。
5. 最初のコントラクトを生成
- Truffle開発コンソールで、このコマンドを実行し新しいコントラクトを作成します:
1truffle(develop)> create contract SimpleStorage - 新たなSimpleStorage.sol ファイルをコントラクトフォルダーで確認することができます:
- このファイルで, 次の行を入力してください:
123456789101112131415pragma solidity ^0.5.0;contract SimpleStorage {address private deployer;uint private storedData;constructor() public {deployer = msg.sender;}function set(uint n) public {if(msg.sender == deployer)storedData = n;}function get() public view returns (uint) {return storedData;}}
6. ブロックチェーンネットワークへのデプロイ
次に、コントラクトをデプロイスクリプトに取り込みます。スクリプトはマイグレーションフォルダーにあります。
新しいマイグレーションフォルダーを作成し、「2_simple_storage.js」という名前を付けてみましょう。
- 下記のようなコードを入力します:
1234var SimpleStorage = artifacts.require("./SimpleStorage.sol");module.exports = function(deployer) {deployer.deploy(SimpleStorage);}; - Truffleコンソール内でコントラクトをコンパイルするためには、次のコマンドを実行してください:
1truffle(develop)> compile12345> Compiling ./contracts/SimpleStorage.sol> Artifacts written to /Users/huangxu/Project/test-contrast/build/contracts> Compiled successfully using:- solc: 0.5.8+commit.23d335f2.Emscripten.clangtruffle(develop)>
Solidityコンパイラは、プロジェクトのコントラクトフォルダー内のすべての.solファイルをコンパイルします。このコンパイルは、ビルドフォルダーの.jsonファイルに保存されます。このファイルを見ると、バイトコードと呼ばれるフィールドを確認することができます。このバイトコードはブロックチェーンに保存されるデータであり、コントラクトプログラムです。
- ついに、ローカルネットワークにコントラクトをデプロイします:
1truffle(develop)> migrate - ターミナルは以下のような詳細を出力します:
1234567891011121314151617181920212223242526272_simple_storage.js===================Deploying 'SimpleStorage'-------------------------> transaction hash: 0x52241c35862f25370d3b6661c71f03604c136fd74309f2293320b1f251410f2d> Blocks: 0 Seconds: 0> contract address: 0x159535cd09d0afEf39534B75B6cE1809b90789CD> block number: 3> block timestamp: 1560935070> account: 0xb837f8E08A0582d40Ac632906D45c089e421c3D2> balance: 99.99088018> gas used: 152575> gas price: 20 gwei> value sent: 0 ETH> total cost: 0.0030515 ETH> Saving migration to chain.> Saving artifacts-------------------------------------> Total cost: 0.0030515 ETHSummary=======> Total deployments: 1> Final cost: 0.0030515 ETHtruffle(develop)> compileCompiling your contracts...===========================> Everything is up to date, there is nothing to compile.
7. スマートコントラクトとインタラクト
Truffleコンソールは最も単純なブロックチェーン開発関数を実装しているベーシックJavaScriptパイプラインです。
コントラクトのインスタンスを取得してみましょう!マイグレーションでは, コントラクトインスタンスの名前をSimpleStorageと定義しています。この名前は、マイグレーションで宣言された名前です。このインスタンスを取得して、インタラクトしていきます。
- SimpleStorageコントラクトのインスタンスを取得します。
123truffle(develop)> var SimpleStorageundefinedtruffle(develop)> SimpleStorage.deployed().then(instance => simpleStorage = instance) - get() メソッドをコールし、コントラクトのストレージを取得します。
12345truffle(development)> simpleStorage.get()truffle(develop)> simpleStorage.get()<BN: 0>truffle(develop)> simpleStorage.get().then(bn => bn.toNumber())0 - 次はストレージを修正してみましょう。コントラクトのストレージを修正するためには、ガスを支払わなければなりません。このガスは、アカウントバランスから差し引かれます。
1truffle(develop)> simpleStorage.set(10) - レスポンスを確認しましょう。
1234567891011121314151617181920212223242526truffle(develop)> simpleStorage.set(10){ tx:'0xa05ef4e8fbb601cddfc084ba5c4aca06507bd00a7aa31d5ae26f8b4a2147538e',receipt:{ transactionHash:'0xa05ef4e8fbb601cddfc084ba5c4aca06507bd00a7aa31d5ae26f8b4a2147538e',transactionIndex: 0,blockHash:'0xb99937be8b6d8208cc663dff19a045422e78bcdeed8ae276e86fb56e57c8cfd9',blockNumber: 5,from: '0xb837f8e08a0582d40ac632906d45c089e421c3d2',to: '0x159535cd09d0afef39534b75b6ce1809b90789cd',gasUsed: 41957,cumulativeGasUsed: 41957,contractAddress: null,logs: [],status: true,logsBloom:'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',v: '0x1c',r:'0xb614f48e69e63a5228f6547321e43afb798a42c77a4812bc20fc1af99dfa8be9',s:'0x3bf9e53b64baa6e8d52e8028e3db3c2f99b2be585359ed190652f8023b4cb437',rawLogs: [] },logs: [] } - 実行を確認するために, ステップ2をもう一度実行してストレージが変更されたことを確認しましょう。
8. RSK上のスマートコントラクト
8.1 RSKアカウントの取得
RSKウォレットを生成するにはこちらのウェブアプリケーションを使ってください: https://iancoleman.io/bip39/. これは本当のウォレットとして使用されるものではありません; (秘密鍵を生成する安全な方法ではありません)。基本知識を学ぶためだけに使われます。
- 「Generate a random mnemonic」のボックスで「12」選択、生成します。
- 「Generate」をクリックします。
- 「BIP39 Mnemonic」のボックスに結果が表示されます。下記の画像のような12のランダムな単語が表示されます:
8.2 TruffleにRSKパブリックノードを接続
RSKに接続するために, Truffleの設定を変更します。ここでは、任意のネットワークに接続できるプロバイダを使用しますが、アカウントのロックはローカルで解除します。truffle-hdwallet-provider (Node >= 7.6)を使用します。
1 2 |
npm install truffle-hdwallet-provider |
Truffleプロジェクトのtruffle-config.js ファイルを開き、次のコードを上書きします:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var HDWalletProvider = require('truffle-hdwallet-provider') var mnemonic = 'rocket fault regular ... YOUR MNEMONIC';// 12 key words we generated before var publicNode = 'https://public-node.testnet.rsk.co:443'; module.exports = { networks: { rsk: { provider: () => new HDWalletProvider(mnemonic, publicNode), network_id: '*', gas: 2500000, gasPrice: 183000 } }, compilers : { solc: { version: "0.5.0", evmVersion: "byzantium" } } } |
ここでは、TruffleにRSKパブリックテストノードての接続を命令し、先ほど生成されたアカウントの制御を行っています。 “GasPrice” はネットワークに払う手数料の価格であり, “gas”とはトランザクション生成時に支払われるガスの最大値を示します。それぞれの数値はRSKネットワークで使用されているデフォルトです。これらの数値を間違って設定する場合、トランザクションがマイニングされなかったり、余分な資産が浪費される場合があります。
接続を確認するために、Truffleコンソールを開いてみましょう。
1 2 |
truffle console --network rsk truffle(rsk)> web3.eth.getBlockNumber((err, res) => console.log(res)) |
アウトプット:
1 2 3 |
truffle(rsk)> web3.eth.getBlockNumber((err,res)=>console.log(res)) 655215 655215 |
なぜweb3.eth.blockNumberではないのでしょうか?ノードに接続するプロバイダを使用する時は、非同期的でなければならないからです。
このコンソールを閉じないでください。次のステップでも使用します。
8.3 RSKアカウントで資産を取得
アドレスを確認しましょう。下記のコードをコンソールに入力し、ニーモニックでどのようなアドレスがアンロックされたか確認しましょう。
1 |
truffle(rsk)> web3.currentProvider.wallets |
アウトプット:
1 2 3 4 5 6 |
{ '0xf08f6c2eac2183dfc0a5910c58c186496f32498d': p { _privKey: Buffer 92 c2 63 53 05 ad a8 d4 61 b9 ff 6f 37 12 d2 fa 53 c8 a6 02 29 91 9b d6 d3 3e 89 55 a4 02 b9 70, _pubKey: Buffer f0 b5 45 f3 9e 4e 4b 5b b0 fd 54 c5 dc cb d6 74 fc 9b 2f 5e d7 e1 50 3e 00 8a d3 d8 f5 95 83 cf 02 cf 11 25 c7 21 1b 56 2a fa 63 62 5a 9e 8f 7d 42 ef ... } } |
先ほど言及した設定はすでに使用されているため、使用可能なウォレットは一つだけです。コンソールの変数に保存しましょう。すぐにまた使います。
1 2 3 4 |
truffle(rsk)> var account = Object.keys(web3.currentProvider.wallets)[0] undefined truffle(rsk)> account '0xf08f6c2eac2183dfc0a5910c58c186496f32498d' |
RSK テストネットは無料のネットワークです。このネットワークを使って資産を取得するために、ファセット(faucet)を利用しましょう。ファセットとは、自分のアドレスを入力すれば、テスト目的のテストネット資産が自動的に送信されるサイトです。RSKファセットを使ってみましょう: https://faucet.testnet.rsk.co.
使用手順:
- 先ほど取得したアドレスを入力します。
- 表示されたコードを入力します。
- フォームを提出します。
これでテスト目的のRBTCが送信されます。
コンソールで残高を確認しましょう:
1 2 3 |
truffle(rsk)> web3.eth.getBalance(account, (err, res) => console.log(res)) 999969677083000 '999969677083000' |
8.4 デプロイとインタラクト
コントラクトをデプロイをするために、ローカルネットワークで実行したものと同じようなステップを実行します。今回はパブリックネットワークにも発行されるため、もう少しだけ時間がかかります。
ステップ1:
1 2 3 4 5 6 7 8 |
truffle(rsk)> compile -all Compiling your contracts... =========================== Compiling ./contracts/Migrations.sol Compiling ./contracts/SimpleStorage.sol Artifacts written to /Users/huangxu/Project/test-contrast/build/contracts Compiled successfully using: - solc: 0.5.0+commit.1d4f565a.Emscripten.clang |
注意: ビルドフォルダーがクリーンであることを確認してください。そうでない場合、次のようなアウトプットが表示され、ファイルがコンパイルされません:
1 2 3 |
Compiling your contracts... =========================== Everything is up to date, there is nothing to compile. |
ステップ2:
1 |
truffle(rsk)> migrate --reset |
デプロイに時間がかかる場合があります。
すべてが完了すれば、次のようなアウトプットが確認できます:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Compiling your contracts... =========================== Everything is up to date, there is nothing to compile. Starting migrations... ====================== Network name: 'rsk' Network id: 31 Block gas limit: 0x67c280 1_initial_migration.js ====================== Deploying 'Migrations' ---------------------- transaction hash: 0x2df2adf812bde74e8b4db1658441e337992a87b20b200d0b30d3bd4d4a8db2cb Blocks: 2 Seconds: 84 contract address: 0x27365a439d71E389154175F3c84C6f1E34cc2f3C block number: 655395 block timestamp: 1561007105 account: 0xF08f6c2Eac2183DfC0a5910C58c186496f32498D balance: 0.000999917550631 gas used: 284844 gas price: 0.000183 gwei value sent: 0 ETH total cost: 0.000000052126452 ETH Saving migration to chain. Saving artifacts ------------------------------------- Total cost: 0.000000052126452 ETH 2_simple_storage.js =================== Deploying 'SimpleStorage' ------------------------- transaction hash: 0xad292ede26df2e43c7938651c147c0199375fb9d3038a8ad22e99fea71ffc423 Blocks: 3 Seconds: 85 contract address: 0x89dEed0dDDb72e282F52478ba21c562B556a4851 block number: 655399 block timestamp: 1561007260 account: 0xF08f6c2Eac2183DfC0a5910C58c186496f32498D balance: 0.000999879535492 gas used: 165699 gas price: 0.000183 gwei value sent: 0 ETH total cost: 0.000000030322917 ETH Saving migration to chain. Saving artifacts ------------------------------------- Total cost: 0.000000030322917 ETH Summary ======= Total deployments: 2 Final cost: 0.000000082449369 ETH |
一度コントラクトがデプロイされれば、プライベートブロックチェーンと同じようにデプロイされた() メソッドを利用することができます。コントラクトとのインタラクションはRSK Testnet explorerで確認できます。作成されたコントラクトとの全てのインタラクションがイクスプローラーで確認することが可能です。
さらなる詳細はこちらを参照してください。