题目
交易确认页要告诉用户「这笔交易到底做了什么」。你拿到的只有 to 和一段十六进制的 data,没有完整的 ABI 上下文。
请说明:data 字段如何区分普通转账和合约调用?没有 ABI 时你还能推断出什么,不能推断出什么?
考察目标
- 结合
to、目标地址代码、value与data判断,不能只看其中一个字段。 - calldata 的构成与参数编码规则。
- 反查选择器的可信范围。
考察 calldata 的构成、ABI 编码规则,以及 to 三种取值下的语义差异。
交易确认页要告诉用户「这笔交易到底做了什么」。你拿到的只有 to 和一段十六进制的 data,没有完整的 ABI 上下文。
请说明:data 字段如何区分普通转账和合约调用?没有 ABI 时你还能推断出什么,不能推断出什么?
to、目标地址代码、value 与 data 判断,不能只看其中一个字段。to 为空通常表示创建合约,data 是创建代码;to 有地址时,data 是传给该地址的输入字节。若目标执行的是符合 ABI 的函数调用,前 4 字节通常是函数签名的 Keccak-256 哈希前 4 字节,后面是编码参数;但空 data 也可能触发合约的接收函数,带 data 的目标也可能是普通账户或 EIP-7702 委托账户。要结合目标代码、value、ABI 和交易模拟判断,不能仅凭 to 或选择器断言真实效果。
address 按 uint160 处理(依据:Solidity 文档(abi-spec)§Types、§Formal Specification of the Encoding)。bytes、string、变长数组)先放偏移量,再放长度与数据(依据:Solidity 文档(abi-spec)§Formal Specification of the Encoding)。to 为空的交易用于部署合约,data 是创建代码;to 为合约地址时 data 是 calldata(依据:EIP-1474 §eth_call 的 to/data 参数说明)。data 非空就属于合约调用。data 一定只会浪费 gas;EIP-7702 委托账户可能执行代码。to 是合约但 data 为空会发生什么?合约没有对应入口时会怎样?data,结果会怎样?to 为空表示部署合约。to 三种取值下的不同语义,以及选择器错误带来的隐性风险。发现这道题有问题? 反馈此题