题目
一个交易确认页同时拿到了 gasLimit、maxFeePerGas 和 maxPriorityFeePerGas。它们分别表示什么?用户最终支付的费用怎样确定?交易发送前和确认后,前端各应该展示哪个数值?
考察目标
- 是否能区分 Gas 数量上限与每单位 Gas 的价格上限。
- 是否理解 EIP-1559 的 base fee、priority fee、max fee 和实际成交价格。
- 是否会区分发送前最大成本、预估成本和 receipt 中的实际成本。
考察 gasLimit、gasUsed、base fee、priority fee 和 max fee 的区别与费用展示。
一个交易确认页同时拿到了 gasLimit、maxFeePerGas 和 maxPriorityFeePerGas。它们分别表示什么?用户最终支付的费用怎样确定?交易发送前和确认后,前端各应该展示哪个数值?
gasLimit 是本次交易最多允许消耗的 Gas 数量,gasUsed 才是执行后实际消耗量。EIP-1559 中,区块给出 baseFeePerGas,交易用 maxPriorityFeePerGas 限制小费,用 maxFeePerGas 限制 base fee 与小费之和。实际每单位价格不会直接等于 max fee,而是受当前 base fee 和两个上限共同约束。发送前应展示预估费用和明确标注的最大费用;确认后用 receipt 的 gasUsed × effectiveGasPrice 展示实际费用。
gasLimit 限制交易最多可以执行多少计算。合约调用在执行完成后会得到 gasUsed:
gasLimit 全额收费。因此,gasLimit × maxFeePerGas 是余额校验时需要考虑的最坏上限之一,不是用户最终必然支付的金额。
baseFeePerGas:协议根据前一区块使用情况调整的基础费,交易被打包时必须覆盖,支付后被销毁。maxPriorityFeePerGas:发送者愿意支付给验证者的小费上限。maxFeePerGas:发送者愿意为每单位 Gas 支付的总价上限,必须能够覆盖 base fee。概念上,实际 priority fee 会同时受小费上限和 maxFeePerGas - baseFeePerGas 限制。实际单价可理解为:
effectiveGasPrice = min(
maxFeePerGas,
baseFeePerGas + maxPriorityFeePerGas
)
最终执行费为:
gasUsed × effectiveGasPrice
如果 max fee 高于实际 base fee 与小费之和,差额不会被收走。前端不能把 maxFeePerGas × gasLimit 标成“预计实际支出”。
发送前建议同时展示:
交易确认后应使用 receipt 的 gasUsed 和 effectiveGasPrice 计算实际网络费。若产品支持多条 EVM 链,还应使用目标链的原生资产符号和 decimals,不能固定写成 ETH。
费用预估不是保证。模拟与正式执行之间 base fee、合约状态和执行路径都可能改变,钱包也可能让用户编辑费用字段。
const estimatedMaximumFee = gasLimit * maxFeePerGas;
const receipt = await publicClient.waitForTransactionReceipt({ hash });
const actualFee = receipt.gasUsed * receipt.effectiveGasPrice;
界面应把 estimatedMaximumFee 标成“最高网络费”,把 actualFee 标成“实际网络费”。
gasLimit 当成一定会消耗的 Gas。maxFeePerGas 当成实际成交单价。发现这道题有问题? 反馈此题