Skip to main content

EVM Cancel / Speed Up — 面试话术整理


一、30 秒版(开场)

我负责过钱包里 以太坊交易加速(Speed Up)和取消(Cancel) 功能。本质是 同 nonce、更高 gas 的替换交易。难点不在 UI,而在 测试:公网测试网 pending 窗口短、不可控。我们从「多充币链上碰运气」演进到 调 gas 验证替换规则,再到 Hardhat 关自动出块、手动挖矿,把不可控变成可重复。


二、1~2 分钟版(讲清楚问题 + 方案)

背景 / 职责

  • 钱包 App 支持 EVM 链 pending 交易的 Speed Up(原参数 + 更高 fee)和 Cancel(给自己发 0 ETH + 同 nonce + 更高 fee)。
  • 涉及:读 pending 原交易 → 构建替换交易 → 签名广播 → 更新本地 hash / 历史记录。

核心原理(一句话)

Replace-by-fee(RBF 思想在 EVM 上的体现):新交易必须与旧交易 nonce 相同,且 gas 严格更高,节点才会用新交易替换 mempool 里的旧交易。

类型构建要点
Speed Upto / value / data / nonce 不变,仅提高 gasPrice 或 EIP-1559 的 maxFeePerGas / maxPriorityFeePerGas
Cancel同 nonce,转给自己 0 ETHdata 为空,gas 更高

难点(面试重点)

不是业务代码难写,而是测试环境难构造

  1. 必须有一笔 长时间处于 pending 的交易;
  2. 公网(Sepolia 等)出块稳定,pending 窗口短、随机;
  3. 若原交易先被打包,Cancel/Speed Up 会直接失败(已确认不可替换)。

测试演进(体现工程思维)

阶段做法问题
1测试网多充币,反复发交易「碰」pending成本高、不可复现、难覆盖边界
2代码里手动调高 gas,验证替换是否被接受解决了 fee 规则,没解决 时间窗口
3本地 Hardhat,automine: false,手动 evm_mine完全可控:先发 tx 不出块 → 测 UI/流程 → 再出块验证结果

结果

  • 本地可稳定复现:未确认态展示、加速/取消、hash 更新、确认后按钮消失等全流程。
  • 链上行为与产品状态机 的理解更深,而不是只测「happy path」。

三、技术深挖(面试官追问时用)

Q:Speed Up 和 Cancel 在链上有什么区别?

  • 相同点:同 nonce、更高 gas,都是替换交易。
  • 不同点:Cancel 用 0 值自转账 清空原意图;Speed Up 保留原 to/value/data,只抬价抢打包。

Q:gas 为什么要乘 1.2 还要 +1 wei

  • 节点要求新交易 fee 严格大于 旧交易;乘系数是经验值,* 1.2 不够时还有 max(计算值, 原值+1) 兜底,避免边界上替换失败。

Q:EIP-1559 和 Legacy 怎么处理?

  • maxFeePerGas / maxPriorityFeePerGas 走 1559 分支;只有 gasPrice 走 legacy;都没有则回退普通 buildTransaction

Q:产品侧什么时候能点 Speed Up / Cancel?

  • EVM 链 + 交易 未上链 + 方向为 发送 + from 为当前钱包地址。
    → 说明你们把「可替换」和「权限/状态」都做了产品层约束。

Q:和比特币 RBF 有什么异同?

  • :都是「更高 fee 替换未确认交易」。
  • :BTC 还有 CPFP 等 UTXO 模型玩法;EVM 是账户模型 + nonce 队列,替换规则更直接,但 pending 窗口 同样依赖出块节奏。

Q:如果让你设计自动化测试?

  • Hardhat/Anvil:automine: falseeth_sendRawTransaction → 断言 mempool / UI 状态 → evm_mine → 断言 receipt、旧 hash 被新 hash 替换。
  • 可 mock RPC 层做单测,但 E2E 必须控出块,否则 flaky。

四、STAR 完整版(行为面试)

要素内容
S钱包需支持 EVM pending 交易的加速与取消,用户抱怨测试网难复现问题。
T保证功能正确,并建立 可重复 的测试方式,覆盖 pending → 替换 → 确认全链路。
A梳理替换交易规则;实现 build/sign/broadcast;测试从公网碰运气 → 调 gas → Hardhat 手动出块;文档化测试步骤。
R本地可稳定测完全流程;减少测试币浪费;团队对 nonce 替换、fee 规则、状态机边界有共识。

五、可主动加分的点(简短金句)

  1. 「难点是环境,不是 if-else。」 — 体现对区块链产品的理解。
  2. 「替换交易 = 同 nonce + 更高 gas + 原交易仍 pending。」 — 三个条件缺一不可。
  3. 「测试演进反映工程成熟度:从概率测试到确定性测试。」
  4. 「Cancel 是 0 值自转账,不是删链上交易。」 — 避免常见误解。

六、收尾一句(结束语)

这件事让我意识到,做链上钱包功能时,要把「链的行为」和「App 状态机」分开设计,并用可控节点把两者之间的窗口测透;公网只适合验收,不适合调试 pending 类功能。


需要的话可以再压一版 「面试官只给 1 分钟」英文版,或按你简历上的项目名改成第一人称口述稿。