题目
有一类交易同时带有金额与调用数据,例如「发送 1 个原生资产并调用合约的某个函数」。
用户反馈看不懂:「这到底是转账还是调用合约?我的钱去哪了?」请分析用户的误解来源,并给出界面设计建议。
考察目标
- 能否解释金额与数据同时存在时的执行语义。
- 是否理解金额进入合约后可能被进一步处理。
- 能否给出不误导的呈现方式。
考察同时存在金额与调用数据时的语义呈现,以及界面的澄清责任。
有一类交易同时带有金额与调用数据,例如「发送 1 个原生资产并调用合约的某个函数」。
用户反馈看不懂:「这到底是转账还是调用合约?我的钱去哪了?」请分析用户的误解来源,并给出界面设计建议。
这类交易的本质是调用合约并同时把金额发送过去:金额作为本次调用的附带价值进入合约,处理方式由合约代码决定,可能记录、转发或拒绝。Solidity 文档说明了接收 Ether 需要 receive 或 payable 入口,因此界面应呈现为「调用某合约方法并附带金额」而不是普通转账。
msg.value 表示随消息发送的 wei 数量,且每次外部调用都可能变化(依据:Solidity 文档(units-and-global-variables)§Block and Transaction Properties 的 msg.value)。receive 函数也没有 payable 的 fallback 时,不构成 payable 函数调用的交易无法向其转入 Ether,并抛出异常(依据:Solidity 文档(contracts)§Special Functions 的 Receive Ether Function)。receive 在空 calldata 的调用上执行,纯转账会触发它;存在 payable 的 fallback 时,纯转账会走 fallback(依据:Solidity 文档(contracts)§Special Functions 的 Receive Ether Function)。fallback 在调用数据不匹配合约中已有函数签名时执行,需要标记 payable 才能同时接收 Ether(依据:Solidity 文档(contracts)§Special Functions 的 Fallback Function)。receive 或 payable 入口时交易会失败(【协议保证】没有相应入口时转入 Ether 会抛出异常;依据:Solidity 文档(contracts)§Special Functions 的 Receive Ether Function)。发现这道题有问题? 反馈此题