---
title: "Ethereumのトランザクションはどのように伝播(ブロードキャスト)されるのか?"
description: "Ethereumのトランザクションが Ethereum ネットワーク全体にどのように伝播されるかを解説"
---

# Ethereumのトランザクションはどのように伝播(ブロードキャスト)されるのか?

トランザクションはブロックチェーン上で情報と価値を交換するための基本的な仕組みであり、開発者、トレーダー、ホビイストが理解しておくべき重要な概念です。トランザクションは**RLPx**や**Wire Protocol**といった様々なネットワーキングプロトコルを用いて、Ethereumの分散型ピアツーピア\(P2P\)ネットワーク上に伝播され、ブロックプロデューサーとバリデーターがmempool内の保留中のトランザクションを見つけられるようになっています。

この記事では、Ethereumのトランザクションタイプと、Ethereumのノードネットワーク上でトランザクションがどのようにブロードキャストされるかについて説明します。

## **Ethereumトランザクションとは？**

**Ethereumトランザクション**とは、あるアドレスがEthereumネットワーク上の別のアドレスにトークンやアセットを送る契約上のプロセスです。Ethereumトランザクションの簡単な例としては、Aliceという人物が、Ethereumのネイティブトークンである1 ETHを友人のBobに送るケースが挙げられます。

トランザクションはブロックチェーンアプリケーションを構築する上で基本となるものなので、Ethereumトランザクションに含まれる情報について見ていきましょう。

### **Ethereumトランザクションにはどのような情報が含まれるか？**

プログラミング言語のレベルでは、送信者であるAliceは**msg.sender**というグローバル変数を持ち、受信者であるBobは**address\(this\)**変数を持ちます。そして、両者間で送られるトークンの量、つまり1 ETHは**msg.value**にあたります。

上記のデータに加え、典型的なEthereumトランザクションには常に以下の詳細が含まれます。

- **Signature** - トランザクションを開始するための送信者による承認の署名
- **gasLimit** - トランザクションに使用できるgasの上限量
- **Nonce** - 特定のトランザクションを識別する一意の識別子
- **Data** - トランザクションの説明やメッセージのための任意のセクション

## **Ethereumトランザクションにはどのような種類があるか？**

Ethereumトランザクションには複数の種類があり、スマートコントラクトをデプロイするトランザクション、エンティティ間\(すなわち人間同士\)のトランザクション、スマートコントラクト間のトランザクション\(内部トランザクション\)、あるいはDeFiプロトコルの利用のような人間とスマートコントラクトが混在するトランザクションなどがあります。

このセクションでは、Ethereumネットワーク上でのトランザクション伝播に関連する、エンティティ間トランザクションの各状態の種類に焦点を当てます。

### **1. プール\(保留中\)トランザクション**

