Quorumのネットワークをスクラッチから構築する手順

Quorumのネットワークをスクラッチから構築する手順

はじめに

Quorumのノードを立てようと思って公式サイトを見ると手順は載っているのですが、考え方や詳細はGethやEthereumのドキュメントを探して理解していく必要があります。

また、実際に進めてみるといくつか間違えやすいポイントが詰まる事も多いかと思います。

この記事では簡単に各コマンドの説明を付けた上、EthereumやGethを学ぶ前でもQuorumのネットワークの構築をスクラッチからスムーズに体験できるよう解説をしました。

QuorumではRaft, IBFT, PoAの三種類のコンセンサスアルゴリズムが選べますが、今回は一番簡単なRaftを利用して構築することにします。

また、Quorumを起動してみるためのテンプレートプロジェクトも用意しておきましたので、とりあえず動かしてみたい方はこちらから。https://github.com/programmerkgit/quorum-gs

参照文献: Quorum公式ドキュメント

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

全体の手順

  1. Quorumの準備
  2. ノードの設定
  3. ノードの起動

Quorumの準備

Quorumのネットワークを構築するには、Quorumに対応したGethなどのツールをインストールする必要があります。

まずはQuorumをインストール・ビルドしましょう。

Quorumのインストール

git clone https://github.com/jpmorganchase/quorum.git

Quorumのビルド

$ cd quorum
$ make all

Quorumのパスを通す

Quorumを起動するスクリプトへのパスを通します。

 $ export PATH=$(pwd)/build/bin:$PATH

Nodeの設定

Nodeは、Quorumのネットワークに参加する一つのマシーンです。
Nodeを構築するためには、以下のものを作成します。

  1. Nodeの作業ディレクトリ
  2. Nodeを管理するアカウント
  3. ブロックチェーンの初期状態を記述するジェネシスファイル
  4. Nodeの鍵(nodekey)の作成
  5. ネットワーク設定ファイルstatic-nodes.jsonの作成

それぞれの手順をみていきましょう。

Nodeの作業ディレクトリの作成

new-node-1という作業ディレクトリを作成しましょう。
このディレクトリにノードの情報が格納されることになります。

$ mkdir fromscratch
$ cd fromscratch
$ mkdir new-node-1

Nodeの管理アカウントの作成

以下のコマンドでNodeが所有するアカウントを作成します。

パスフレーズの入力を求められるので、任意のパスフレーズを入力してください。このパスフレーズは重要なので保存して無くさないようにしてください。

$ geth --datadir new-node-1 account new
INFO [12-18|14:51:17.224] Maximum peer count                       ETH=25 LES=0 total=25
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat passphrase: 
Address: {0431a975ebfade62caaa86d3a38eb087837ee222}

以下のコマンドでアカウントが作成されたことを確認しましょう。

$ ls new-node-1/keystore/
UTC--2019-12-18T05-51-19.943010000Z--0431a975ebfade62caaa86d3a38eb087837ee222

このコマンドで表示された数字列(上の例では0431a…)の部分はアカウントは管理アカウントのアドレスで、後に利用します。

$ touch genesis.json

以下のgenesis.jsonファイルをコピペし、アドレス部分を書き換えてください。
allocキーはアカウントの初期残高を設定します。

{
  "alloc": {    
    // 0xから実際のアドレスで置き換える
    "0x0431a975ebfade62caaa86d3a38eb087837ee222": {
      "balance": "1000000000000000000000000000"
    }   
},
 "coinbase": "0x0000000000000000000000000000000000000000",
 "config": {
   "homesteadBlock": 0,
   "byzantiumBlock": 0,
   "chainId": 10,
   "eip150Block": 0,
   "eip155Block": 0,
   "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "eip158Block": 0,
   "isQuorum": true
  },
 "difficulty": "0x0",
 "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "gasLimit": "0xE0000000",
 "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
 "nonce": "0x0",
 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "timestamp": "0x00"
}

Node Keyの作成

Node Keyとは、ノードを識別するためのキーで、IDとして利用されます。

bootnodeコマンドを利用してNode Keyを作成しましょう。
作成した鍵は作業ディレクトリにも保存します。

$ bootnode --genkey=nodekey
$ cp nodekey new-node-1/  

