三步学会在以太坊主网撤回 Pending 交易:完整代码示例与避坑指南

·

为什么你的交易卡在 Pending?

当你在以太坊主网提交一笔 ETH 转账合约调用 时,如果 gasPrice 设得过低,网络就会优先打包出价更高的交易,于是你的交易便会被放入 mempool(交易池) 中等待,形成大家常遇到的“pending 交易”。轻则几十分钟,重则一两天都无法被打包,令人抓狂。

幸运的是,以太坊遵循 nonce 规则:同一 wallet 地址 的 nonce 序列必须严格按照顺序执行。只要用相同的 nonce,再提交一笔 手续费更高 的交易,就能把原来的 pending 交易覆盖掉,实现空投取消的效果。

核心关键词

以太坊、取消pending交易、nonce、gasPrice、替换交易、智慧合约、ETH转账、钱包授权、Alchemy Web3、区块链开发


步骤一:定位交易参数

  1. 打开 Etherscan,用你的 transaction hash 搜索,把以下信息记下来:
    • from(你的地址)
    • to(接受方地址或智能合约地址)
    • nonce(现阶段的序号)
    • gas、gasPrice(原交易的数值)
  2. 前往 👉 实时查看 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_URLPRIVATE_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 交易常见疑问

  1. Q:我必须用相同的 wallet 吗?
    A:必须用 同一地址 发送,不同地址的 nonce 互不影响。
  2. Q:为什么新交易不是「立即成功」,而是仍然在 pending?
    A:调高 10-30% 还不够激进,可直接用👇 点此查看实时 Gas 推荐值,选择“优先档”或“极限档”。
  3. Q:能不能在钱包 App 一键取消?
    A:MetaMask、Rabbi 等主流钱包已内置 Speed Up / Cancel,底层逻辑正是本文的替换机制,但自定义代码能让你更灵活控制参数。
  4. Q:改用 EIP-1559(type2)如何撤销?
    A:需把 maxFeePerGas / maxPriorityFee 提高到足够高度,同时 nonce 不变即可完成替换。
  5. Q:如果 past 超过 256 个 blocks 仍未打包,会自动失效吗?
    A:理论上会被丢弃,但时间不可控;主动替换更安全。

实战延伸:脚本批量替换多笔交易

对于高频开发或 NFT 扫货场景,可把「address nonce → txDetail」存在本地 cache,随机拉高 5%-20% 的阶梯 price 进行 循环广播,提升被矿工选中的概率,避免人工刷新。


结语

掌握以上三步,你就能优雅地撤回任何卡在内存池中的 ETH 转账智慧合约交互。提前在本地留好脚本模板,下一次低 gas 时再也不怕“ℝ记一分钟,等确认一整天”的尴尬。祝各位于链上都拥有流畅丝滑的交易体验!