题目
下面的解码代码来自一次代码评审:
// ABI 片段
// readPoolInfo 已使用实际部署合约的 ABI 读取并解码,返回一个元组。
const [token, reserve, , fee] = await readPoolInfo();
评审意见是「能跑但不可靠」。请说明这类解码在什么情况下会出错,以及应该怎么改。
考察目标
- 能否识别按位置解构的风险。
- 是否理解命名返回值与结构化解码的差别。
- 能否说明嵌套结构解码时的常见错误。
考察返回值解码的结构差异,以及命名与顺序在解码中的作用。
下面的解码代码来自一次代码评审:
// ABI 片段
// readPoolInfo 已使用实际部署合约的 ABI 读取并解码,返回一个元组。
const [token, reserve, , fee] = await readPoolInfo();
评审意见是「能跑但不可靠」。请说明这类解码在什么情况下会出错,以及应该怎么改。
ABI 返回值按类型和顺序编码,字段名不在返回字节里。若部署合约与前端 ABI 的返回顺序变了,但相邻字段类型兼容,解码可能成功却读错含义;类型或长度不兼容时也可能直接报错。应把 ABI 与部署版本绑定,解码后显式映射为业务字段并校验关键值;命名返回值只改善描述,不能自动消除版本不匹配。
readContract 按提供的 ABI 解码并推断 TypeScript 返回类型;ABI 若与部署合约不匹配,静态类型也会给出错误的安全感(依据:viem readContract §Return Value、§Parameters(abi))。发现这道题有问题? 反馈此题