症状
EthereumのnodeをParityで立ててRopstenネットワークに接続してしばらく運用していたところ、いつの間にか新しいブロックが同期されなくなってしまっていた。
Parityのバージョンを最新にして再同期してみてもダメ。
Parityのログを追っていると(ログの見方はこちらを参照 https://wiki.parity.io/FAQ#what-does-paritys-command-line-output-mean )
以下ログのように
2018-04-30 16:10:13 Syncing #5532478 9ce2…0499 69.28 blk/s 235.7 tx/s 15 Mgas/s 0+ 17 Qed #5032470 25/25 peers 5 MiB chain 128 MiB db 2 MiB queue 3 MiB sync RPC: 0 conn, 0 req/s, 0 µs
※ログは例なので加工してあります。。
「Syncing #5532478」に対して、ネットワークのhighest block numberが「#5032470」
自身のnodeの持っているブロックに対してネットワークの持ってるブロックのほうが小さい状態となっていて、自身のnodeの同期が一向に進まない。
データを消して0から同期しなおしても同じ症状。
接続するnodeの同期が進んでいない状態?正しい最新のブロックを持ったnodeに接続できてないのか?と、色々とググってオプション等を確認していくと、「--reserved-peers」オプションで、接続するnodeを指定してやると良さげとのこと。
※「--bootnodes」オプションもあったが、こちらで試しても僕の環境ではうまくいかなかった。
で、どのnodeに接続すればいいんだ?と調べてると、公式にこっそり
https://github.com/ethereum/ropsten
こんなリポジトリがあって、指定されているnodeを指定してやればいいらしい。
対応方法
「--reserved-only」オプションで「--reserved-peers」で指定したnode以外には接続しないようにする
# 保存されているnodeのデータを削除
parity db kill --chain ropsten
# 接続先nodeの情報をテキストファイルに保存
echo -e "enode://6332792c4a00e3e4ee0926ed89e0d27ef985424d97b6a45bf0f23e51f0dcb5e66b875777506458aea7af6f9e4ffb69f43f3778ee73c81ed9d34c51c4b16b0b0f@52.232.243.152:30303\nenode://94c15d1b9e2fe7ce56e458b9a3b672ef11894ddedd0c6f247e0f1d3487f52b66208fb4aeb8179fce6e3a749ea93ed147c37976d67af557508d199d9594c35f09@192.81.208.223:30303" >> ropstenpeers.txt
# 接続先nodeをreserved-peersで指定してparity起動
parity --chain ropsten --reserved-peers ropstenpeers.txt --reserved-only
同期を最初からやり直すことになり、2nodeとしか接続しないので同期には時間がかかってしまうが、正しく同期されるようになった。
以後、parityを再起動する際には「--reserved-peers」「--reserved-only」オプションがなくとも正しく同期され続けた。
原因
よくわからない、、
ropstenにつないでるpublic nodeが少なくて、たまたまつなぎに行ったnodeが正しく最新化されていなかっただけなのか?とも思ったが、何度再起動してもうまくいかなかったので原因は別なのか、、、