为什么你的交易卡在 Pending?
当你在以太坊主网提交一笔 ETH 转账 或 合约调用 时,如果 gasPrice 设得过低,网络就会优先打包出价更高的交易,于是你的交易便会被放入 mempool(交易池) 中等待,形成大家常遇到的“pending 交易”。轻则几十分钟,重则一两天都无法被打包,令人抓狂。
幸运的是,以太坊遵循 nonce 规则:同一 wallet 地址 的 nonce 序列必须严格按照顺序执行。只要用相同的 nonce,再提交一笔 手续费更高 的交易,就能把原来的 pending 交易覆盖掉,实现空投取消的效果。
核心关键词
以太坊、取消pending交易、nonce、gasPrice、替换交易、智慧合约、ETH转账、钱包授权、Alchemy Web3、区块链开发
步骤一:定位交易参数
- 打开 Etherscan,用你的 transaction hash 搜索,把以下信息记下来:
• from(你的地址)
• to(接受方地址或智能合约地址)
• nonce(现阶段的序号)
• gas、gasPrice(原交易的数值) - 前往 👉 实时查看 Gas Tracker,确保选到最佳费率 ,获取当前 快速档 的 gasPrice,通常比原交易高 10% ~ 30%。
步骤二:组装「取消交易」的原始数据
为了不让两条交易产生资金风险,把转账金额设为 0 ETH,inputData 置空 "0x",其余字段与原交易保持一致,仅把 gasPrice 拉高即可。
const cancelTx = {
from: '0xd6cc...0c5',
to: '0x4bf6...f36',
nonce: 97, // 同原交易的唯一 nonce
value: 0, // 取消时转 0 ETH
input: '0x', // 置空
gas: 21000, // ETH 标准转账最低消耗
gasPrice: 32000000000, // 比原交易高 10-30%
};步骤三:用 Node.js 发送替换交易
以下代码基于 Alchemy Web3,可一键撤销 pending。放入 .env 保存你的 MAINNET_URL 与 PRIVATE_KEY。
import dotenv from "dotenv";
dotenv.config();
import { createAlchemyWeb3 } from "@alch/alchemy-web3";
(async () => {
const web3 = createAlchemyWeb3(process.env.MAINNET_URL);
const cancelTx = {
from: process.env.PUBLIC_KEY,
to: process.env.TARGET,
nonce: parseInt(process.env.ORIGINAL_NONCE),
value: 0,
input: "0x",
gas: "21000",
gasPrice: process.env.NEW_GAS_PRICE, // 32000000000
};
const signed = await web3.eth.accounts.signTransaction(
cancelTx,
process.env.PRIVATE_KEY
);
const result = await web3.eth.sendSignedTransaction(signed.rawTransaction);
console.log("✅ 取消交易已广播,hash:", result.transactionHash);
})();运行后,新的高费率交易会立刻抢占矿池位置,原交易将被系统视作「无效」, etherscan 上显示「Dropped & Replaced」字样。
加速交易 VS 取消交易?
| 目的 | 只需修改 | 注意点 |
|---|---|---|
| 加速交易 | 保持原 value & input,拉高 gasPrice | 资金仍会被转出 |
| 取消交易 | 将 value 置 0,input 设为 0x | 零损失但耗费手续费 |
FAQ:撤销 Pending 交易常见疑问
- Q:我必须用相同的 wallet 吗?
A:必须用 同一地址 发送,不同地址的 nonce 互不影响。 - Q:为什么新交易不是「立即成功」,而是仍然在 pending?
A:调高 10-30% 还不够激进,可直接用👇 点此查看实时 Gas 推荐值,选择“优先档”或“极限档”。 - Q:能不能在钱包 App 一键取消?
A:MetaMask、Rabbi 等主流钱包已内置 Speed Up / Cancel,底层逻辑正是本文的替换机制,但自定义代码能让你更灵活控制参数。 - Q:改用 EIP-1559(type2)如何撤销?
A:需把maxFeePerGas / maxPriorityFee提高到足够高度,同时 nonce 不变即可完成替换。 - Q:如果 past 超过 256 个 blocks 仍未打包,会自动失效吗?
A:理论上会被丢弃,但时间不可控;主动替换更安全。
实战延伸:脚本批量替换多笔交易
对于高频开发或 NFT 扫货场景,可把「address nonce → txDetail」存在本地 cache,随机拉高 5%-20% 的阶梯 price 进行 循环广播,提升被矿工选中的概率,避免人工刷新。
结语
掌握以上三步,你就能优雅地撤回任何卡在内存池中的 ETH 转账与智慧合约交互。提前在本地留好脚本模板,下一次低 gas 时再也不怕“ℝ记一分钟,等确认一整天”的尴尬。祝各位于链上都拥有流畅丝滑的交易体验!