2019.10.04

Ethereumのフルノードを立てる 2019年秋

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

今年の夏もとても暑かったですが、ようやく10月となり秋を感じる日々が多くなってきました。
秋といえば新しいことを始めるには良い季節かと思います。中にはEthereumのフルノードを立てようと思い立った方もいらっしゃるのではないかと考え(いないかもしれませんが)、今回はEthereumのフルノードについての記事をお届けいたします。

目次

  1. フルノードとは
  2. ノードの種類
  3. クライアントを選ぶ
  4. ディスクの容量
  5. SSD?ハードディスク?

フルノードとは

フルノードとは、トランザクションデータをすべて保有するノードを指します。
フルノードはトランザクションの検証を自ら行うことができ、また他のノードに情報提供することでネットワーク全体のセキュリティを高めることができます。

さらにEthereumのフルノードでは、現在の状態(world state)も保持しています。状態には残高やコントラクトの実行によって追加・更新された値などが含まれます。状態の改ざんを防ぐため、状態についてもマークルツリーで保持し、そのマークルルートをブロックヘッダに入れて守っています。

state merkle tree

フルノードでは現在の状態を完全に保持しますが、過去の状態までは保持していません。そのため過去のブロック高の残高を見ようとするとエラーが発生します。以下はEOA 0x627306090abab3a6e1400e9345bc60c78a8bef57の残高を遡って見た例です。
// eth.blockNumberは現在のブロック高を返す
> eth.blockNumber
8666737
// eth.getBalance(アドレス,ブロック高(省略した場合、現在のブロック高となる))
> eth.getBalance('0x627306090abab3a6e1400e9345bc60c78a8bef57', eth.blockNumber)
0
> eth.getBalance('0x627306090abab3a6e1400e9345bc60c78a8bef57', eth.blockNumber - 1)
0
> eth.getBalance('0x627306090abab3a6e1400e9345bc60c78a8bef57', eth.blockNumber - 2)
0

...

> eth.getBalance('0x627306090abab3a6e1400e9345bc60c78a8bef57', eth.blockNumber - 128)
Error: missing trie node 81fd106588d82ab2e8cc3ec131d870a05ee7e0377a14501826e6d8961d5adc02 (path )
    at web3.js:3143:20
    at web3.js:6347:15
    at web3.js:5081:36
    at <anonymous>:1:1

では、過去の状態を見ることはできないのでしょうか?答えはアーカイブノードならばできます。ここで、ノードの種類の説明をしたいと思います。

ノードの種類

EthHubの説明によると、Ethereumのノードには3つの種類があります。
  • ライトノード
    • ヘッダのみ保持。
  • フルノード
    • 全てのトランザクション、全ての状態を保持する
  • アーカイブノード
    • 全ての履歴を保持。→特定のブロック高の状態を知るには必須。
同期の難易度は低い方からライトノード<フルノード<アーカイブノードとなります。用途に合わせて最適なノードを選択してください。
次に、ノードを動かすためのクライアントを選んでいきます。

クライアントを選ぶ

Ethereumには様々なクライアントがありますが、選定にあたってはメジャーなものを選ぶ、というのが一つの手かと思います。ethernodes.orgではクライアントのシェアを見ることができます。以下は抜粋したものです。


見てみると、大半がParity-EthereumかGethで占めていますので、どちらかを選択するのがよさそうです。どちらにするかは、ディスクの容量の効率がポイントになります。次の章で説明します。

ディスクの容量

Ethereumのブロックチェーンサイズについては、過去に1TBに達するのでは?といった話や違う、そうじゃない、と反論があったりで、結局どうなのか気になっている方もいらっしゃるかもしれません。

結論から言うと、2019年秋の段階ではフルノードで200GB程度となります。
etherscanにEthereum-ParityとGethにおける、デフォルト設定で起動した際のブロックチェーンのサイズのグラフがあります。
以下がそのグラフになります。


長らくParity-Ethereumのほうが有利だったのですが、gethのバージョン1.9から、gethのほうが容量が少なくなっているようです。
傾きが若干気になりますが、現時点ではgethを選択するのがよさそうです。

SSD?ハードディスク?

gethのFAQによるとEthereumではrandom writeが多いのでSSDが必須とあります。
これはEOAからの送金、コントラクトのデプロイ、コントラクトの実行による値の変化など、様々な箇所で書き込みが発生するからと考えられます。
SSDを選択しましょう。

最後に

本記事ではノードの種類から、フルノードを立てるうえでポイントとなるクライアントやディスク容量について説明しました。フルノードを立てる際に参考にしていただけますと幸いです。

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

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事