# EIP-1559 详解

By [Untitled](https://paragraph.com/@0xfed7b13c9557e50f0575391ccc824f0193f06a88) · 2023-11-29

---

什么是 EIP-1559
============

[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)（以太坊改进提案 1559）是以太坊网络的一个重要升级提案，它在 2021.08.05 以太坊伦敦硬分叉升级被正式激活。这个升级旨在改善以太坊的交易费用机制，以提高网络的可预测性和用户体验。

改进1：每个区块的 gasLimit 由原先的 1500w 调整为 3000w

改进2：改进之前只有 Gas Price；改进之后有 Max Price、Priority Price、Base Price

改进3：Base Price 部分的 ETH 销毁，从而让 ETH 通缩

注意：EIP-1559 仍然能够处理传统方式设置的手续费，只不过做了如下转换：「Max Price = Gas Price」、「Priority Price = Gas Price」

### Base 计算规则

Base 会根据上一区块的空间利用率自动调整，如果利用率超过 50%，则提升当前区块的 base，反之降低。

Base 初始值为 `1000000000` 即 1Gwei

按照 base 计算公式，相邻区块间的 base 变化幅度在 ±12.5% 之间：

*   如果上一区块空间利用率为 100%，则当前区块 baseFee 将自动提升 12.5%
    
*   如果上一区块空间利用率为 0%，则当前区块 baseFee 将自动降低 12.5%
    

简而言之，当区块使用率超过 50% 时，下一个区块的 base 会自动升高，最高比例为 12.5%，当区块使用率低于 50% 时，下一个区块的 base 会自动降低，最高比例为 12.5%。相对之前 Gas Price 完全由用户提供，经常大起大落，base 的变化显然是更加可预测也更加平缓的。每个区块的 base 是维护在区块头中的。发送交易的时候，用户不需要指定 base。

举例

    1. 每个区块的 Gas Limit 固定为 3000w，即 **parent_gas_limit = 3000w**
    2. 每个区块的 Gas Target 固定为 1500w，即 **parent_gas_target = 1500w**
    3. 父区块的 Gas Usage，即 parent_gas_used，可以直接从区块链网络中获取到
    
    # base 计算规则
    if INITIAL_FORK_BLOCK_NUMBER == block.number:
      expected_base_fee_per_gas = INITIAL_BASE_FEE
    elif parent_gas_used == parent_gas_target:
      expected_base_fee_per_gas = parent_base_fee_per_gas
    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
    assert expected_base_fee_per_gas == block.base_fee_per_gas, 'invalid block: base fee not correct'
    
    # base 计算规则人话版
    1. EIP1559 初始区块 basePerGas 为 1Gwei
    2. 如果父块的 parent_gas_used = 1500w，则本块的 basePerGas 跟父块的 basePerGas 保持一致
    3. 如果父块的 parent_gas_used > 1500w，见下图 (+ 操作)
    4. 如果父块的 parent_gas_used < 1500w，见下图 (- 操作)
    

![](https://storage.googleapis.com/papyrus_images/cf31a2b40be7ca5e8bdd599c053d5768be63c2e6fc4d6485d39dd95064194840.png)

EIP-1559 的优势
------------

1.  **以太坊链上交易的用户体验更好**
    
    EIP-1559 使得以太坊的手续费在协议级上明确（基础费用），从而减少了手续费和交易时间的许多不确定性
    
2.  **ETH 经济机制**
    
    基础费用的销毁可能会使 ETH 从通货膨胀资产转变为供应稳步减少的通货紧缩资产
    
3.  提高了**以太坊安全性**
    
    EIP-1559 有助于防止针对以太坊网络的垃圾交易攻击。在此之前，理论上，攻击者可以通过与矿工串通，试图以低于市场价格的手续费向以太坊发送垃圾交易。但是 EIP-1559 确保了这样的垃圾交易发送者永远无法以支付低于基础费用来发起攻击。因此，随着时间的推移，这种攻击甚至会变得更加昂贵，因为罪犯不断发送垃圾交易会不断提高基础费用。
    

名词解释
====

`maxPerGas(Max)` 用户设定的，**每单位 Gas** 的最高价格

`maxPriorityPerGas(Max Priority)` 用户设定的，**每单位 Gas** 的最高优先费价格

`basePerGas(Base)` 交易打包时，以太坊网络设定的**每单位 Gas** 的基础价格

`gasPrice(Gas Price)` 交易打包时，用户实际为每**单位 Gas** 支付的价格

`gasLimit` 用户设定的，该笔交易最大能消耗的 **Gas 数量**

`gasUsage` 该笔交易打包时，实际需要消耗的 **Gas 数量**

`burnt(Burnt)`该笔交易燃烧掉的 **ETH 数量**

`transactionFee(Transaction Fee)`该笔交易用户实际支出手续费的 **ETH 数量**

`txnSavings(Txn Savings)` 该笔交易「用户愿意付的最高费用」和「实际花费」的 **ETH 数量**差额

`minerEarnings` 该笔交易矿工可以拿到的 **ETH 数量**

`GasFeeEstimated` = `maxPerGas` \* `gasLimit` 签名时显示的预估 Gas Fee

min(`maxPerGas` - `basePerGas`, `maxPriorityPerGas`) 矿工**每单位 Gas** 的收益

EIP-1559 中，各种 fee 的计算
=====================

### 情况0：`basePerGas` > `maxPerGas`

交易处于 pending 状态，直到 `maxPerGas` ≥ `basePerGas`

### 情况1：`maxPerGas` ≥ `basePerGas` + `maxPriorityPerGas`

`burnt` = `basePerGas` \* `gasUsage`

`gasPrice` = `basePerGas` + `maxPriorityPerGas`

`transactionFee` = `gasPrice` \* `gasUsage`

`txnSavings` = (`maxPerGas` - `gasPrice` ) \* `gasUsage`

`minerEarnings` = `maxPriorityPerGas` \* `gasUsage`

### 情况2：`basePerGas` < `maxPerGas` < `basePerGas` + `maxPriorityPerGas`

`burnt` = `basePerGas` \* `gasUsage`

`gasPrice` = `maxPerGas` = `basePerGas` + (`maxPerGas` - `basePerGas`)

`transactionFee` = `gasPrice` \* `gasUsage`

`txnSavings` = (`maxPerGas` - `gasPrice` ) \* `gasUsage` = 0

`minerEarnings` = (`maxPerGas` - `basePerGas`) \* `gasUsage`

题：自己在测试网构造或者直接从区块链浏览器上各找一笔【情况2】和【情况3】的交易，利用上面的公式，进行验证计算
=======================================================

参考链接
====

[**详解以太坊 EIP-1559 协议**](https://zhuanlan.zhihu.com/p/447105835)

[**以太坊伦敦升级 | EIP-1559 是什么**](https://zhuanlan.zhihu.com/p/396731277)

[**EIP-1559: Fee market change for ETH 1.0 chain**](https://eips.ethereum.org/EIPS/eip-1559)

[https://etherscan.io/blocks](https://etherscan.io/blocks)

[https://blog.csdn.net/u011721501/article/details/120006062](https://blog.csdn.net/u011721501/article/details/120006062)

[https://learnblockchain.cn/article/1133](https://learnblockchain.cn/article/1133)

[https://zhuanlan.zhihu.com/p/469028626](https://zhuanlan.zhihu.com/p/469028626)

---

*Originally published on [Untitled](https://paragraph.com/@0xfed7b13c9557e50f0575391ccc824f0193f06a88/eip-1559)*
