钱包要估算EIP-1559费用,不能只看一个“当前Gas价”。eth_feeHistory一次返回一段历史:每块的base fee、Gas使用比例,以及用户指定百分位上的有效优先费。最容易出错的是数组没有同样长度——baseFeePerGas故意比区块数量多一项。
请求先定义窗口与百分位
blockCount决定回看多少块,newestBlock可用区块号或latest、safe、finalized标签。rewardPercentiles必须递增并位于0到100,用来问“该区块中有多少Gas支付的有效优先费不高于这个值”。百分位不是交易数量排序,而是按Gas使用量加权。
多出来的base fee是什么
第i项baseFeePerGas对应窗口第i块,最后一项不是多抓到一块,而是依据最后区块Gas使用量推导的下一块base fee。钱包可用它构造maxFeePerGas上限,但下一块是否就是交易进入的块、网络是否继续拥堵仍不确定。
| 字段 | 长度 | 含义 |
|---|---|---|
| oldestBlock | 单值 | 窗口第一块高度 |
| baseFeePerGas | blockCount + 1 | 每块base fee与下一块推导值 |
| gasUsedRatio | blockCount | 实际Gas/区块Gas上限 |
| reward | blockCount × 百分位数 | 按Gas使用量加权的有效优先费 |
响应数组为什么不等长
- eth_feeHistory按newestBlock和blockCount返回历史窗口;oldestBlock标明第一条记录的区块号。
- baseFeePerGas比区块数多一个元素,最后一项是根据窗口最后区块推导的下一块base fee;gasUsedRatio每块一个值。
- 提供rewardPercentiles时,reward按每个区块和百分位返回有效优先费,按Gas使用量加权;结果是历史分布而非打包承诺。
从历史分布到费用建议
可取最近若干块中位或较高百分位作为priority fee起点,再根据交易紧急度、连续拥堵和节点策略调整。maxFeePerGas应覆盖预期base fee增长加priority fee;实际支付仍由所在区块base fee和出价规则决定,并非总会花完上限。
费用估算器的数据校验
- 固定newestBlock标签与blockCount
- 校验百分位递增且范围有效
- 正确处理base fee多一项的对齐
- 对空块和零reward使用回退策略
- 发送后根据回执读取实际effectiveGasPrice
EIP-1559交易字段可先看以太坊交易Type 0到4,访问列表成本参考EIP-2930何时省Gas,交易完成后按回执核对实际费用。
一个历史窗口不能适配所有拥堵
gasUsedRatio接近1不代表每笔交易都支付高小费,reward也不包含base fee。单个异常块不应支配长期估价;同样,过长历史会掩盖刚发生的拥堵。估价器需要窗口、异常值和紧急度三层策略。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。