跳到主要内容
Web3 前端面试题库
返回题库
中级交易系统场景题

签名前的交易参数校验清单

给出签名前的校验项与各自的依据,说明展示与签名同源、目标地址类型与链标识一致性的处理方式。

题目

团队准备上线一个质押按钮:点击后调用合约的写入方法。测试时发现两类问题——页面上显示的金额与钱包内看到的金额不一致,以及有交易被发到了没有代码的地址上。请给出一份签名前的校验清单,并说明每一项的依据。

考察目标

  • 交易字段与签名之间的关系。
  • 目标地址是否有代码对调用结果的影响。
  • 地址表示形式与金额单位的校验。
  • 模拟结果与链上结果的区别。
查看参考答案包含简要回答、深入分析、常见错误与评分标准

30 秒回答

交易的字段在签名时被固定下来,页面展示的信息必须与提交给钱包的参数同源。发往普通无代码地址的交易不会执行应用合约逻辑,但预编译地址即使没有普通 EVM 代码仍有协议内置行为;质押调用应核对当前链、目标合约地址及预期函数。地址校验和可帮助发现部分录入错误。实现差异与工程取舍见深入回答。

深入回答

  • 【协议保证】交易包含链标识、nonce、费用字段、gasLimit、目标、金额、data 与 accessList 等签名覆盖字段;展示摘要若与这些字段不同源,用户核对的对象可能与实际执行内容不一致(依据:EIP-1559 §Specification 的签名载荷列表)。
  • 【协议保证】普通无代码地址不会执行应用合约逻辑;预编译地址是例外,即使没有普通 EVM 代码也会执行协议内置行为。EIP-7702 委托地址则有可读取的委托指示码(依据:EIP-7702 §Specification 的 Delegation indicator 与 Precompiles 段落)。
  • 【协议保证】金额字段以 wei 为单位(依据:EIP-1474 §eth_call、§eth_sendTransaction 的参数说明);代币金额的展示需要结合代币自身的位数设置(依据:EIP-20 §Specification 的 decimals)。
  • 【协议保证】EIP-55 通过地址字符串的哈希决定字母大小写,形成可校验的表示形式,可以在输入与展示环节发现部分录入错误(依据:EIP-55 §Specification)
  • 【协议保证】读取合约状态通过 eth_call 执行并返回结果;修改状态通过 eth_sendTransaction 提交交易,两者路径与失败表现不同(依据:EIP-1474 §eth_call、§eth_sendTransaction)。
  • 【工程经验】质押调用签名前核对:链标识与页面预期一致、目标是该链已核实的合约地址与函数、地址表示有效、金额单位与位数正确、gas 上限与费用上限可接受、待处理交易与即将使用的 nonce 关系明确;仅检查 getCode 非空不足以证明目标可信(依据:工程经验,无规范依据)。
  • 【工程经验】条件允许时先做一次模拟,可以把确定性的回滚提前暴露给用户,降低「付了费用却得到失败交易」的概率(依据:工程经验,无规范依据)
  • 【工程经验】用户拒绝签名之后,界面应回到可重试状态,并保留用户已经填好的参数(依据:工程经验,无规范依据)

常见错误

  • 页面上的金额与提交给钱包的参数分别计算,二者可能来自不同的小数位或单位换算(依据:工程经验,无规范依据)
  • 只检查地址长度与 0x 前缀,不检查校验和(依据:EIP-55 §Specification)
  • 把模拟通过当成链上执行成功的依据(依据:工程经验,无规范依据;模拟对应某一区块状态下的执行)
  • 没有确认目标地址在当前链上是否有代码,把写调用发到无语义地址(依据:EIP-7702 §Specification 对空代码执行的描述)
  • 用户拒绝后按钮停留在等待状态,没有恢复可操作(依据:工程经验,无规范依据)

面试官追问

  1. 页面上显示的收款方与钱包内显示的不一致时,你会先排查什么?
  2. 模拟通过但在链上仍然失败,可能有哪些条件变化?
  3. 这份校验清单放在前端、后端还是钱包侧,各自的边界在哪里?
  4. 多链产品中同一个地址在不同链上含义不同,你的校验流程如何处理?

评分标准

初级回答

  • 能给出发送前需要核对的字段清单。
  • 知道地址有校验和表示,金额存在单位与位数问题。

中级回答

  • 能说明展示与签名同源的意义,并指出目标地址是否有代码会影响调用结果。
  • 能区分模拟结果与链上执行结果的差别。

高级回答

  • 能把校验清单拆成「可自动拦截」与「需要用户确认」两类,并说明误报与漏报的取舍。
  • 能说明多链、多账户与用户拒绝场景下的状态管理与降级路径。

参考资料

发现这道题有问题? 反馈此题