- 1. はじめに
- 2. Substrateのインストール
- 3. ノードの起動
- 4. チェーンのカスタマイズ
- 4.1.1. コマンド12. devチェーンの設定をjsonとして出力
- 4.1.2. コマンド13. チェーンの設定ファイルを編集
- 4.1.3. コード1. myspec.json
- 4.1.4. コマンド14. チェーンの設定ファイルをrawフォーマットに変換
- 4.1.5. コマンド15. カスタム設定ファイルでチェーンを起動
- 4.1.6. 図3. minimumPeriod = 5としたときのチェーンの実行結果
- 4.1.7. コード2. myspec.json
- 4.1.8. コマンド16. チェーンの状態ファイルを削除(チェーンのパージ)
- 4.1.9. コマンド17. チェーンの状態ファイルを確認
- 4.1.10. コマンド18. 再度カスタム設定ファイルでチェーンを起動
- 4.1.11. 図4. minimumPeriod = 10としたときのチェーンの実行結果
- 5. 参考文献:
はじめに
本連載では、カスタムブロックチェーンを構築するためのフレームワークであるSubstrateの概要と使い方について、全6回で解説します。
第2回では、Substrateを用いたブロックチェーンのノード構築について解説します。
Substrateのインストール
Substrateは現在アクティブに更新されており、Substrateを利用するには公式レポジトリからコードをダウンロードして自身でビルドする必要があります。
Substrateのビルドには、Rustのインストールが必要です。
macOSやUbuntu、WindowsのWSL(Windows Subsystem for Linux)を用いる場合には、公式で提供されているスクリプト(https://getsubstrate.io/)を用いて、依存するパッケージやビルド、インストールまでを簡単に実行できます。
Substrateの最新レポジトリからデフォルトの機能をすべてインストールするには、下記のコマンドを実行してください。
インストール完了までの時間はお使いのネットワークやハードウェアによりますが、1-2時間程度かかる場合があります。
コマンド1. Substrateのインストール
$ curl https://getsubstrate.io -sSf | bash
簡単にノードの実行やRuntimeの実装を試すだけであれば、–fastオプションを追加して、いくつかのモジュールのインストールを省略できます。
コマンド2. Substrateのインストール(短縮版)
$ curl https://getsubstrate.io -sSf | bash -s -- --fast
–fastオプションを追加すると、グローバルへのsubstrate, subkeyコマンドのインストールが省略されます。
省略した場合でも、あとから追加でインストールできますので、用途に応じて使い分けてください。
substrate, subkeyコマンドの個別のインストール方法を下記に示します。
コマンド3. subkeyコマンドの個別インストール
$ cargo install --force --git \
https://github.com/paritytech/substrate subkey
コマンド4. substrateコマンドの個別インストール
$ git clone https://github.com/paritytech/substrate
$ cd substrate
$ ./scripts/init.sh
$ ./scripts/build.sh
$ cargo install --force --path . substrate
本記事では、substrate, subkeyもインストールされた状態を前提に解説を進めます。
WindowsでWSLを使わずにローカルにSubstrateをインストールしたい場合は、下記の手順を参考にしてください。
https://github.com/paritytech/substrate#61-hacking-on-substrate
ノードの起動
Substrateコマンドが利用できる状態になっていれば、Substrateのデフォルト設定を用いたノードは、下記のコマンドで実行できます。
コマンド5. Substrateのdevelopチェーンを起動
$ substrate --dev
2019-05-27 16:56:16 Running in --dev mode, RPC CORS has been disabled.
2019-05-27 16:56:16 Substrate Node
2019-05-27 16:56:16 version 2.0.0-824ccf3b-x86_64-macos
2019-05-27 16:56:16 by Parity Technologies, 2017-2019
2019-05-27 16:56:16 Chain specification: Development
2019-05-27 16:56:16 Node name: ill-informed-death-9282
2019-05-27 16:56:16 Roles: AUTHORITY
2019-05-27 16:56:16 Initializing Genesis block/state (state: 0x36e3…13e6, header-hash: 0x8f74…872c)
2019-05-27 16:56:16 Loaded block-time = 4 seconds from genesis on first-launch
2019-05-27 16:56:16 Loading GRANDPA authority set from genesis on what appears to be first startup.
2019-05-27 16:56:16 Highest known block at #0
2019-05-27 16:56:16 Using default protocol ID “sup” because none is
configured in the chain specs
2019-05-27 16:56:16 Local node identity is: Qma1e4ZxyywhnBH7axdiD1NK8R1zvfLD9teQFThoNRABs7
2019-05-27 16:56:16 Libp2p => Random Kademlia query has yielded empty results
2019-05-27 16:56:16 Listening for new connections on 127.0.0.1:9944.
...
エラーなくノードが起動し、新しいブロックの生成が開始されれば成功です。
もし、substrateコマンドが認識されない場合は、一度コンソールをログアウトするか、下記コマンドを実行してください。
コマンド6. インストール後の環境変数更新
$ source ~/.cargo/env
ノードが起動したことを確認するため、ウェブブラウザからGUIを通じて状態を確認してみます。
Substrateを起動したまま別のコンソールで下記コマンドを実行するか、直接Google Chromeを開いて、 https://polkadot.js.org/apps にアクセスしてください。Google Chrome以外のブラウザではうまく動作しない場合があるので注意してください。
コマンド7. Google ChromeでGUI用ウェブサイトを起動
$ open -a "Google Chrome" https://polkadot.js.org/apps
このサイトは、PolkadotやSubstrateのノードにブラウザからアクセスするためのライトクライアントです。
ローカルのノードに接続するためには、サイドバーの「Setting」を開き、「remote node/endpoint」をLocal Node(127.0.0.1:9944)、default interfaceをSubstrateに設定し、「Save & Reload」をクリックします。
図1. SettingからLocal Nodeへの接続を保存
正しくローカルノードに接続できたら、サイドバーの項目が表示され、トップページには生成されたブロックの情報がリアルタイムに表示されます。
発展的なノードの起動方法
–dev以外に、substrateコマンドで利用可能なオプションを確認してみましょう。コマンド8を用いて、substrateコマンドのマニュアルを表示します。
コマンド8. substrateコマンドのマニュアルを表示
$ substrate --help
コマンド8により、substrateコマンドで利用できるサブコマンドやフラグ、オプションなどが確認できます。–dev フラグは、あらかじめ用意されているdevelopmentチェーンの設定を用いてノードを起動するフラグです。
–dev の代わりに、–chainオプションを用いてチェーンの設定を指定することもできます。ただし、–chain オプションだけでは匿名のアカウントでノードを起動してしまい、新しいブロックを生成することができません。
コマンド9 に示すとおり、developmentチェーンを指定し、developmentチェーンにあらかじめvalidator用アカウントとして用意されているaliceアカウントでvalidatorモードとして起動するオプションを指定することで、–devフラグとほぼ同じ設定でノードを起動できます。
コマンド9. devチェーンをaliceアカウントでvalidatorモードとして起動
$ substrate --chain dev --alice --validator
–chainオプションに指定できるプリセットのチェーンは、devだけでなくlocalやstagingなどがあります。localチェーンでは、validatorとしてaliceとbobの2アカウントが設定されています。localチェーンを用いて、複数ノードでチェーンを起動するテストをしてみましょう。
まず、コマンド10を用いて、localチェーンをaliceアカウントで起動します。このとき、複数のノードを同時に起動させたいため、ノードの状態を保存するパスをノードごとに分ける必要があります。–base-pathオプションを用いて、ノードの状態を保存するパスを/tmp/aliceに指定しています。
コマンド10. localチェーンをaliceアカウントでブートノードとして起動
$ substrate --chain local \
--base-path /tmp/alice \
--alice \
--node-key \
0000000000000000000000000000000000000000000000000000000000000001 \
--validator
コマンド10を実行すると、aliceのノードがデフォルトのTCPポート30333で立ち上がります。aliceノードのノードIDは QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR となります。これは、–node-keyで指定したキーから生成されたIDです。
続いて、別のコンソール画面を開き、コマンド11を用いてbobのアカウントでノードを立ち上げ、さきほど起動したaliceのノードに接続します。–bootnodesオプションに、aliceのノードのアドレスを指定します。デフォルトの30333ポートはすでに使用されているため、–port 30334を指定しています。
コマンド11. localチェーンをbobアカウントで起動し、aliceのノードに接続
$ substrate --chain local \
--base-path /tmp/bob \
--bootnodes \
/ip4/127.0.0.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR \
--bob \
--port 30334 \
--validator
うまく接続できれば、GUI上でAliceとBobによる新しいブロックの生成が確認できます。
図2. AliceとBobによる複数ノードの運用
チェーンのカスタマイズ
続いて、カスタムのチェーンの設定ファイルを作成し、オリジナルのチェーンを実行してみましょう。
まず、コマンド12を用いて、さきほど起動したdevチェーンの設定をjsonファイル(myspec.json)に出力します。
コマンド12. devチェーンの設定をjsonとして出力
$ substrate build-spec --chain dev > myspec.json
出力したjsonファイルを、任意のテキストエディタで開きます。
コマンド13. チェーンの設定ファイルを編集
$ vi myspec.json
出力したjsonファイルの先頭部分で、idとgenesis.runtime.timestamp.minimumPeriodを修正します。
idはチェーンのユニークな識別子となる文字列で、例えば「dev2」などに変更します。
minimumPeriodは、新しいブロックと前回のブロックのタイムスタンプの差の最小値を秒単位で設定します。この値がブロック生成間隔となるわけではなく、この値とコンセンサスアルゴリズムの種類に応じてブロック生成間隔のTargetが決まります。SubstrateのデフォルトコンセンサスアルゴリズムであるAuraでは、minimumPeriodの2倍がTargetとなります。
Substrateのバージョンによりデフォルトに設定されているminimumPeriodの値が異なる可能性がありますが、この値を変更して、新しいチェーンの設定を試してみましょう。コード1では、例としてminimumPeriodの値を「5」に設定しています。
コード1. myspec.json
{
"name": "Development",
"id": "dev2",
"bootNodes": [
"/ip4/127.0.0.1/tcp/30333/p2p/Qma1e4ZxyywhnBH7axdiD1NK8R1zvfLD9teQFThoNRABs7"
],
"telemetryEndpoints": null,
"protocolId": null,
"consensusEngine": null,
"properties": null,
"genesis": {
"runtime": {
"system": null,
"timestamp": {
"minimumPeriod": 5
},
"consensus": {
"authorities": [
"5CLFVjc5C8A5vwwuHaYgxHDsamotvEsaWE7D7jJR7SsDbeWm"
],
...
上記のjsonファイルは人間が編集しやすい形になっています。コマンド14を用いて、jsonファイルをrawフォーマットに変更し、substrateで実行できる形にします。
コマンド14. チェーンの設定ファイルをrawフォーマットに変換
$ substrate build-spec --chain myspec.json --raw > myspec-raw.json
出力したrawフォーマットのファイルを–chainオプションに指定して、新しいノードを起動してみます。
コマンド15. カスタム設定ファイルでチェーンを起動
$ substrate --chain myspec-raw.json --validator --alice
正しく起動できれば、図3に示すとおり、ブロックを生成する間隔のTargetの値が、さきほど変更したminimumPeriodの2倍の値(10秒)となってることが確認できます。
図3. minimumPeriod = 5としたときのチェーンの実行結果
さらにminimuPeriodを変更し、「10」を設定してみましょう。
コード2. myspec.json
"timestamp": {
"minimumPeriod": 10
},
修正したjsonファイルをrawフォーマットに変更し、再度ノードを起動してみても、Targetの値は10秒のままになっているはずです。ここで設定した値はgenesis blockの中に反映されてしまうので、一度ブロックの状態をリセットする必要があります。
コマンド16のpurge-chainサブコマンドを用いて、dev2チェーンの状態ファイルを削除します。
コマンド16. チェーンの状態ファイルを削除(チェーンのパージ)
$ substrate purge-chain --chain myspec-raw.json
Are you sure to remove "/Users/username/Library/Application Support/substrate/chains/dev2/db"? (y/n)y
"/Users/username/Library/Application Support/substrate/chains/dev2/db" removed.
各チェーンの状態ファイルは、macOSの場合は /Users/username/Library/Application Support/substrate、Ubuntuの場合は~/.local/share/substrate、–base-pathオプションを指定した場合はそのパス以下に保存されます。
コマンド17を用いて、チェーンの状態ファイルのフォルダを確認すると、chainsフォルダ以下にチェーンのIDごとにフォルダが区切られ、状態ファイルが格納されていることが分かります。
コマンド17. チェーンの状態ファイルを確認
$ ls /Users/username/Library/Application\ Support/substrate/chains/
dev
dev2
local_testnet
purge-chainが成功したら、再度コマンド18を用いてカスタム設定ファイルでチェーンを起動してみます。
コマンド18. 再度カスタム設定ファイルでチェーンを起動
$ substrate --chain myspec-raw.json --validator --alice
正しく起動できれば、minimumPeriod = 10に対応して、Targetが20sとなり、20秒毎にブロックが生成されることが確認できます。
図4. minimumPeriod = 10としたときのチェーンの実行結果
今回は、ブロック生成間隔に関わる値だけを変更しましたが、設定ファイルではその他にも、トランザクションの手数料やデフォルトのアカウント、バランスの分布、コンセンサスアルゴリズムなど、さまざまな設定を記述できます。
次回は、GUIを用いてカスタムチェーン上の状態を確認したり、トランザクションを発行したりする手順を紹介します。
以上
参考文献:
- What is Substrate? – Parity
https://www.parity.io/what-is-substrate/ - Substrate Developer Hub
https://docs.substrate.dev/ - Substrate: The platform for blockchain innovators – Github
https://github.com/paritytech/substrate