ノードアーキテクチャ
最終編集者: @HiroyukiNaito(opens in a new tab), 2024年6月26日
イーサリアムノードは、実行クライアントとコンセンサスクライアントの2つのクライアントで構成されています。
イーサリアムがプルーフ・オブ・ワークを使っていた時は、フルイーサリアムノードを実行するためには、実行クライアントだけで十分でした。 しかし、プルーフ・オブ・ステークの実装以降、実行クライアントに加えて、「コンセンサスクライアント」と呼ばれる別のソフトウェアも必要になりました。
以下の図は、2つのイーサリアムクライアント間の関係を示しています。 それぞれのクライアントは、独自のピアツーピア(P2P)・ネットワークに接続しています。 実行クライアントは、ピアツーピア・ネットワークでトランザクションをゴシップし、ローカルのトランザクションプールを管理することができます。一方、コンセンサスクライアントは、ピアツーピア・ネットワークでブロックをゴシップし、コンセンサスを確立し、チェーンの成長を促進します。そのため、別々のピアツーピア・ネットワークが必要になります。
この2つのクライアント構造を実現するには、コンセンサスクライアントがトランザクションのバンドルを実行クライアントに渡す必要があります。 実行クライアントは、トランザクションがイーサリアムのルールに違反していないこと、提案されたイーサリアムの状態に対する更新が正しいことを確認するために、トランザクションをローカルで実行します。 同様に、ノードがブロック生成者に選ばれた場合、コンセンサスクライアントは、新しいブロックに含めるトランザクションのバンドルをGethに要求し、それらのトランザクションを実行してグローバル状態を更新する必要があります。 このクライアント間の通信は、エンジンAPI(opens in a new tab)使ったローカルRPC接続で行われます。
実行クライアントの役割
実行クライアントは、トランザクションの処理、トランザクションのゴシップ、状態の管理、イーサリアム仮想マシン(EVM)のサポートを行います。 しかし、ブロックの構築、ブロックのゴシップ、またはコンセンサスロジックの処理は、行いません。 これらは、コンセンサスクライアントが行います。
実行クライアントは、トランザクションのリスト、更新された状態ツリー、その他の実行に関わるデータ等の実行ペイロードを作成します。 コンセンサスクライアントは、各ブロックごとに実行ペイロードを取り込みます。 実行クライアントには、新しいブロックでトランザクションを再実行して、トランザクションが有効であることを確認する役割もあります。 イーサリアム仮想マシン(EVM)と呼ばれる、実行クライアントに組み込まれたコンピュータ上でトランザクションが実行されます。
また、実行クライアントは、RPCメソッドを通じてイーサリアムへのユーザーインターフェースを提供します。これにより、ユーザーは、イーサリアムブロックチェーンにクエリを実行したり、トランザクションを送信したり、スマートコントラクトをデプロイしたりすることができます。 Web3js(opens in a new tab)やWeb3py(opens in a new tab)などのライブラリや、ブラウザウォレットなどのユーザーインターフェースでは、RPC呼び出しを処理するのが一般的です。
要約すると、実行クライアントは、以下の役割を担っています。
- イーサリアムへのユーザーゲートウェイ
- イーサリアム仮想マシン、イーサリアムの状態およびトランザクションプールのホーム
コンセンサスクライアントの役割
コンセンサスクライアントは、ノードがイーサリアムネットワークとの同期を維持するための、すべてのロジックを扱います。 具体的には、ピアからブロックを受信し、フォーク選択アルゴリズムを実行して、バリデータの有効残高に応じて最も多くのアテステーションを蓄積しているチェーンを常時フォローします。 実行クライアントと同様に、コンセンサスクライアントにも独自のピアツーピア・ネットワークがあります。そのネットワークを通じて、ブロックとアテステーションを共有します。
コンセンサスクライアントは、ブロックの証明やブロックの提案には参加しません。これは、バリデータが行います。バリデータは、コンセンサスクライアントにあるオプションのアドオンです。 バリデータがないコンセンサスクライアントは、チェーンの先頭に追い付き、ノードを同期するだけです。 これにより、ユーザーは正しいチェーン上にいることを確認でき、実行クライアントを使用してイーサリアムでトランザクションを行うことができます。
バリデータ
ノードオペレーターは、デポジットコントラクトに32ETHを入金することで、コンセンサスクライアントにバリデータを追加することができます。 バリデータクライアントは、コンセンサスクライアントにバンドルされており、いつでもノードに追加することができます。 バリデータは、アテステーションとブロック提案を行います。 ノードがETHで報酬を得たり、ペナルティやスラッシングによってETHを失うのは、バリデータが担う責任です。 バリデータソフトウェアを実行することで、ノードは新しいブロックの提案候補者となることができます。
ノードのコンポーネントの比較
実行クライアント | コンセンサスクライアント | バリデータ |
---|---|---|
ピアツーピア・ネットワークを介したトランザクションのゴシップを行う | ピアツーピアを介したブロックとアテステーションのゴシップを行う | ブロックの提案を行う |
トランザクションを実行/再実行する | フォークチョイスアルゴリズムを実行する | 報酬またはペナルティを発生させる |
受信した状態の変更を検証する | チェーンの先頭を追跡する | アテステーションを作成する |
状態ツリーとレシートツリーを管理する | ビーコン状態(コンセンサス情報や実行情報を含む) を管理する | ステークには32ETHが必要となる |
実行ペイロードを作成する | RANDAO内に蓄積しているランダム性を追跡する | スラッシュされる可能性がある |
イーサリアムとやり取りできるJSON-RPC APIを公開する | 正当化とファイナライズを追跡する |