题目
你在统一错误提示时发现:同样是合约拒绝,有的能直接拿到「余额不足」这类文字,有的只显示一串十六进制,还有的什么都拿不到。
请说明这几类拒绝在编码层面有什么不同,以及前端要具备什么条件才能把十六进制还原成可读文字。
考察目标
- 能否区分字符串错误与自定义错误的数据形态。
- 是否理解解码依赖 ABI 定义。
- 能否说明「什么都拿不到」的原因。
考察自定义错误与字符串错误在编码与解码上的差异,以及前端如何拿到可读信息。
你在统一错误提示时发现:同样是合约拒绝,有的能直接拿到「余额不足」这类文字,有的只显示一串十六进制,还有的什么都拿不到。
请说明这几类拒绝在编码层面有什么不同,以及前端要具备什么条件才能把十六进制还原成可读文字。
Error(string) 和自定义错误都使用 4 字节选择器加 ABI 编码参数;自定义错误需要相应 ABI 才能解释。gas 耗尽通常没有可解码的回滚数据;节点在执行前拒绝交易时返回的是 RPC 错误,是否附带模拟数据取决于实现。前端应区分可解码回滚、RPC 拒绝与网络故障,不能把所有失败都显示成「合约报错」。
eth_call 做模拟:模拟失败时通常能拿到回滚数据,比等上链失败再从收据里找原因更早(依据:EIP-1474 §eth_call;工程实现)。-32xxx 错误码表达,此时没有合约回滚数据(依据:EIP-1474 §Error codes)。发现这道题有问题? 反馈此题