跳到正文

研究指南

加密现货研究

失败交易:计算每次成功操作承担的Gas成本

应用可能为没有完成经济动作的尝试支付Gas。研究成本效率,需要把回执费用与明确定义的成功结果连接起来。只看成功回执会漏掉失败支出,把所有回执都当活动成功,又会高估实际完成量。

以太坊Gas文档介绍计算工作收费与Gas核算。本文使用已纳入链交易的实际扣费。纳入前就被拒绝的请求是另一群体,没有费用证据就不能给它分配链上Gas。

先定义成功,再算比率

明确目标合约、动作类型、观察区间与经济成功标准。交易状态只是一个输入:成功的包装调用内部,也可能包含失败或按条件跳过的动作,需按应用逻辑检查事件或结果状态。

逐笔保存哈希、回执状态、实际Gas耗用、有效单价和应用结果。执行成本应来自回执字段,不能把最大Gas限额当成实际消耗。回滚相关状态变化,不意味着此前已经进行的计算免费。

同时规定成本边界。窄口径可以只包含目标网络执行Gas,其他手续费、赞助支付和多步骤操作需要额外列。还要说明付款人;赞助方承担费用时,系统毛成本与用户直接成本不同。

假设案例:失败负担有多大

假设虚构应用一天有90笔成功交易,每笔完成一个动作;另有10笔回滚。每笔成功消耗100000 Gas,每笔回滚消耗50000 Gas,所有交易有效单价均假设为20 gwei。

成功部分消耗9000000 Gas、支付0.18 ETH;失败部分消耗500000 Gas、支付0.01 ETH,总支出0.19 ETH。

指标假设结果
每次纳入尝试成本0.19÷100=0.0019 ETH
只看成功交易的单位成本0.18÷90=0.002 ETH
全部尝试分摊每次完成动作0.19÷90≈0.002111 ETH
失败支出占比0.01÷0.19≈5.26%

后两项展示失败负担。交易失败率为10%,不意味着Gas支出也浪费10%,因为两类耗用不同。例子所有数字都是假设。

如果部分成功交易一次完成两个动作,分母应改为实际动作数,不能习惯性继续用90。保留交易数和动作数,才不会把批处理变化无说明地描述为效率改善。

解释变化,但不轻率归责

按有证据的错误类别、合约版本和运行条件拆分失败支出。失败增加可能来自保护检查、不兼容输入、市场变化、用户错误或缺陷。回滚原因可以缩小范围,但不能单独确定唯一原因。

比较群体时保持动作定义及费用边界一致。单位Gas下降而单价上涨,ETH成本仍可能上升,应分别展示耗用和价格贡献。赞助政策改变后,用户直接负担可能上涨,而应用总成本并未变化。

有依据时关联重试,但不能假设重复调用都是误操作。未完成的多步骤流程单列。授权交易已经付费、后续目标动作却未发生时,这笔费用是否计入,应取决于事先声明的工作流边界。

手动核对少量成功、回滚和条件包装交易,并把逐笔费用合计与总额调节一致。除法算对了,也不能修复缺失回执,或来自另一组合约范围的经济动作分母。

最终交付是每结果成本桥,让失败费用可见,不凭统计宣布应用有缺陷。逻辑、批处理、费用赞助或成功定义改变时,应重算。

经济价值与资源成本应分开。回滚转账可能没有移动代币本金,却仍产生费用;转移金额为零与支出非零并不矛盾。也不能把所有保护性拒绝都叫可避免浪费。费用确实存在,但是否能避免,需要与真实可行的替代执行路径比较,不能只拿事后完美结果作基准。

常见问题

回滚交易一定不花钱吗?

不是。已纳入交易可能按消耗Gas扣费,应查真实回执,而不是把执行失败当成零支出。

回执成功就能计作经济动作完成吗?

不一定。包装、批量及条件调用需要验证应用自己的结果,再累计相应动作。

相关阅读