---
title: "什么是 Mempool？"
description: "用途及访问方式"
---

# 什么是 Mempool？

在区块链交易中，内存池（mempool）是一份待处理交易的列表，这些交易在被节点验证并提交到区块链上的区块之前，会一直处于等待状态。这类似于传统软件开发中使用"Staging"（预发布）环境，在正式发布到生产环境之前进行测试和质量控制。

与传统的"Staging"环境是集中式的不同，每个节点都有自己独立管理的内存池。让我们来看一下交易流程，以理解内存池的作用，以及如何通过访问内存池获取重要信息：

## **Ethereum 交易流程**

Ethereum 交易分为 3 类：

1）简单转账——价值从一个公共地址发送到另一个地址。这可能是为购买 NFT 或服务而进行的支付。

2）部署智能合约——每当在区块链上部署一个智能合约时，就会产生一笔交易。

3）执行智能合约——某个地址向智能合约地址发送资金或数据。

你可以使用 Alchemy 的监控工具来[监控 Ethereum 交易](https://www.alchemy.com/monitor)，并通过 Alchemy Transfers API 等工具查找某个地址的交易历史记录。

每种类型的 Ethereum 交易都遵循相同的交易生命周期：

1）用户创建一笔交易，并使用自己的私钥签名。

2）节点接收该交易，并将其存入内存池中。

3）交易在内存池中时，节点会对其进行验证测试。如果通过内存池的测试，交易状态会变为"Pending"（待处理）。

4）节点将该待处理交易广播给网络中的所有其他节点，使它们将该交易加入各自的内存池。

5）当新区块被创建时，区块构建者会将 gas 价格最高的交易纳入区块中。此时交易状态变为"Successful"（成功）。

6）在交易所在区块之后，每当节点添加一个新区块，该交易就会获得一次确认。这提供了一种保证：随着时间推移，区块[重组](https://www.alchemy.com/overviews/what-is-a-reorg)的风险降低，交易被永久添加到区块链上。

<ImageBlock
  src="https://media.alchemy.com/1703772601-ethereum-transaction-flow.jpeg"
  alt="Ethereum 交易生命周期示意图，从签名到内存池再到确认"
  width={1335}
  height={1600}
  caption="Ethereum 交易流程"
/>

你可以进一步了解发送交易的相关内容，并在[此处](https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum)发送你自己的交易。

## **内存池的作用**

由于区块链是不可篡改的，因此提交到区块链上的交易必须是有效且无误的，这一点至关重要。承载内存池的节点在交易被提交到区块链之前，承担着验证每笔交易的重要职责。

对开发者而言，了解这些验证测试有助于理解交易失败或卡在"Pending"状态的原因：

### 1. 资金可用性

节点会验证发送方地址是否有足够资金来支付发送金额以及完成交易所需的 gas。如果此项验证失败，交易将从内存池中移除。使用正确的发送参数和目标地址，对于通过此项验证十分重要。

### **2. 交易签名的有效性**

每笔交易都需要由发送方地址进行签名，以证明发送方确实是该地址的所有者。节点会验证该签名是否与发送方地址正确匹配。

<ImageBlock
  src="https://media.alchemy.com/1703772721-validity-of-transaction-signatures.png"
  alt="节点根据发送方地址验证交易签名的示意图"
  width={553}
  height={408}
  caption="交易签名有效性 [来源]"
/>

### 3. 正确的 nonce 值

nonce 值表示从该发送方地址发出的交易数量。每当发送方发送一笔新交易，nonce 值就会增加 1。nonce 值之所以重要，是因为它强制要求来自同一地址的每笔交易都按发送顺序执行。

<ImageBlock
  src="https://media.alchemy.com/1703772853-correct-nonce-value.png"
  alt="节点验证交易 nonce 值的示意图"
  width={849}
  height={498}
  caption="节点验证 Nonce 值"
/>

由于交易的 nonce 值不能重复或跳过，这就防止了双重花费或超额消费可用资金的问题。节点会验证待处理交易所附带的 nonce 值是否正确。如果此项测试未通过，交易将无法继续推进。

### **4. Gas 价格**

根据内存池的不同，其中可容纳的交易数量存在上限。[Geth](https://www.alchemy.com/overviews/what-is-a-geth-node-and-how-to-run-one)是常用的 Ethereum 客户端，其默认限制为 4096 笔待处理交易和 1024 笔排队交易。当达到此限制时，gas 价格最低的交易会被移出内存池，以腾出空间。

## **访问内存池**

内存池结构的一大优势在于，替换交易可以覆盖待处理交易，从而对其进行更正、加速或彻底取消。

除了修正卡在内存池中的待处理交易外，访问内存池在其他场景中也很有用，例如：

**1. 估算 Gas 费用**

查看当前待处理交易列表及其关联的费用，有助于避免多付费用。

**2. NFT 抢购**

**‍**通过使用内存池扫描工具，用户可以了解与 NFT 合约交互的待处理交易情况，并以更高的 gas 费用抢先于这些交易之前完成交易。

**3. 性能洞察**‍

通过使用 [Notify API](https://www.alchemy.com/docs/reference/webhooks-overview) 等服务，智能合约开发者可以从内存池中获取有关智能合约活动的信息。待处理交易可以提供有关智能合约漏洞和缺陷的信息。

## **结语**

内存池对区块链的功能和健康运行起着重要作用。让节点能够验证交易，让矿工能够根据 gas 费用对待处理交易进行优先排序，这是交易流程中不可或缺的一环。

开发者还可以利用内存池提供的数据，降低智能合约中的成本和问题。内存池常被称为区块链的"黑暗森林"，但像 [Alchemy Monitoring](https://www.alchemy.com/blog/application-monitoring-tools) 这样的工具平台，能让用户在这一关键环节中获得更清晰的视野。
