---
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. 待處理（pending）交易池**

待處理交易指的是[記憶體池中尚未被打包的待處理交易](http://www.alchemy.com/overviews/what-is-a-mempool)（即單一節點本地儲存中的待處理交易）。

當兩個節點建立連線後，各節點本地交易池的內容會互相分享，讓每個節點都能取得完整的待處理交易清單。

隨著節點在 Ethereum P2P 網路上建立更多連線，發送到單一節點或多個節點的交易會更廣泛地在整個網路中傳播。

### **2. 已打包的交易**

已打包的交易是指從全域待處理交易池（即記憶體池）中被選出，並已納入新區塊、加入區塊鏈的完成交易。

由於[鏈重組（reorgs）](https://www.alchemy.com/overviews/what-is-a-reorg)的存在，一筆已打包的交易可能具有多種確認等級之一。在 The Merge 之前，交易區塊的確認等級只有 _latest_，每個區塊（約 12 秒）遞增一次；而在 The Merge 之後，交易還可以額外標記為 _safe_（也稱為 _justified_）或 _finalized_，這兩種等級每 32 個區塊（約 6 分鐘）遞增一次。

_Safe_ 區塊是指不太可能被重組的區塊，而 _finalized_ 區塊則是極不可能被重組的區塊。

### **3. 被丟棄與被替換的交易**

[被丟棄的交易](https://www.alchemy.com/docs/ethereum-transactions-pending-mined-dropped-replaced)是指已從全域記憶體池中移除的待處理交易。交易被丟棄的原因可能是發送方的 gas 費用過低，或交易的 nonce 出現錯誤。

被替換的交易是指與記憶體池中現有交易使用相同 nonce 的交易。使用者通常會透過替換交易來提高原始交易的 gas 價格，以便讓交易被納入下一個區塊。當替換交易被確認後，原始交易就會被丟棄。

### **4. 加強型（reinforced）交易**

加強型交易是一種新的 Ethereum 交易類型，透過重新向 Ethereum 節點傳播交易，提高交易被驗證的機率，尤其是在網路活動頻繁、gas 價格波動劇烈的期間。

加強型交易是針對失敗與被丟棄交易的解決方案。

### **其他交易類型**

除了待處理、已打包、被丟棄與被替換，以及加強型交易之外，還有其他交易狀態，包括：

- **Canceled Transactions（已取消的交易）** - 一種取消原始交易的替換交易
- **Confirmed Transactions（已確認的交易）** - 已被打包並納入區塊鏈的交易
- **EOA Transactions** - 一筆或多筆外部帳戶（EOA，通常為個人）之間的交易
- **Failed Transactions（失敗的交易）** - 已嘗試但未成功的交易
- Internal Transactions（內部交易） - 兩個智能合約之間的交易
- **Private Transactions（私人交易）** - 直接發送給礦工、繞過公開記憶體池的交易
- **Stuck Transactions（卡住的交易）** - 無法被打包的交易
- **Type 0 Transactions** - EIP-1559 採用之前的交易
- **Type 2 Transactions** - 符合 EIP-1559 更新規範的交易

## **Ethereum 的 p2p 網路如何運作？**

在點對點網路中，使用者同時是網路資源的消費者與提供者。但並非所有 P2P 架構都相同，因此資訊如何被分享、驗證和廣播的機制，是理解整個 Ethereum 網路的關鍵。

在 P2P 網路上，資訊透過節點來分享和儲存。截至本文撰寫時，Ethereum 擁有超過 300,000 個完整節點。以下概述新完整節點如何被加入、相關協定，以及每個節點在處理、驗證 Ethereum 鏈上新區塊時所執行的具體功能。

### **1. 節點互相發現**

Ethereum 使用 **bootnodes** 來偵測並發現網路上的新節點。當新節點準備好連線時，會向 bootnode 發送稱為 PING 的初始化請求。bootnode 則會以 PONG 訊息回應以建立連結。

一旦建立連結，該節點會向 bootnode 查詢，要求提供附近其他節點的清單。由於 Ethereum 將節點組織成二元樹中的葉節點，「距離」的概念是指任兩個節點之 160 位元 ID 之間的數值鄰近程度。

一旦節點能與附近可用的節點連線，bootnode 的任務就完成了。接下來的同步任務則由 RLPx 協定負責。

### **2. 節點建立安全連線**

RLPx 協定透過允許封包（即小塊資料）的傳送與接收，促成兩個節點之間的同步。封包會使用 RLP 編碼動態封裝，並經過加密與驗證。

節點使用 RLPx 建立安全連線並互相驗證。驗證要求雙方節點都要傳送一則驗證訊息，接著再傳送一則包含連接埠、雙方客戶端與節點 ID，以及協定與子協定資訊的訊息。

一旦節點完成互相驗證，就可以開始使用 Wire protocol 進行通訊。此時這兩個節點被視為對等節點（peers），而對等節點正是節點與整個 Ethereum 網路溝通的方式。

### **3. 節點同步狀態、區塊，並交換待處理交易池**

在這個階段，Ethereum P2P 網路上的新完整節點會與整個協定的狀態達成一致，並開始交換資料。這裡需要區分節點與客戶端這兩個重要概念。雖然這兩個術語經常被交替使用，但客戶端指的是讓節點能夠讀取 Ethereum 區塊鏈上區塊和智能合約的軟體。

Ethereum 上所有完整節點依照[Wire protocol](https://github.com/ethereum/devp2p/blob/master/caps/eth.md)都有三項基本任務：

1. 同步
1. 區塊傳播
1. 待處理交易傳播

#### **3A. 鏈與狀態同步**

同步分為與鏈的同步，以及與狀態的同步。

在與鏈同步的過程中，對等節點會提出各自可用區塊的難度值與雜湊值。難度值最高的客戶端會下載區塊的標頭。而在狀態同步過程中，對等節點則會驗證資料的原始性，並下載區塊狀態。

#### **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 節點擁有兩個獨立的節點客戶端——[執行層客戶端與共識層客戶端](https://www.alchemy.com/overviews/execution-layer-and-consensus-layer-node-clients)——各自負責處理交易的不同職責。簡而言之，執行層客戶端負責執行交易並驗證狀態，共識層客戶端則負責接收與傳播新區塊。

**以下是關於交易在合併後環境中如何運作的更多細節：**

每個節點的共識層客戶端負責接收、預先驗證區塊、將區塊傳遞給執行層客戶端，並在 EL 客戶端完成任務後，將區塊加入區塊鏈頭部，再向網路廣播。

當執行層客戶端從節點的共識層客戶端收到經過預先驗證的區塊後，它負責執行交易、驗證區塊狀態，然後將驗證後的區塊傳回給共識層客戶端。

除了這些變化之外，自 [The Merge](https://www.alchemy.com/the-merge) 以來，Ethereum P2P 網路的其他運作方式都維持不變。

### **當 CL 客戶端同時也是區塊生產者時，交易如何被廣播？**

在合併後的 Ethereum 中，將存在[區塊生產者與區塊提議者](https://www.alchemy.com/overviews/proposer-builder-separation)，而當共識層客戶端同時也是區塊生產者時，交易和區塊在 The Merge 之後的傳播方式會略有不同。關於此細微差異的使用案例，請參閱[Ethereum 基金會的網路層文件](https://ethereum.org/en/developers/docs/networking-layer/#connecting-clients:~:text=When%20consensus%20client%20is%20block%20producer%3A)。

## **Ethereum 交易傳播總結**

Ethereum 的全球點對點網路需要節點互相尋找、驗證並安全通訊，以廣播待處理（池中）交易和新打包的區塊。透過一系列低階網路協定，例如 RLPx 和 Wire Protocol，這種節點互聯與資訊傳播的過程，使得跨越 Ethereum 全球運算網路的區塊鏈交易得以實現。
