見出し画像

substrateノードの起動・連携手順初歩

今回ご紹介したいこと

Fintertechエンジニアチーム所属の高橋です。
Fintertechでは週1回ブロックチェーン技術勉強会を開催しているのですが、そこでsubstrateに取り組んでみました。しかし、複数ノードをインターネット環境で起動して連携させるような記事があまり無いように思いましたので、最初の部分だけ紹介させて頂こうと思います。
※本番運用を想定した設定等ではありませんのでご注意下さい。

substrateとは

substrateとはブロックチェーンを実装するためのフレームワークだと私は理解しています。詳しくは、最近目覚ましい活躍をされていて、私たちも時々意見交換させて頂くStake Technologiesさんのページを読んでみて下さい。

substrateの複数ノード起動と連携

今回の概略図は以下のようになります。

画像1

以下の手順で行いました。
(1)OS環境準備
(2)substrateモジュール、rustのインストール
(3)2台のノードの起動と動作確認
順番に見ていこうと思います。

OS環境準備

今回はお手軽に実現するために、AWSのLightSailを使いました。LightSailをUbuntu18.4で設定し、起動します。

画像2

今回はテストなので全ポートを空けておきます。

画像3

substrateモジュール、rustのインストール

substrate Developer Hubに従ってインストールしていきます。
以下のチュートリアルに従って、substrateのノードのコンパイル(“cargo build --release”)までを実行します。コンパイルには相当の時間(30分以上1時間未満)がかかりました。

画像4

※rustのインストールをしていない人はインストールして下さい。私がインストールした際はこのサイトを参考にしました。

パラメータを指定して、2台のノードの起動

substrate Developer Hubに従って、”alice”モードで起動します。

# Start Alice's node
./target/release/node-template \
 --base-path /tmp/alice \
 --chain local \
 --alice \
 --port 30333 \
 --ws-port 9944 \
 --rpc-port 9933 \
 --telemetry-url ws://telemetry.polkadot.io:1024 \
 --validator

ターミナルからsshで接続してLightSailのUbuntuにログインして、上記コマンドを実行します。

画像5

画像6

続いて、チュートリアルに習って、2台目のBobを起動します。

./target/release/node-template \
 --base-path /tmp/bob \
 --chain local \
 --bob \
 --port 30334 \
 --ws-port 9945 \
 --rpc-port 9934 \
 --telemetry-url ws://telemetry.polkadot.io:1024 \
 --validator \
 --bootnodes /ip4/<Alices IP Address>/tcp/<Alices Port>/p2p/<Alices Peer ID>

--bootnodesの部分を見ると、Aliceの設定情報を設定するようになっているので、指示にならって変更します。今回では、
Alices IP Address:※1台目のLightSailのパブリックIPアドレス
ALices Port:30333
Alices Peer ID:QmXEzvJ8LsD8AGNzjAPUDw3x8A9adPdfHHM8sZmRqMrFTf となります。
Peer IDは、Aliceノードを実行した時のログに「Local node identity is: QmXEzvJ8LsD8AGNzjAPUDw3x8A9adPdfHHM8sZmRqMrFTf」として出力されていますので、それを使います。

画像7

しばらく待ってもブロックが生成されず、Finalizeもされません…個々のノードが単独で起動されてはいますが、連動はしてはいないようです。Why?

結論から言うと、オプションが間違っていて、このままでは起動出来ないというものでした。コマンドの説明はヘルプ「./target/release/node-template --help」で確認出来ます。

まずChain Specification(チェーン指定)をする必要があるというものです。
substrate Developer Hubでは以下になります。

チュートリアルに従って、Chain Specificationを作成します。Aliceで実行するマシンで以下を実行して作成したcustomSpecRaw.jsonをBobで実行するマシンにも配置して下さい。

画像8

配置が完了したら、Chain Specificationを指定した以下のコマンドで起動します。そうすると、2台のノードがお互いを認識し、ブロックの生成が開始され、Finalizeも実行されるようになります。
Aliceノードを起動します。起動コマンドは以下になります。

./target/release/node-template \
 --base-path /tmp/alice \
 --chain ./customSpecRaw.json \
 --alice \
 --port 30333 \
 --ws-port 9944 \
 --rpc-port 9933 \
 --telemetry-url ws://telemetry.polkadot.io:1024 \
 --node-key 0000000000000000000000000000000000000000000000000000000000000001
 --validator

画像9

次にBobのノードを起動します。起動コマンドは以下になります。

./target/release/node-template \
 --base-path /tmp/bob \
 --chain ./customSpecRaw.json  \
 --bob \
 --port 30334 \
 --ws-port 9944 \
 --rpc-port 9933 \
 --telemetry-url ws://telemetry.polkadot.io:1024 \
 --validator \
 --bootnodes /ip4/<自分の環境のAliceマシンのパブリックIPアドレス>/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR

画像10

コマンドのログから、ブロックが生成され、Finalizeも実行されていることが確認出来ます。

まとめとこれから

今回は、Substrate Developer Hubのチュートリアルを中心に、インターネット環境におけるノードの起動とノード間の連動確認までを行いました。 今回は割愛させて頂きましたが、substrateではデフォルトのノードのWEB UIが用意されており、UI経由で送金やSmart Contractのデプロイ・実行が出来るようになっています。次回以降、そのあたりの実行方法も紹介させて頂ければと考えています。

Fintertechでは最新の技術情報を積極的に集め、技術を大切にする風潮があります。社内有志の勉強会、外部のミートアップやハッカソンへの積極的な参加等を行いながら、技術のアップデートを今後もどんどん行っていきたいと考えています。現在は、substrateのsmart contractの実装と並行してEthereumのsmart contractの実装をやっていますので、また何かの気付きやtipsをご紹介出来ればと思います。

最後までお付き合い頂き、ありがとうございました。