---
title: "Ethereum 交易是如何传播（广播）的？"
description: "了解 Ethereum 交易如何在 Ethereum 网络中传播"
---

# Ethereum 交易是如何传播（广播）的？

交易是区块链上信息和价值交换的基础，对开发者、交易者和爱好者理解区块链至关重要。交易通过**RLPx**和**Wire Protocol**等多种网络协议在Ethereum去中心化的点对点\(P2P\)网络中传播，以确保出块者和验证者能够在mempool中找到待处理交易。

本文将介绍Ethereum交易类型，以及交易如何在Ethereum节点网络中广播。

## **什么是Ethereum交易？**

**Ethereum交易**是一个地址向Ethereum网络上另一个地址发送代币或资产的契约性过程。一个简单的例子是Alice向她的朋友Bob发送1个ETH（Ethereum的原生代币）。

由于交易是构建区块链应用的基础，我们来看看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)（即存在于单个节点本地存储中的待处理交易）。

当两个节点建立连接后，各自本地交易池的内容会被共享，使得每个节点都拥有一份完整的待处理交易列表。

随着节点在Ethereum P2P网络中建立更多连接，发送给单个或多个节点的交易会在网络中更广泛地传播。

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

已打包交易是指已从全局待处理交易池（即mempool）中被选中，并被打包进新区块加入区块链的已完成交易。

由于[链重组（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)是指已从全局mempool中移除的待处理交易。交易被丢弃的原因可能是发送方的gas费用过低，或交易的nonce出错。

被替换的交易是指与mempool中现有交易使用相同nonce的交易。用户通常在希望提高原交易的gas价格以使其被下一个区块打包时使用替换交易。当替换交易被确认后，原交易将被丢弃。

### **4. 强化交易**

强化交易是一种新的Ethereum交易类型，通过向Ethereum节点重新传播交易，提高交易被验证的可能性，尤其是在网络活动量大、gas价格波动剧烈的时期。

强化交易是针对失败和被丢弃交易的一种解决方案。

### **其他交易类型**

除池化、已打包、被丢弃与被替换以及强化交易外，还存在其他交易状态，包括：

- **Canceled Transactions（已取消交易）** - 一种取消原交易的替换交易
- **Confirmed Transactions（已确认交易）** - 已被打包并加入区块链的交易
- **EOA Transactions（EOA交易）** - 一笔或多笔外部账户（EOA）之间的交易，通常指人与人之间的交易
- **Failed Transactions（失败交易）** - 已尝试但未成功的交易
- Internal Transactions（内部交易） - 两个智能合约之间的交易
- **Private Transactions（私有交易）** - 直接发送给矿工、绕过公共mempool的交易
- **Stuck Transactions（卡住的交易）** - 无法被打包的交易
- **Type 0 Transactions（0型交易）** - EIP-1559采用之前的交易
- **Type 2 Transactions（2型交易）** - 遵循EIP-1559更新规范的交易

## **Ethereum的p2p网络如何运作？**

在点对点网络中，用户既是网络资源的消费者，也是网络资源的供给者。但并非所有P2P框架都相同，因此信息如何被共享、验证和广播的机制，对于理解整个Ethereum网络至关重要。

在P2P网络中，信息通过节点进行共享和存储。截至本文撰写时，Ethereum拥有超过300,000个全节点。以下概述了新全节点如何加入网络、相关协议，以及每个节点在处理、验证Ethereum链上新区块时所执行的具体功能。

### **1. 节点相互发现**

Ethereum使用**bootnode**来检测和发现网络中的新节点。当一个新节点愿意连接时，它会向bootnode发送一个称为PING的初始化请求。bootnode随后以PONG消息进行响应绑定。

建立连接后，该节点会向bootnode查询，请求提供附近其他节点的列表。由于Ethereum将节点组织为二叉树中的叶节点，"距离"这一概念指的是任意两个节点160位ID之间的数值接近程度。

