Substrate入門 第2回

Substrate入門 第2回
目次

はじめに


本連載では、カスタムブロックチェーンを構築するためのフレームワークである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を用いてカスタムチェーン上の状態を確認したり、トランザクションを発行したりする手順を紹介します。
以上

参考文献:

     

免責事項

本記事に掲載されている記事の内容につきましては、正しい情報を提供することに務めてはおりますが、提供している記事の内容及び参考資料からいかなる損失や損害などの被害が発生したとしても、弊社では責任を負いかねます。実施される際には、法律事務所にご相談ください。

技術・サービス・実装方法等のレビュー、その他解説・分析・意見につきましてはblock-chani.jp運営者の個人的見解です。正確性・正当性を保証するものではありません。本記事掲載の記事内容のご利用は読者様個人の判断により自己責任でお願いいたします。

     

コンセンサス・ベイス(株)とブロックチェーン事業を行なってみませんか?

当サイトを運営するコンセンサス・ベイス株式会社は、2015年設立の国内で最も古いブロックチェーン専門企業です。これまでに、大手企業の顧客を中心に、日本トップクラスのブロックチェーンの開発・コンサルティング実績があります。

ブロックチェーンに関わるビジネスコンサル・システム開発・教育・講演などご希望でしたら、お気軽にお問い合わせください。

     
     

ブロックチェーン学習に最適の書籍の紹介

図解即戦力 ブロックチェーンのしくみと開発がこれ1冊でしっかりわかる教科書

ブロックチェーン イーサリアムへの入り口 第二版 (ブロックチェーン技術書籍)

本書は、ブロックチェーン技術に興味を持ったエンジニアや、その仕組みを学び、自分の仕事に活かしたいビジネスパーソンを対象にして、ブロックチェーンのコア技術とネットワーク維持の仕組みを平易な言葉で解説しています。この本を読んだうえで、実際にコードを書くような専門書、ブロックチェーンビジネスの解説書を読むことで、理解度が飛躍的に高まるでしょう。(はじめにより)

substrateカテゴリの最新記事