题目
用户余额刚好覆盖转账金额,交易却被拒绝;另一个页面用 gasUsed 估算预留,在替换交易时预留不足。请说明余额校验需要考虑哪些部分,以及前端如何计算、展示与提示。
考察目标
- 理解 EIP-1559 交易的有效性条件与余额关系。
- 区分上限预留与实际结算两个口径。
- 设计预留计算、展示与错误提示流程。
从协议有效性条件出发说明余额与 gas 预留的关系,并给出前端计算、展示与错误提示的落地方案。
用户余额刚好覆盖转账金额,交易却被拒绝;另一个页面用 gasUsed 估算预留,在替换交易时预留不足。请说明余额校验需要考虑哪些部分,以及前端如何计算、展示与提示。
在 EIP-1559 交易的有效性条件中,发送者余额需要覆盖 value 与 gasLimit × maxFeePerGas 的合计;未使用的 gas 在结算时退回,但有效性校验按上限进行。因此余额仅覆盖转账金额时,请求可能在验证阶段被拒绝。实现差异与工程取舍见深入回答。
【协议保证】EIP-1559 交易的有效性条件要求发送者余额覆盖 value 与 gasLimit × maxFeePerGas 的合计(依据:EIP-1559 §Specification 的有效性条件)。
【协议保证】交易有效性按费用上限校验,实际结算按消耗量与生效价格计算,差额退回(依据:EIP-1559 §Specification)。
【协议保证】余额不足时请求会在验证或提交阶段被拒绝,错误信息通常会说明资金不足以覆盖费用与金额(依据:EIP-1559 §Specification 的有效性条件)。
【工程经验】预留计算用上限费用而不是 gasUsed:gasUsed 反映历史消耗,无法代表这笔交易的上限占用(依据:工程经验,无规范依据)。
【工程经验】金额与余额用 BigInt 参与运算,格式化为展示值时再按精度处理,避免浮点与数值范围问题(依据:工程经验,无规范依据)。
【工程经验】替换或加速交易会以更高的费用上限重新预留,需要与原始交易一并纳入余额评估(依据:工程经验,无规范依据)。
【工程经验】多笔并发提交时按合计预留评估,否则后提交的交易可能在验证阶段被拒(依据:工程经验,无规范依据)。
【工程经验】界面区分「可用余额」「本次预留」「完成后剩余」三个数字,让用户理解差额来源(依据:工程经验,无规范依据)。
【工程经验】对携带额外费用字段的交易类型,预留口径还要计入对应部分(依据:工程经验,无规范依据)。
// 省略了余额读取、估算与错误处理,仅示意预留口径
// amountWei、gasLimit、maxFeePerGas 均为 bigint
const reserved = amountWei + gasLimit * maxFeePerGas;
const enough = balanceWei >= reserved;
gasUsed 估算预留,忽略了按上限校验的有效性条件。gasLimit × maxFeePerGas 的预留公式,并指出 BigInt 的使用原因。发现这道题有问题? 反馈此题