一旦该节点能够与附近可用节点建立连接，bootnode的作用便完成。此后的同步任务则由RPLx协议来完成。

### **2. 节点建立安全连接**

RPLx协议通过支持数据包（即小块数据）的发送与接收，促成两个节点之间的同步。数据包使用RLP编码进行动态封装，并经过加密和身份验证。

节点使用RPLx建立安全连接并相互验证。验证要求双方节点都发送一条身份验证消息，随后再发送一条包含端口号、客户端和节点双方ID，以及协议与子协议信息的消息。

一旦节点完成相互身份验证，便可以开始使用Wire protocol进行通信。此时这两个节点被视为对等节点（peer），而peer正是节点与整个Ethereum网络通信的方式。

### **3. 节点同步状态、区块并交换池化交易**

在这一阶段，Ethereum P2P网络中的新全节点将与整个协议的状态保持一致，并开始交换数据。这里需要对节点（node）和客户端（client）做一个重要区分。虽然这两个术语常被交替使用，但客户端是指使节点能够读取Ethereum区块链上区块和智能合约的软件。

Ethereum上的所有全节点在[Wire protocol](https://github.com/ethereum/devp2p/blob/master/caps/eth.md)下都有三项基本任务：

1. 同步（Synchronization）
1. 区块传播（Block Propagation）
1. 待处理交易传播（Pending Transaction Propagation）

#### **3A. 链与状态同步**

同步分为与链的同步以及与状态的同步。

在与链同步的过程中，peer之间会交换其可用区块的难度值和哈希值。难度值最高的客户端会下载区块头。而在状态同步过程中，peer则会验证数据的真实性，并下载区块状态。

#### **3B. 区块传播**

在区块传播过程中，Ethereum P2P网络中的区块会被处理并广播。一旦出现新区块，客户端会将其发送给其peer以进行验证，并对区块中的交易进行确认。

客户端验证并处理该区块后，节点必须将该区块广播给网络中所有的全节点或peer，使它们有机会对其有效性提出质疑。

#### **3C. 交换待处理（池化）交易**

矿工负责将新区块添加到链上；因此，所有参与验证的节点都必须向矿工提供已处理的待处理交易。

要开始这一交换过程，每个peer必须互相发送自己所拥有的待处理交易的哈希值。由于[私有交易](http://www.alchemy.com/overviews/ethereum-private-transactions)是直接发送给矿工或出块者的，节点将无法发现并传播这类交易。

当所有这些任务完成后，矿工便可以将新区块添加到Ethereum链上，Wire protocol的流程随之重新开始。

## **Ethereum交易是如何传播的？**

当某个节点通知网络其池化交易集合中出现新交易，且peer查询以获取这些交易时，Ethereum交易便在整个网络中传播。

具体过程如下：

1. 传播节点通过发布`NewPooledTransactionHashes`消息，将新交易告知网络。
1. 或者，peer也可以通过发布`GetPooledTransactions`消息来查询这些交易

## **The Merge之后交易是如何广播的？**

自The Merge以来，Ethereum节点拥有两个独立的节点客户端——[执行层客户端和共识层客户端](https://www.alchemy.com/overviews/execution-layer-and-consensus-layer-node-clients)——各自负责处理交易的不同职责。简而言之，执行层客户端负责执行交易并验证状态，共识层客户端负责接收和传播新区块。

**以下是在合并后环境中交易运作方式的更多细节：**

每个节点的共识层客户端负责接收、预验证区块，将其传递给执行层客户端，在执行层客户端完成任务后将区块添加到区块链头部，并在网络中进行广播。

当执行层客户端从节点的共识层客户端接收到经预验证的区块后，它负责执行交易、验证区块状态，然后将验证后的区块发送回共识层客户端。

除上述变化外，自[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全球计算机中建立peer连接并传播信息的过程，使区块链交易得以实现。