プールされたトランザクションとは、[mempool内の保留中のトランザクション](http://www.alchemy.com/overviews/what-is-a-mempool)であり、まだマイニングされていないもの\(すなわち単一ノードのローカルストレージ内にある保留中のトランザクション\)を指します。

2つのノードが共有接続を確立すると、各ノードのローカルなトランザクションプールの内容が共有され、それぞれのノードが保留中のトランザクションの完全なリストを持つようになります。

Ethereumのp2pネットワーク上でノードがより多くの接続を確立するにつれて、単一または複数のノードに同時に送信されたトランザクションは、ネットワーク全体により広く伝播していきます。

### **2. マイニング済みトランザクション**

マイニング済みトランザクションとは、保留中のトランザクションのグローバルプール\(すなわちmempool\)から選択され、ブロックチェーンに追加された新しいブロックに含まれた、完了済みのトランザクションを指します。

[チェーン再編成\(reorg\)](https://www.alchemy.com/overviews/what-is-a-reorg)により、マイニング済みトランザクションは複数のコミットメントレベルのいずれかを持つことがあります。The Merge以前は、トランザクションのブロックは1ブロックごと\(約12秒\)に増加する_latest_コミットメントレベルのみを持っていましたが、The Merge以降は、32ブロックごと\(約6分\)に増加する_safe_\(_justified_とも呼ばれる\)または_finalized_というラベルも付けられるようになりました。

_Safe_ブロックとは、再編成される可能性が低いブロックのことであり、_finalized_ブロックとは、再編成される可能性が極めて低いブロックのことです。

### **3. ドロップされたトランザクションと置き換えられたトランザクション**

[ドロップされたトランザクション](https://www.alchemy.com/docs/ethereum-transactions-pending-mined-dropped-replaced)とは、グローバルmempoolから削除された保留中のトランザクションです。ドロップされたトランザクションは、送信者のgas手数料が低すぎた場合や、トランザクションのnonceにエラーがあった場合に発生することがあります。

置き換えられたトランザクションとは、mempool内の既存のトランザクションと同じnonceを持つトランザクションのことです。置き換えられたトランザクションは、ユーザーが元のトランザクションを次のブロックに含めてもらうためにgas priceを引き上げようとする際に最も典型的に使用されます。置き換えられたトランザクションが確定すると、元のトランザクションはドロップされます。

### **4. 強化されたトランザクション\(Reinforced Transactions\)**

強化されたトランザクションとは、Ethereumノードへトランザクションを再伝播することで、特にネットワーク活動が活発でgas priceのボラティリティが高い期間に、トランザクションが検証される可能性を高める新しいEthereumトランザクションタイプです。

強化されたトランザクションは、失敗したトランザクションやドロップされたトランザクションに対する解決策です。

### **その他のトランザクションタイプ**

プール、マイニング済み、ドロップ・置き換え、強化されたトランザクションのほかにも、以下のようなトランザクション状態があります。

- **Canceled Transactions\(キャンセルされたトランザクション\)** - 元のトランザクションをキャンセルする置き換えトランザクションの一種
- **Confirmed Transactions\(確定済みトランザクション\)** - マイニングされ、ブロックチェーンに含まれたトランザクション
- **EOA Transactions** - 1つ以上のExternally Owned Accounts\(EOA\)間、通常は人間同士のトランザクション
- **Failed Transactions\(失敗したトランザクション\)** - 試行されたが成功しなかったトランザクション
- Internal Transactions\(内部トランザクション\) - 2つのスマートコントラクト間のトランザクション
- **Private Transactions\(プライベートトランザクション\)** - パブリックmempoolを経由せず、マイナーに直接送られるトランザクション
- **Stuck Transactions\(スタックしたトランザクション\)** - マイニングできないトランザクション
- **Type 0 Transactions** - EIP-1559が採用される前のトランザクション
- **Type 2 Transactions** - EIP-1559のアップデートに準拠したトランザクション

## **Ethereumのp2pネットワークはどのように機能するか？**

ピアツーピアネットワークでは、ユーザーはネットワークリソースの消費者であると同時に供給者でもあります。しかし、すべてのP2Pフレームワークが同じというわけではないため、情報がどのように共有、検証、ブロードキャストされるかという仕組みは、Ethereumネットワーク全体を理解する上で重要です。

P2Pネットワーク上では、情報はノードを介して共有・保存されます。本稿執筆時点で、Ethereumには30万を超えるフルノードが存在します。以下は、新しいフルノードがどのように追加されるか、関連するプロトコル、そして各ノードがEthereumチェーン上の新しいブロックを処理、検証、そしてバリデートするために果たす具体的な機能の概要です。

### **1. ノード同士が互いを発見する**

Ethereumは**bootnode**を使用して、ネットワーク上の新しいノードを検出・発見します。新しいノードが接続しようとすると、そのノードはbootnodeにPINGと呼ばれる初期化リクエストを送信します。すると、bootnodeはボンディングのPONGメッセージで応答します。

これが確立されると、そのノードはbootnodeに近くにある他のノードのリストを提供するようクエリを送ります。Ethereumはノードを二分木の葉として編成しているため、ここでの「距離」とは、任意の2つのノードの160ビットIDの数値的な近さを指します。

ノードが利用可能な近くのノードと接続できるようになった時点で、bootnodeの役割は完了します。その後の同期作業は、RPLxプロトコルによって行われます。

### **2. ノードが安全な接続を確立する**

RPLxプロトコルは、パケット\(すなわち小さなデータの塊\)の送受信を可能にすることで、2つのノード間の同期を実現します。パケットはRLPエンコーディングを用いて動的にフレーム化され、暗号化・認証も行われます。

RPLxを使用して、ノードは安全な接続を確立し、互いを検証します。検証には、両方のノードが認証メッセージを送信し、続いてポート、クライアントとノード両方のID、およびプロトコルとサブプロトコルを含むメッセージを送信する必要があります。

ノード同士が互いを認証した後は、Wire protocolを使用して通信を開始できます。これら2つのノードはこの時点でピアとみなされ、ピアはノードがEthereumネットワーク全体と通信する手段となります。

### **3. ノードがstate、ブロックを同期し、プールされたトランザクションを交換する**

この段階で、Ethereum P2Pネットワーク上の新しいフルノードは、プロトコル全体のstateと調和し、データの交換を開始します。ここでノードとクライアントの区別を明確にしておく必要があります。これらの用語はしばしば同じ意味で使われますが、クライアントとは、ノードがEthereumのブロックチェーン上のブロックやスマートコントラクトを読み取れるようにするソフトウェアのことです。

Ethereum上のすべてのフルノードは、[Wire protocol](https://github.com/ethereum/devp2p/blob/master/caps/eth.md)に関して3つの基本的なタスクを持っています。

1. 同期\(Synchronization\)
1. ブロック伝播\(Block Propagation\)
1. 保留中トランザクションの伝播\(Pending Transaction Propagation\)

#### **3A. チェーンとstateの同期**

同期は、チェーンとの同期とstateとの同期に分けられます。

チェーンとの同期の際、ピアは自身が利用可能なブロックの難易度\(difficulty rate\)とハッシュを提示します。最も難易度の高いクライアントがブロックのヘッダーをダウンロードします。一方、state同期の際には、ピアはデータの真正性を認証し、ブロックのstateをダウンロードします。

#### **3B. ブロック伝播**

ブロック伝播の際、Ethereum P2Pネットワーク上のブロックが処理され、ブロードキャストされます。新しいブロックができると、クライアントはそれをピアに送信し、そのブロックに含まれるトランザクションを承認することで検証します。

クライアントがブロックの検証・処理を終えると、そのノードは同じブロックをネットワーク上のすべてのフルノードまたはピアにブロードキャストし、それらのノードにブロックの妥当性を異議申し立てする機会を与えなければなりません。

#### **3C. 保留中\(プールされた\)トランザクションの交換**

新しいブロックをチェーンに追加する責任はマイナーにあるため、検証に参加したすべてのノードは、処理済みの保留中トランザクションをマイナーに提供する必要があります。

この交換を開始するために、各ピアは自身が持つ保留中トランザクションのハッシュを互いに送信し合う必要があります。[プライベートトランザクション](http://www.alchemy.com/overviews/ethereum-private-transactions)はマイナーやブロックプロデューサーに直接送信されるため、ノードはこれらの種類のトランザクションを発見・伝播することはできません。

これらすべてのタスクが完了すると、マイナーはEthereumチェーンに新しいブロックを追加できるようになり、Wire protocolが再び開始されます。

## **Ethereumトランザクションはどのように伝播されるか？**

Ethereumトランザクションは、あるノードがそのプールされたトランザクションのコレクションに新しいトランザクションがあることをネットワークに通知し、ピアがそれらのトランザクションを取得するためにクエリを送ることで、ネットワーク全体に伝播されます。

具体的には以下のように行われます。

1. 伝播を行うノードは、`NewPooledTransactionHashes`メッセージを発行することで、新しいトランザクションをネットワークに通知します。
1. あるいは、ピアは`GetPooledTransactions`メッセージを発行することで、これらのトランザクションをクエリすることもできます。

## **The Merge後、トランザクションはどのようにブロードキャストされるか？**

The Merge以降、Ethereumノードは、トランザクションの処理に関して別々の責任を持つ2つの独立したノードクライアント―[execution layerクライアントとconsensus layerクライアント](https://www.alchemy.com/overviews/execution-layer-and-consensus-layer-node-clients)―を持つようになりました。要約すると、execution layerクライアントはトランザクションの実行とstateの検証を担当し、consensus layerクライアントは新しいブロックの受信と伝播を担当します。

**マージ後の環境でトランザクションがどのように動作するかについて、もう少し詳しく説明します。**

各ノードのconsensus layerクライアントは、ブロックを受信し、事前検証を行い、そのブロックをexecution layerクライアントに渡し、ELクライアントがそのタスクを完了した後にそのブロックをブロックチェーンのheadに追加し、ネットワークにブロードキャストする責任を持ちます。

execution clientがノードのconsensus layerクライアントから事前検証済みのブロックを受け取ると、トランザクションを実行し、ブロックのstateを検証し、その後、検証済みのブロックをconsensus layerクライアントに送り返す責任を持ちます。

これらの変更点を除けば、Ethereum P2Pネットワークのその他すべての動作方式は、[The Merge](https://www.alchemy.com/the-merge)以降も変わっていません。

### **CLクライアントがブロックプロデューサーでもある場合、トランザクションはどのようにブロードキャストされるか？**

マージ後のEthereumには[ブロックプロデューサーとブロックプロポーザー](https://www.alchemy.com/overviews/proposer-builder-separation)が存在し、consensus layerクライアントがブロックプロデューサーでもある場合、The Merge後のトランザクションとブロックの伝播方法は若干異なる動作をします。このニュアンスのあるユースケースについての情報は、[Ethereum Foundationのnetworking layerドキュメント](https://ethereum.org/en/developers/docs/networking-layer/#connecting-clients:~:text=When%20consensus%20client%20is%20block%20producer%3A)をご覧ください。

## **Ethereumトランザクション伝播のまとめ**

Ethereumのグローバルなピアツーピアネットワークでは、保留中\(プールされた\)トランザクションや新しくマイニングされたブロックをブロードキャストするために、ノードが互いを発見し、検証し、安全に通信する必要があります。RLPxやWire Protocolのような一連の低レベルネットワーキングプロトコルを使用したこのピアリングと情報伝播のプロセスによって、Ethereumというグローバルなコンピュータ上でのブロックチェーントランザクションが可能になっています。
