背景
- 現状サーバー2台、ノード2つだけでPoAのプライベートチェーンネットワークを構成している
- この状態だと1ノード死亡しただけでブロックの生成が止まってしまうので、もう1ノード追加したい
- ブロックを生成できる(signが可能な)ノードじゃないといけないので、単につないで同期するだけでは駄目
- geth@ v1.8.20-stableを使用
手順
https://ethereum.stackexchange.com/questions/45578/how-can-we-add-new-nodes-under-poa を参考に手順を以下にまとめる。
新しいノードの準備
- 既に動いている2つのノードをそれぞれnode1, node2、新しいノードをnode3と呼ぶことにする
- 新しく立てたサーバーにgethを入れる
- アカウントを作成する
$ geth --datadir node3/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat passphrase:
Address: {(新しいEOAのアドレス)}
- このとき使ったパスワードをファイルに入れておく
$ echo 'hogehoge' > node3/password.txt
- 既に使っているgenesis.jsonをそのまま新しく立てたサーバーに持っていってinitする
$ geth --datadir node3/ init genesis.json
node3の接続
- 各ノードの
static-nodes.json
にnode3のenodeを追加する(bootnode使ってる場合は当然不要)
[
"enode://(node1のenode)",
"enode://(node2のenode)",
"enode://(node3のenode)"
]
- この状態でnode1とnode2を起動し直し、node3を起動するとブロックの同期はできるが、node3のログに
WARN [01-13|16:32:47.353] Block sealing failed err="unauthorized signer"
と出てnode3はブロック生成を許されていないことがわかる。
新しいsignerのpropose
- node1のコンソールにアタッチする
geth attach node1/geth.cpc
- コンソールで
clique.propose("新しく作ったnode3のEOAのアドレス", true)
とする。
> clique.propose("(新しく作ったnode3のEOAのアドレス, 0x始まり)", true)
null
- node2についても同様のコマンドを打つ。
- 51%以上(今回は2つ)のノードでproposeがされたため、node3の新しいアカウントがsignerに追加される。なお、即追加されるわけではなく、いくつかブロックの生成を待たないといけない(かも)。
> clique.getSigners()
["(node1のcoinbaseアドレス)", "(node2のcoinbaseアドレス」)", "(新しく作ったnode3のEOAのアドレス)"]
これで例えばnode1とnode3しか動いてなくてもブロックが生成されるようになる。