LoginSignup
5
2

More than 5 years have passed since last update.

PoAのプライベートチェーンネットワークに後からsignerノードを追加する方法(geth)

Last updated at Posted at 2019-01-13

背景

  • 現状サーバー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しか動いてなくてもブロックが生成されるようになる。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2