手把手教你用 EIP-1559 打造「慢速 / 平均 / 快速」三档 Gas 价系统

·

关键词:EIP-1559、Gas 费计算、ETH 手续费、区块浏览器、Web3 开发、基础费率(base fee)、优先费(priority fee)

为何重新设计 Gas 价?

在 EIP-1559 实施以前,以太坊的「先到先得」第一价格拍卖模式,让「竞价」变得既昂贵又难以预测。一次爆款 NFT 发布或 DeFi 抢跑,就可能把 gas 费从 10 Gwei 瞬推到 300 Gwei。
EIP-1559 通过 动态基础费率 + 可预测优先费 的方式,把波动区间压缩并引入了算法,而这恰好为钱包/应用里常见的「慢 / 中 / 快」三档按钮提供了最佳实现路径。


拆解 EIP-1559 的收费公式

实际花费 = Gas Used × (base fee + priority fee)

1. 如何计算下一区块的 Base Fee

Base Fee 的算法写死在每个以太节点里,核心逻辑只有一句:

父区块用满则涨,用少则跌。

1.1 官方公式转 Python

from web3 import Web3, exceptions

ETH_RPC = "https://services.tokenview.io/vipapi/nodeservice/eth"  # 读者自填 API Key
w3 = Web3(Web3.HTTPProvider(ETH_RPC))

ELASTICITY_MULTIPLIER = 2
DENOMINATOR = 8

def next_base_fee(parent):
    # 目标容量 = gasLimit // 2
    gas_target = parent.gasLimit // ELASTICITY_MULTIPLIER
    if parent.gasUsed == gas_target:
        return parent.baseFeePerGas
    if parent.gasUsed > gas_target:
        delta = parent.baseFeePerGas * (parent.gasUsed - gas_target) // gas_target // DENOMINATOR
        return parent.baseFeePerGas + max(delta, 1)
    else:
        delta = parent.baseFeePerGas * (gas_target - parent.gasUsed) // gas_target // DENOMINATOR
        return max(parent.baseFeePerGas - delta, 0)

parent = w3.eth.get_block('latest')
print("下一区块基础费约为", next_base_fee(parent) / 1e9, "Gwei")

运行结果即时给出下一个区块会调整到多少 Gwei,可用于前端实时预估值。


2. 如何估算三档 Priority Fee(矿工小费)

Base Fee 已知,剩下就是决定你愿意给小费是 25% 低优先级 / 50% 中优先级 / 75% 高优先级 中的哪一档。

2.1 使用 eth_feeHistory 抓取最近链上行情

history = w3.eth.fee_history(
    block_count=4,         # 取最近 4 个区块
    newest_block='latest', # 最新块
    reward_percentiles=[25, 50, 75]
)

返回字段 reward 就是每块内 成功被打包的交易 所付出的优先费百分位值。

2.2 把历史数据变成三档平均价

import numpy as np

lows = [np.array(r)[0] for r in history['reward']]
medians = [np.array(r)[1] for r in history['reward']]
highs = [np.array(r)[2] for r in history['reward']]

estimates = {
    'slow': int(np.mean(lows)),    # 25% 位平均值
    'average': int(np.mean(medians)), # 50%
    'fast': int(np.mean(highs))    # 75%
}

print(estimates)

3. 组合三段式 UI 的完整实现

把前两步合并,你可以在前端直接提供三档按钮:

按钮Base Fee 实时值Priority Fee 估计预估总花费 (Gwei)
Slow221.123.1
Normal222.424.4
Fast224.826.8

接入官方 SDK(web3.js/pygmy/ ethers.js)即可在 10 秒内下拉刷新,实现 无广告、无猜测、开源可查 的费率体系。


实战拓展:如何优化误差?

  1. 扩大历史范围:把 block_count 从 4 提升到 20,平滑极端波动。
  2. 剔除异常值:高于 98 百分位或低于 5 百分位的值直接丢掉。
  3. 分层融合:针对不同交易类型(ERC-20、NFT、DEX swap)分别学习历史分布。一个交易种类一张表,命中率提升 30% 以上。

FAQ:开发者最关心的 4 个问题

Q1:Base Fee 会被燃烧?那矿工还有多少激励?
A:是的,Base Fee 全部销毁,保障 ETH 的通缩模型;矿工收入来自 Priority Fee,因此足够的小费依然可以吸引出块。

Q2:如果用户设置的小费低于网络平均值会怎样?
A:交易会进入内存池,等待后续低峰区块;极端情况下可能「卡住」数小时。方案是提供「提速」按钮推送替换交易。

Q3:为什么我的计算结果和钱包显示仍然有 5–10% 偏差?
A:钱包往往结合「节点实时池」+「私有 RPC」预测,就会更精准。但 EIP-1559 算法公开,任何开源部署都可以在 1–2% 内对齐。

Q4:是否可以完全放弃 Priority Fee,只付 Base Fee?
A:理论可行,但在网络拥堵期交易可能排在末尾甚至不被矿工选中,建议至少附赠 1 Gwei 小费以确保成功率。


尾声:把 Gas 费做成竞争优势

当所有钱包都还在显示「≈」估算值时,一套点对点的 实时小费计算 + 滑动条秒级更新 的交互,往往可以把用户留存率提高一倍以上。
👉 立即开启下一等级的高阶实战示例,帮你把 Gas 估算压缩到 1% 误差区间。


最后提醒:代码示例与网络节点是开源的,上线前请本地测试并通过测试网 Shadow Fork 验证,以防主网风险。祝各位开发者早日脱离「拍脑袋」定价,拥抱可编程的以太坊手续费时代!