简介
EIP1559由2021年London升级引入。本文介绍EIP1559要解决的问题,解决方案以及BaseFee计算方式,并用etherscan上的数据给出实例解释。
名词概念
EIP1559演化的过程中,重要的三个概念,base fee, max feee和priorityFee有不同的叫法,以下称呼是等同的:
baseFeePerGas == BASE FEE
maxFeePerGas == maxFee == FEE CAP
maxPriorityFeePerGas == priorityFee == tip/miner tip/etc
EIP1559要解决的问题
在London升级之前的传统交易中,用户在发送交易时,需要指定gasLimit和gasPrice两个参数,来付交易费。
gasLimit参数
gasLimit是指用户愿意付的最大Gas,而真实消耗的Gas是在交易执行时计算,叫gasUsed。如果gasUsed超过gasLimit,则扣除所有交易费,执行终止。如果gasUsed小于gasLimit,则扣除gasUsed,剩下的返回给用户。
只要交易被打包,最终的交易费为gasUsed * gasPrice。返回用户的交易费为(gasLimit-gasUsed)*gasPrice。
gasPrice参数
对矿工而言,gasLimit是用户设置的,gasUsed是系统计算的,矿工没有决定权力,但矿工可以根据gasPrice来选择对自己有利的交易。
gasPrice越高,相同gasUsed前提下,意味着gasUsed * gasPrice越高,矿工获利越多。
缺陷
矿工会优先打包高gasPrice交易,对用户而言,打包系统成了一个竞标系统。在网络拥堵时情况越发严重:要想交易被尽快打包,就得给出更高的gasPrice,和其他交易竞争。
此时,用户无法设置对自己最有利的gasPrice,设置高了虽然很快打包,但可能过高造成浪费,过低则可能打包失败。
对于网络而言,gasPrice的无法预测可能导致更严重的拥堵:用户可能为了尽快打包,恶性竞争,或者反复提交交易,导致网络情况更为糟糕。
EIP1559解决方案
要解决以上问题,就得让用户能够预测gasPrice,也就是说,虽然网络拥堵导致gas price升高无法改变,但用户能够提前知道区块的gas price大致范围,进而设置合理的gas Price。甚至用户能够在拥堵时减少交易,缓解网络负担。
EIP1559核心思路,就是根据网络拥堵情况动态的调整gas Price。
1. 把gas price分为baseFee和priorityFee
- 以前的传统tx中,gasPrice整个是用户设置的。
- EIP1559中,gasprice = baseFee+priorityFee。其中baseFee是系统根据网络拥堵情况自动计算的的,priorityFee是用户自己设置的。用户最终付的gasPrice包括baseFee和priorityFee,因此用户在提交交易时,就可以预先获取系统的baseFee,进而判断自己的成本至少要大于baseFee,做出合理的交易选择。
2. 引入maxFee
有了baseFee,用户知道了网络拥堵的情况,但如果想在拥堵时打包交易,priorityFee依然需要竞标。
EIP1559引入类似于gasLimit的思路,用户可以设置maxFee,等同于gasPrice的limit。
假如用户设置maxFee为100gwei,baseFee系统计算为60gwei,priorityFee设置为10gwei,那么用户的真实gasPrice为baseFee+prioirityFee=70gwei。最终会返回maxFee-gasPrice=30gwei给用户。
也就是,priority竞标虽然存在,但maxFee可以设置用户消耗gas费的上限,提供止损方案。
3. baseFee销毁
baseFee的收益不会给到矿工,而是系统销毁,从矿工的角度,收入减少了。但好处是ETH 代币的通胀速度将减缓。现在每天 ETH 的产出是 13000 枚左右,年通胀率约为 4%。Dune Analytics 的数据显示,如果按照 EIP 1559 的方式,一年内预计销毁 2937123 枚以太坊,占增发量的 61.9%,可以把通胀率降低到 1.5%。这个数值要比比特币 1.8% 的通胀率更低,在销毁过多的情况下通胀率还可能变为负值。通过销毁基础费,可以将网络的使用价值与 ETH 价值更深地绑定在一起,在一定程度上会提升 ETH 的价值。
baseFee计算方法
基本思路:
- 设置blockSize,区块的最大Gas Limit为30M。
- 设置gasTarget,理想区块的gasLimit为15M。也就是虽然区块最大的gasLimit为30M,但那只是极端情况,理想区块的gasLimit应该是15M。
- 上一个区块的gasUsed和gasTarget比较,如果gasUsed>15M,则baseFee增加,反之则减少。
- 在区块达到30M的极端情况,baseFee的变化率为12.5%。比如当前区块为30M,则下一个区块的baseFee增加12.5%,反之则减少12.5%。12.5%是个不小的数字,如果区块大小连续超过目标值近 5 分钟,用户需要支付的基础费就要上涨十倍,近 10 分钟的话上涨 100 倍。
baseFee增加和减少的具体计算方法:
//第一个区块设置初始baseFee if INITIAL_FORK_BLOCK_NUMBER == block.number: expected_base_fee_per_gas = INITIAL_BASE_FEE //如果parent block的gasUsed等于gasTarget(15M),baseFee不变 elif parent_gas_used == parent_gas_target: expected_base_fee_per_gas = parent_base_fee_per_gas //如果gasUsed大于gasTarget,计算delta。 //计算delta与gasTarget的比例(delta/gasTarget),再乘以12.5% elif parent_gas_used > parent_gas_target: gas_used_delta = parent_gas_used - parent_gas_target base_fee_per_gas_delta = max(parent_base_fee_per_gas * gas_used_delta // parent_gas_target // BASE_FEE_MAX_CHANGE_DENOMINATOR, 1) expected_base_fee_per_gas = parent_base_fee_per_gas + base_fee_per_gas_delta else: gas_used_delta = parent_gas_target - parent_gas_used base_fee_per_gas_delta = parent_base_fee_per_gas * gas_used_delta // parent_gas_target // BASE_FEE_MAX_CHANGE_DENOMINATOR expected_base_fee_per_gas = parent_base_fee_per_gas - base_fee_per_gas_delta
思路是计算gasUsed和gasTarget的差值delta,再用delta/gasTarget,计算delta的占比,再乘以12.5,因此不难得知:
- 当区块到达30M时,delta=gasUse-gasTarget=30M-15M=15M, delta/gasTarget=1, 变化率=12.5%,因此下一个区块的baseFee增加12.5%。
- 当区块恰好15M时,delta=0M, delta/gasTarget=0,变化率为0,因此下一个区块baseFee保持不变。
实例解释
1. Block相关
一个etherscan上的Block数据:
https://etherscan.io/block/20039078

