Quorumのネットワークを複数ノードで構築してみる

Quorumのネットワークを複数ノードで構築してみる

はじめに

Azure Blockchain ServiceなどのBaaSを利用すると、簡単にブロックチェーンネットワークを構築する事が出来ます。

しかし内部でどのような動作が行われているかを理解しておくと理解が深まるので、スクラッチからネットワークを構築してみるのもとても良い経験となります。

ところが、実際にドキュメント通りに進めようと思っても理解しずらい部分やうまく動かず原因がわからないといった事も多いかと思います。

この記事はQuorumのネットワークをスクラッチから構築してみるの続きで、Quorumネットワークにノードを追加する手順をスムーズに体験できるように解説していきます。

まずは一つ目のノードを構築する必要があるので、まだノードを起動していない方はQuorumのネットワークをスクラッチから構築してみるから始めてみてください。

追記:2021年1月現在、本記事で「Quorum」と記載したプロジェクトは「GoQuorum」へと呼称が変更されています。

構築方法

大部分はQuorumのネットワークをスクラッチから構築してみるの手順の繰り返しとなります。

二つ目のノードが動作するディレクトリを準備し、設定ファイルを記述していきます。

手順

  1. 二つ目のノードの設定
  2. ノードの起動
  3. ネットワークへノードの追加

1.二つ目のノードの設定

作業ディレクトリを作成し、nodekeyとenodeアドレスを生成します。

pushd quorum/fromscratch
mkdir node2
bootnode --genkey=nodekey2
cp nodekey2 node2/nodekey
bootnode --nodekey=node2/nodekey --writeaddress
a810ddacd38f343aeee8eaf12c7a8307d1e00395e6cbc10c88d469b580cd29b55a2290ab9677ffb7e73f44e4a7059341f657c7e989c97e754db84d96464d3890

static-nodes.jsonファイルを編集します。
このファイルは、二つ目のノードが接続するノード(enode)のリストを記述するものです。

cp static-nodes.json node2
vi node2/static-nodes.json 

static-node.jsonは以下のようにしてください

[
  // 一つ目のノードの設定をそのまま
  "enode://6f831da915a9aade9fed014d73927a6240141df48b66d2df38ee738636044e09fc08bf16ae9952f3e5d356f6d23c5e08446ccbecd540233d0a0a4e69f1c2ce23@127.0.0.1:21000?discport=0&raftport=50000",
  // 上で生成されたアドレスを利用。ポートとraptportをそれぞれ21001と50001に書き換える
  "enode://a810ddacd38f343aeee8eaf12c7a8307d1e00395e6cbc10c88d469b580cd29b55a2290ab9677ffb7e73f44e4a7059341f657c7e989c97e754db84d96464d3890@127.0.0.1:21001?discport=0&raftport=50001"
]

2. ノードの起動

二つ目のノードを初期化し、起動します。

geth --datadir node2 init genesis.json
PRIVATE_CONFIG=ignore nohup geth --datadir node2 --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50001 --raftjoinexisting 2 --rpc --rpcaddr 0.0.0.0 --rpcport 22001 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21001 2>>node2.log

3. ネットワークへノードの追加

先ほど起動したノードをネットワークに追加します。

geth attach node1/geth.ipc
> raft.addPeer('enode://a810ddacd38f343aeee8eaf12c7a8307d1e00395e6cbc10c88d469b580cd29b55a2290ab9677ffb7e73f44e4a7059341f657c7e989c97e754db84d96464d3890@127.0.0.1:21001?discport=0&raftport=50001')
[{
    hostname: "127.0.0.1",
    nodeId: "a810ddacd38f343aeee8eaf12c7a8307d1e00395e6cbc10c88d469b580cd29b55a2290ab9677ffb7e73f44e4a7059341f657c7e989c97e754db84d96464d3890",
    p2pPort: 21001,
    raftId: 2,
    raftPort: 50001,
    role: "verifier"
}, {
    hostname: "127.0.0.1",
    nodeId: "6f831da915a9aade9fed014d73927a6240141df48b66d2df38ee738636044e09fc08bf16ae9952f3e5d356f6d23c5e08446ccbecd540233d0a0a4e69f1c2ce23",
    p2pPort: 21000,
    raftId: 1,
    raftPort: 50000,
    role: "minter"
}]

これでノードの追加の完了です。
raftIdを指定してノードを削除することも可能です。

> raft.removePeer(2)
null
> raft.cluster
[ {
      hostname: "127.0.0.1",
      nodeId: "6f831da915a9aade9fed014d73927a6240141df48b66d2df38ee738636044e09fc08bf16ae9952f3e5d356f6d23c5e08446ccbecd540233d0a0a4e69f1c2ce23",
      p2pPort: 21000,
      raftId: 1,
      raftPort: 50000,
      role: "minter"
  }]

複数社でノードを立てる場合

今回は全てローカルでノードを立てて繋ぎましたが、コンソーシアムの際は設定ファイルを複数社で共有してネットワークを繋ぎます。

終わりに

以上でQuorumの複数ノードのネットワーク構築が完了です。さらにノードを増やしたい場合はこの手順を繰り返していきましょう。
実際の運用では複数のサーバーに跨るノードを接続するので、ネットワークの設定はより複雑になります。

このような一連のプロセスを全て自動化してくれるのがAzure Blockchain ServiceなどのBaaSです。本番運用の際はBaaSの利用をオススメします。

▼参考:Azure Blockchain Service(公式)

ブロックチェーンカテゴリの最新記事