题目
产品希望费用展示既不至于高估、又能保证交易成功;开发同学认为「gasLimit 设大一些反正用不完会退」。请解释 gasLimit、gasUsed、未用完部分与失败交易成本之间的关系,并给出费用展示的口径。
考察目标
- 区分费用上限与实际消耗。
- 说明退款、失败与验证阶段拒绝三种情况下的费用口径。
- 设计面向用户的费用展示。
说明上限与实际消耗的结算关系、失败交易的收费口径,以及费用展示中容易混淆的数字。
产品希望费用展示既不至于高估、又能保证交易成功;开发同学认为「gasLimit 设大一些反正用不完会退」。请解释 gasLimit、gasUsed、未用完部分与失败交易成本之间的关系,并给出费用展示的口径。
gasLimit 是这笔交易允许消耗的上限,gasUsed 是实际消耗,未使用的部分按实际价格退回;不带 calldata 与 access list 的普通 ETH 转账,其固有成本为 21000 gas,带数据或访问列表时固有成本更高。执行中触发回滚时未使用的 gas 不消耗;gas 不足(out of gas)则属于异常中止,会消耗剩余 gas。在验证阶段因参数无效被拒绝的交易不进入区块。实现差异与工程取舍见深入回答。
【协议保证】gasLimit 是交易允许消耗的上限,实际结算按 gas used,差额退回(依据:EIP-1559 §Specification 的退款逻辑)。
【协议保证】不带 calldata 与 access list 的普通 ETH 转账,其固有成本为 21000 gas;固有成本公式在此基础上按 calldata 字节与 access list 条目增加(依据:EIP-1559 §Specification 的内在成本公式;EIP-2930 §Specification)。
【协议保证】执行中触发 REVERT 时,状态变更被撤销,未使用的 gas 不消耗(依据:EIP-140 §Abstract);gas 不足(out of gas)属于异常中止,会消耗剩余 gas(依据:EIP-140 §Motivation 对 running out of gas 的描述)。
【协议保证】交易费用由 gas used 与实际生效的 gas 价格共同决定(依据:EIP-1559 §Specification 的 effective_gas_price 计算)。
【协议保证】交易有效性要求发送者余额覆盖 value 与 gasLimit × maxFeePerGas;不满足条件的请求无法进入区块(依据:EIP-1559 §Specification 的有效性条件)。
【协议保证】已打包但执行回滚的交易仍按已消耗的 gas 结算,回滚不返还已消耗部分(依据:EIP-140 §Abstract、§Motivation;EIP-1559 §Specification)。
【工程经验】费用展示区分「上限」与「预计」两组数字:上限用于让用户理解最坏情况,预计用于日常认知(依据:工程经验,无规范依据)。
【工程经验】提交前用估算接口得到 gas 建议值并加入缓冲,而不是复用历史交易的固定值(依据:工程经验,无规范依据)。
【工程经验】把失败成本写进产品文案与错误提示,避免用户误认为失败交易没有费用(依据:工程经验,无规范依据)。
gasLimit 设置得越高,实际支付的费用就越多。gasLimit 显示预计消耗,或用 gasUsed 显示费用上限。gasLimit 作为新交易的参数。gasLimit 之间留多少缓冲,你会如何决定?gasLimit 与 gasUsed,知道未用完的部分会退回。发现这道题有问题? 反馈此题