- Gas Limit: 30M Gas。又叫做blocksize, 硬上限,blocksize必须小于该数据。Gas Limit由最初的2015年的5000,经过多次EIP升级,目前是London EIP1559升级为30M。
- Gas Target: Gas Limit的一半,即15M Gas。理想的Gas容量,各个区块会努力向Target靠拢。
- Gas Used: 本Block实际包含的Gas数量。本例中占比30M的44.42%,比target 15M少11%。
- Base Fee Per Gas: 又简称为BaseFee,每个区块自动计算,会被燃烧。注意BaseFee单位是wei,代表着gas price,而不是gas。
- Burnt Fee: 被燃烧掉的gas费。等于Base Fee Per Gas * Gas Used。本例中即0.000000012140394661 * 13324957。
2. 交易相关
该区块对应的一条tx数据:
https://etherscan.io/tx/0x25e9ff6406a6d61df653be7ce38931f9f5b26309c20a003b57815e001254abc8

- Gas Limit: 本Tx消耗的最高Gas上限,实际消耗的Gas如果超过该上限则交易失败。
- Used by Txn: 本Tx实际消耗的Gas, 本例中占Gas Limit的83.33%。
- Gas Fee:
- Base: 本区块的BaseFee,由系统自动计算,用户无法修改,会被自动燃烧。
- Max Priority,又叫maxPriorityFeePerGas,GasTipCap,由用户设置,不会被燃烧,是矿工实际能收到的gas price。
- Max,又叫maxFeePerGas,GasFeeCap,用户设置的最高gas price,实际的gas price(Basefee+GasTipCap)不能高于maxFeePerGas,如果高于,则真实的gas price取值maxFeePerGas。
- Gas Price: 真实的gas price, 即min(maxFeePerGas, Basefee+GasTipCap),取计算的gas price和maxFeePerGas中最小的值。
- Burnt: BaseFee * Used by Txn,本例中即12.140394661 * 21,000。
- Txn Savings Fees: 替用户省下的Gas费。等于用户愿意支付的最大Gas Price(maxFeePerGas), 减去实际支付的Gas Price(maxPriorityFeePerGas + BaseFee),乘以Gas。也就是等同于(maxFeePerGas – Gas Price) * Used by Txn。
回复 pqf64cd8e32f5ac7553c150bd05d6f2252bb73f68dpq 取消回复