以太坊如何获取Pending交易:开发者实用指南
在以太坊区块链生态中,"Pending交易"(待处理交易)是一个至关重要的概念,它指的是已经被节点接收、验证并加入到内存池(Mempool)中,但尚未被矿工打包进区块、因此还未被确认的交易,对于开发者而言,能够实时获取这些Pending交易具有多方面的重要价值,例如进行高频交易套利、构建DEX监控工具、分析网络拥堵情况、或者开发需要抢先执行交易的应用(如MEV机器人)。
本文将详细介绍如何在以太坊网络上获取Pending交易,涵盖基本原理、常用方法和代码示例。
理解Pending交易与内存池(Mempool)
在深入获取方法之前,首先需要理解Pending交易的“栖息地”——内存池(Mempool),每个以太坊节点都会维护一个内存池,用于存储从其他节点接收到的、尚未被打包的有效交易,矿工则从自己的内存池中选择交易(通常基于Gas费高低)来构建下一个区块。

获取Pending交易的核心在于访问节点的内存池。
获取Pending交易的主要方法
获取Pending交易主要有以下几种途径,各有优劣,适用于不同的场景:
通过以太坊节点客户端(如Geth)的RPC接口
这是最直接、最常用的方法,尤其当你自己运行一个以太坊全节点时,Geth(Go-Ethereum)作为最流行的以太坊节点客户端之一,提供了丰富的RPC接口来查询内存池。
关键RPC方法:
eth_pendingTransactions: 这是获取所有Pending交易最直接的方法,它会返回一个交易对象数组,每个对象包含交易的详细信息(如from, to, value, gas, input, nonce, gasPrice等)。
示例(使用Geth的HTTP-RPC):
假设你的Geth节点正在通过HTTP-RPC接口提供服务(默认端口8545),你可以使用curl或Web3库(如web3.js, web3.py)来调用。
使用curl:
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_pendingTransactions","params":[],"id":1}' http://localhost:8545
使用Web3.py (Python):

from web3 import Web3
w3 = Web3(Web3.HTTPProvider('http://localhost:8545'))
if w3.is_connected():
print("Connected to Ethereum node")
try:
pending_txs = w3.eth.get_pending_transactions()
# 注意:不同版本的web3.py,方法名可能略有不同,有些可能是eth.filter('pending')
# 或者直接调用w3.eth.pending_transactions
# 对于较新版本的web3.py,通常使用:
# filter = w3.eth.filter('pending')
# pending_txs = filter.get_new_entries()
# 假设我们有一个获取pending交易的方法
# 在web3.py v6+中,推荐使用:
pending_transactions = w3.eth.get_block('pending', full_transactions=True)['transactions']
# 或者更直接地(如果支持):
# pending_transactions = w3.eth.pending_transactions
for tx in pending_transactions:
print(f"Tx Hash: {tx['hash'].hex()}, From: {tx['from']}, To: {tx['to']}, Value: {tx['value']}")
except Exception as e:
print(f"Error fetching pending transactions: {e}")
else:
print("Failed to connect to Ethereum node")
注意事项:
- 权限: 默认情况下,Geth的HTTP-RPC接口可能不允许直接调用
eth_pendingTransactions,或者需要配置--http.api eth,personal,net,web3等参数来暴露相关接口,你可能需要添加--http.api eth,pending来明确启用pending交易相关的API。 - 节点资源: 对于内存池非常大的网络(如高拥堵时期),获取所有Pending交易可能会消耗较多节点资源和带宽。
- 实时性: 调用此方法获取的是当前时间点的快照,内存池中的交易是动态变化的,需要持续轮询或使用订阅机制才能实时更新。
使用第三方区块链浏览器或API服务
如果你不想自己运行节点,可以利用一些第三方区块链浏览器或数据服务商提供的API来获取Pending交易,这些服务通常已经维护了高性能的节点集群,并提供简洁的API接口。
- 示例服务: Etherscan, Ankr, QuickNode, Alchemy, Infura等。
- 优点: 无需自己维护节点,开箱即用,通常有较好的稳定性和文档支持。
- 缺点: 可能有调用频率限制(免费版),成本较高(付费版),数据隐私性相对较差(交易数据经过服务商)。
示例(以Etherscan API为例):
Etherscan提供了txlistpending API端点(可能需要API Key)。
使用时需查阅具体服务商的API文档。
订阅节点事件(WebSocket RPC)
对于需要实时监控Pending交易变化的应用(如交易机器人),使用WebSocket RPC订阅新Pending事件是更高效的方式,相比轮询HTTP RPC,WebSocket可以减少延迟和无效请求。
关键RPC方法:
eth_subscribe: 订阅节点事件。"newPendingTransactions": 订阅新Pending交易事件的订阅类型。
示例(使用Web3.js和WebSocket):

const Web3 = require('web3');
// 使用WebSocket提供商
const web3 = new Web3('ws://localhost:8545');
web3.eth.subscribe('newPendingTransactions', (error, txHash) => {
if (error) {
console.error(error);
return;
}
console.log('New pending transaction detected:', txHash);
// 获取交易详情
web3.eth.getTransaction(txHash).then(tx => {
console.log('Transaction details:', tx);
}).catch(err => {
console.error('Error fetching transaction details:', err);
});
}).on('connected', subscriptionId => {
console.log('Subscription ID:', subscriptionId);
}).on('error', err => {
console.error('Subscription error:', err);
}).on('data', txHash => {
// 这里也可以处理新的pending交易哈希
console.log('Received new pending tx via data event:', txHash);
});
优点:
- 实时性高: 一旦有新的Pending交易进入内存池,节点会立即推送通知。
- 效率高: 避免了轮询带来的延迟和资源浪费。
缺点:
- 需要维护WebSocket连接。
- 对于大量Pending交易,需要考虑客户端的处理能力。
获取Pending交易后的处理与应用
获取到Pending交易数据后,开发者可以根据业务需求进行进一步处理:
-
监控与分析:
- 观察Gas费趋势,预测网络拥堵情况。
- 分析特定地址(如大型交易所、合约)的出币/入币模式。
- 统计内存池中的交易数量和总价值。
-
交易执行与套利:
- MEV(Maximal Extractable Value): 这是最主要的应用之一,MEV机器人通过观察Pending交易,预测未来的价格变动,并插入自己的交易(如三明治攻击、套利)来获利,这需要极高的速度和对内存池的深度理解。
- 优先Gas拍卖(PGA): 确保自己的交易能被优先打包,通过设置较高的Gas费。
-
构建DEX聚合器/监控工具:
实时监控DEX上的Pending大额交易,为用户提供更好的交易价格或预警。
-
安全审计与异常检测:
监控可疑交易模式,如异常大额转账、潜在的恶意合约调用等。
挑战与注意事项
获取和处理Pending交易并非没有挑战:
- 高度动态性: 内存池中的交易随时可能被其他交易替换(通过更高的Gas费)、因nonce不匹配而失效,或被矿工打包/丢弃。
- 竞争激烈: 在MEV盛行的环境下,获取到的Pending交易可能已经被其他机器人“盯上”,执行窗口非常短暂。
- 节点资源消耗: 持续监控和大量处理Pending交易对节点的CPU、内存和网络带宽都有较高要求。
- 数据准确性: 不同节点的内存池状态可能略有差异,尤其是在网络分区或节点同步延迟时。
- Gas费波动: 在拥堵时期,Gas费飙升,处理Pending交易的成本也会显著增加。
