题目
一个 DApp 提供「向合约地址存入 ETH」的功能。测试时出现三种情况:有的合约地址收到 ETH 后余额增加,但页面期待的函数逻辑没有生效;有的地址转账直接失败;还有的地址在区块链浏览器上显示有代码,却看不到转入记录。请说明向合约发送 ETH 时执行路径是怎样的,以及前端应该如何处理这几种结果。
考察目标
- receive 与 fallback 的触发条件。
- 缺少可接收 ETH 入口时的失败语义。
- 失败原因的分类与用户提示。
从 receive 与 fallback 的触发条件出发,说明向合约发送 ETH 的执行路径、失败条件与前端处理方式。
一个 DApp 提供「向合约地址存入 ETH」的功能。测试时出现三种情况:有的合约地址收到 ETH 后余额增加,但页面期待的函数逻辑没有生效;有的地址转账直接失败;还有的地址在区块链浏览器上显示有代码,却看不到转入记录。请说明向合约发送 ETH 时执行路径是怎样的,以及前端应该如何处理这几种结果。
向合约地址发送 ETH 时会执行目标合约的代码:calldata 为空时执行 receive(),合约未实现 receive 但存在 payable fallback 时会走 fallback;calldata 非空且没有匹配到函数时走 fallback;若合约没有可接收 ETH 的 payable 入口,这笔转账会失败并消耗 gas。实现差异与工程取舍见深入回答。
发现这道题有问题? 反馈此题