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がいいようです。
次世代システム研究室では、アプリケーション開発や設計を行うアーキテクト、またはブロックチェーンのエンジニアを募集しています。次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD