- 目次
-
- はじめに
- 手順の全体
- Quorumの準備
- Nodeの設定
- ノードの起動
- おわりに
3.1.Quorumのインストール
3.2.Quorumのビルド
3.3.Quorumのパスを通す
4.1.Nodeの作業ディレクトリの作成
4.2.Nodeの管理アカウントの作成
4.3.Node Keyの作成
5.1.ノードの初期化
5.2.ノードの起動
5.3.ノードへの接続
はじめに
Quorumのネットワークの構築手順は公式サイトに乗っているのですが、手順を理解するにはEthereumの理解が別途必要となってきます。
この記事では簡単にですが各コマンドの説明を付けた上、Ethereumを学ぶ前でもQuorumのネットワークの構築を理解できるように配慮しました。
QuorumではRaft, IBFT, PoAの三種類のコンセンサスアルゴリズムが選べます。今回は一番簡単なRaftを利用して構築することにします。
この記事の内容を一通り学ぶことでQuorumのネットワークをスクラッチから作成できるようになります。
また、Quorumを起動してみるためのテンプレートプロジェクトも用意しておきました。とりあえず動かしてみたい方はこちらから。https://github.com/programmerkgit/quorum-gs
参照文献: Quorum公式ドキュメント
手順の全体
- Quorumの準備
- Nodeの設定を記述
- Nodeの起動と動作確認
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を構築するためには、以下のものを作成します。
- Nodeの作業ディレクトリ
- Nodeを管理するアカウント
- ブロックチェーンの初期状態を記述するジェネシスファイル
- Nodeを識別するキー(nodekey)の作成
- ネットワークに参加するnodeの設定ファイル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についても紹介しているので、是非参考にしてみてください。
▼Azure Blockchain Serviceについてはこちら Azure Blockchain Serviceにおけるブロックチェーン アプリ開発手法