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 Up | to / value / data / nonce 不变,仅提高 gasPrice 或 EIP-1559 的 maxFeePerGas / maxPriorityFeePerGas |
| Cancel | 同 nonce,转给自己 0 ETH,data 为空,gas 更高 |
难点(面试重点)
不是业务代码难写,而是测试环境难构造:
- 必须有一笔 长时间处于 pending 的交易;
- 公网(Sepolia 等)出块稳定,pending 窗口短、随机;
- 若原交易先被打包,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: false→eth_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 规则、状态机边界有共识。 |
五、可主动加分的点(简短金句)
- 「难点是环境,不是 if-else。」 — 体现对区块链产品的理解。
- 「替换交易 = 同 nonce + 更高 gas + 原交易仍 pending。」 — 三个条件缺一不可。
- 「测试演进反映工程成熟度:从概率测试到确定性测试。」
- 「Cancel 是 0 值自转账,不是删链上交易。」 — 避免常见误解。
六、收尾一句(结束语)
这件事让我意识到,做链上钱包功能时,要把「链的行为」和「App 状态机」分开设计,并用可控节点把两者之间的窗口测透;公网只适合验收,不适合调试 pending 类功能。
需要的话可以再压一版 「面试官只给 1 分钟」 或 英文版,或按你简历上的项目名改成第一人称口述稿。