2018.04.11

ParityによるEthereumブロックチェーンの同期


こんにちは、次世代システム研究室のN.O.です。

ブロックチェーンのプラットフォーム、Ethereumはパブリックのブロックチェーンとしてインターネット上にネットワークが構築されています。そのため、インターネットに接続する環境があれば、誰でもブロックチェーンのノードをネットワークに接続することができます。ブロックチェーンを参照するだけならわざわざノードを用意する必要はなく、https://etherscan.io/を参照すればよいのですが、他の特定のサービスやノードを信頼せずに自分でブロックチェーンを検証する必要がある、SolidityのEventsを使いたい、オフラインでじっくりブロックチェーンを参照したい、などの理由で自身でノードを立てたいときがあります。

本記事では、Ethereumクライアントの一つ、Parityを使ってブロックチェーンの同期を試してみたいと思います。

導入


自分でノードを立てようとするとき、まず問題となるのが同期に必要なディスク容量と、同期にかかる時間です。
同期に必要なディスク容量はブロックチェーンのサイズで決まります。https://etherscan.io/chart2/chaindatasizefastにブロックチェーンのサイズのチャートがありますが、4月時点で60GBを超えています。まずはこれだけのディスク容量を準備する必要があります。

ParityのドキュメントSetupを見ますと、ノードのタイプにFull NodeとLight Nodeとあります。今回は両方とも試します。

次に同期にかかる時間ですが、回線や接続先の状況にもよりますが、かなりの時間を要することもあります。どの程度時間がかかるか、実際に試して調べていきたいと思います。

今回の環境は以下の通りです。
  • インターネット回線: フレッツ光
  • CPU: Pentium(R) Dual-Core CPU E6500 @ 2.93GHz
  • Memory: 8GB
  • DISK: HDD 1TB SATA300 7200rpm
  • OS: Ubuntu 16.04.4 LTS
  • Parity: v1.9.3-beta ※最新の機能を使うため、検証を行った時期(3月ごろ)での最新版を使っております。

また、同期の対象とするブロックチェーンのネットワークは、本番となるmainnetと、テスト用のネットワークのうち、kovanを試したいと思います。


mainnet Full Node


mainnet のFull Nodeは何もオプションをつけずにParityを起動するだけです。
parity &

Parityはdefaultでwarp syncという機能がonになっています。warp syncではsnapshotから同期するので高速です。2時間ほどでかなりのブロック高まで同期できました。以下にログ出力を抜粋します。

2018-03-01 08:03:07  Syncing       #0 d4e5…8fa3     0 blk/s    0 tx/s   0 Mgas/s      0+    0 Qed        #0    3/25 peers      8 KiB chain    3 MiB db  0 bytes queue   10 KiB sync  RPC:  0 conn,  0 req/s,   0 µs
2018-03-01 08:03:17  Syncing snapshot 4/1006        #0    4/25 peers      8 KiB chain    3 MiB db  0 bytes queue   10 KiB sync  RPC:  0 conn,  0 req/s,   0 µs
2018-03-01 08:03:27  Syncing snapshot 7/1006        #0    5/25 peers      8 KiB chain    3 MiB db  0 bytes queue   10 KiB sync  RPC:  0 conn,  0 req/s,   0 µs

--- 省略 ---

2018-03-01 09:54:57  Syncing snapshot 1000/1006        #0   20/25 peers      8 KiB chain    3 MiB db  0 bytes queue   10 KiB sync  RPC:  0 conn,  0 req/s,   0 µs
2018-03-01 09:55:02  Syncing snapshot 1003/1006        #0   20/25 peers      8 KiB chain    3 MiB db  0 bytes queue   10 KiB sync  RPC:  0 conn,  0 req/s,   0 µs
2018-03-01 09:55:15  Syncing #5170000 ef5d…6ecf     0 blk/s    0 tx/s   0 Mgas/s      0+    0 Qed        #0   20/25 peers     22 KiB chain    1 KiB db  0 bytes queue   10 KiB sync  RPC:  0 conn,  0 req/s,   0 µs

ここから最新のブロックに追いつくのに5時間ほどかかってしまいました。都合7時間で最新のブロックに追いつきました。