以下のコマンドで、NodeのIDを確認してみましょう。

$ bootnode --nodekey=new-node-1/nodekey --writeaddress > new-node-1/enode
$ cat new-node-1/enode
77822727e5b6254c7061e03846250e1ffdbe6f0be1f9f849a1756ff7dc8264455dcce504f7bb42c5d7a12bc940a32890e031c4e719ee5f2bd3347d27015edb22

ここで、enodeというのは”ethereum node”の略で、表示されるのはenodeのIDとなるアドレスになります。

static-nodes.jsonの作成

static-nodes.jsonはプライベートネットワークに初期に参加しているノードの一覧を記述するファイルです。
ここに記述されていないノードは別途コマンドによってネットワークに追加する必要があります。
今回はノードは自分のノード一つだけなので、自分の設定を記述します。

まずはstatic-node.jsonファイルを作成しましょう。

$ vim static-nodes.json
... 以下の中身でファイルを作成してください。
[
  // @マークの手前までの778....edb22の部分を実際のアドレスで置き換える
  "enode://77822727e5b6254c7061e03846250e1ffdbe6f0be1f9f849a1756ff7dc8264455dcce504f7bb42c5d7a12bc940a32890e031c4e719ee5f2bd3347d27015edb22@127.0.0.1:21000?discport=0&raftport=50000"
] 

次に、作業ディレクトリにファイルをコピーします。

$ cp static-nodes.json new-node-1

これでノードの起動の準備が整いました。

ノードの起動

これまでの手順で作成した設定を元に、ノードを起動します。
*注意 一度コンソールを閉じるなどによりPathが通っていないと失敗します。失敗する場合はもう一度quorumディレクトリでexport PATH=$(pwd)/build/bin:$PATHを実行してください。

ノードの初期化

まずはノードの設定を元に初期化します。

$ geth --datadir new-node-1 init genesis.json

ノードの起動

Nodeの起動スクリプトを記述します。

$ vim startnode1.sh
... 以下の内容でファイルを記述してください。 
#!/bin/bash
PRIVATE_CONFIG=ignore nohup geth --datadir new-node-1 --nodiscover --verbosity 5 --networkid 31337 --raft --raftport 50000 --rpc --rpcaddr 0.0.0.0 --rpcport 22000 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum,raft --emitcheckpoints --port 21000 >> node.log 2>&1 &

起動スクリプトを実行できる状態にし、実行します。

$ chmod +x startnode1.sh 
$ ./startnode1.sh

これでノードの起動が完了です。

ノードへの接続

ノードが起動したのでネットワークに接続してみましょう。
gethを利用し、以下のコマンドでネットワークに接続できます。

$ geth attach new-node-1/geth.ipc
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.18-stable-b1f3b96e(quorum-v2.4.0)/darwin-amd64/go1.13
coinbase: 0x0431a975ebfade62caaa86d3a38eb087837ee222
at block: 0 (Thu, 01 Jan 1970 09:00:00 JST)
 datadir: /Users/admin/WebstormProjects/quorum-gs/quorum/fromscratch/new-node-1
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 raft:1.0 rpc:1.0 txpool:1.0 web3:1.0

コマンドを実行し、状態を確認してみましょう.

> raft.cluster

[{
    hostname: "127.0.0.1",
    nodeId: "77822727e5b6254c7061e03846250e1ffdbe6f0be1f9f849a1756ff7dc8264455dcce504f7bb42c5d7a12bc940a32890e031c4e719ee5f2bd3347d27015edb22",
    p2pPort: 21000,
    raftId: 1,
    raftPort: 50000,
    role: "minter"
}]
> 

おわりに

以上がQuorumのネットワークの構築手順でした。

Quorumを本番利用するには複数ノードでネットワークを構築する必要があります。

その場合には別のPCなどでノードを構築し、設定ファイルを共有し、お互いにネットワークを接続できる状態にするなどの設定が必要です。

このような面倒な設定を数分でできるようにしているのがAzure Blockchain ServiceなどのBaaSです。

Azure Blockchain Serviceについても紹介しているので、是非参考にしてみてください。

※2020/1/24追記

複数ノードの追加方法を下記で公開しています。

雑記: Quorum起動するのにバグやらなんやらで3日くらい消費してました。バグ嫌い。

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