2018-03-01 14:45:07  Syncing #5175542 31cf…d843     0 blk/s   51 tx/s   2 Mgas/s      6+    1 Qed  #5175549    2/25 peers      5 MiB chain  110 MiB db  312 KiB queue  182 MiB sync  RPC:  0 conn,  0 req/s,   0 µs
2018-03-01 14:45:28  Imported #5175549 41f5…817e (123 txs, 7.83 Mgas, 3328.47 ms, 27.66 KiB)

ブロックチェーンのデータはchainsというディレクトリに格納されます。
増加したディスク容量は35GBでした
35G	.local/share/io.parity.ethereum/chains

mainnet Light Node


Light Nodeはヘッダのみダウンロードするため、容量を節約できます。しかし必要なブロックの中身は都度ダウンロードしますので、オフラインでの使用には向きません。Light Nodeを起動するには --light オプションを追加します。
parity --light &

だいたい5時間ほどで同期できました。Light Nodeではwarp syncは動作しませんが、ヘッダのみのダウンロードのため同期が早いです。

2018-04-10 18:38:55  Syncing       #0 d4e5…8fa3     0 hdr/s      0+    0 Qed        #0    1/50 peers   0 bytes cache 0 bytes queue  RPC:  0 conn,  0 req/s,   0 µs
2018-04-10 18:39:00  Syncing     #446 acde…5fe0    89 hdr/s     64+    0 Qed      #446    1/50 peers   289 KiB cache 57 KiB queue  RPC:  0 conn,  0 req/s,   0 µs

--- 省略 ---

2018-04-10 23:27:04  Syncing #5415710 8c45…70f8   377 hdr/s      0+    0 Qed  #5415710   25/50 peers     10 MiB cache  0 bytes queue  RPC:  0 conn,  0 req/s,   0 µs

Light Nodeでどの程度容量が節約できたか確認します。
増加したディスク容量は94MBでした。
94M	.local/share/io.parity.ethereum/chains

kovan Full Node


Ethereumには、本番となるmainnetの他に、テスト用のネットワークがいくつかあります。
そのうちPoAを採用しているkovanでも同期を試してみます。

kovanのFull Nodeを起動するには --chain=kovan オプションを追加します。
parity --chain=kovan &

kovanでもwarp syncが有効になっており、10分ほどで同期が追いつきました。

2018-04-11 00:25:50  Syncing snapshot 2/211        #0    5/25 peers      8 KiB chain    7 KiB db  0 bytes queue   10 KiB sync  RPC:  0 conn,  0 req/s,   0 µs
--- 省略 ---
2018-04-11 00:34:00  Syncing snapshot 210/211        #0    7/25 peers      8 KiB chain    7 KiB db  0 bytes queue   10 KiB sync  RPC:  0 conn,  0 req/s,   0 µs
--- 省略 ---
2018-04-11 00:35:04  Imported #6811760 6e4d…fbb1 (1 txs, 0.02 Mgas, 0.79 ms, 0.68 KiB) + another 4 block(s) containing 0 tx(s)

なおkovanではディスク容量が2.7GB増えました。
2.7G	.local/share/io.parity.ethereum/chains

kovan Light Node


kovanではLight Nodeも同じく動作します。kovanのFull Nodeを起動するには --chain=kovan --light オプションを追加します。
parity --chain=kovan --light &

Light Nodeなので同期の速さを期待しましたが、結果は2時間弱と、Full Nodeよりも時間がかかってしまいました。やはりwarp syncが強力なようです。
2018-04-11 00:41:39  Syncing    #3528 7c18…afd2   705 hdr/s      0+ 2545 Qed     #3528    5/50 peers      2 MiB cache    2 MiB queue  RPC:  0 conn,  0 req/s,   0 µs
--- 省略 ---
2018-04-11 02:38:49  Syncing #6811837 e4ce…edd2   214 hdr/s      0+    0 Qed  #6811837   25/50 peers     10 MiB cache  0 bytes queue  RPC:  0 conn,  0 req/s,   0 µs

なおkovanのLight Nodeではディスク容量が以下となりました。
56M	.local/share/io.parity.ethereum/chains


まとめ

ParityのFull Nodeにはwarp syncという強力な同期の機能があり、高速にブロックチェーンを同期することができます。またLight Nodeではヘッダのみをダウンロードすることにより、ディスク容量を大幅に節約することができます。現状では高速に同期を行うにはFull Node、ディスクを節約するにはLight Nodeがいいようです。

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクト、またはブロックチェーンのエンジニアを募集しています。次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。