# GAS基础入门

By [Oak](https://paragraph.com/@samsung-us) · 2023-02-05

---

Hi all，这里是[Oak](https://twitter.com/0xoakk)，[上一篇文章](https://mirror.xyz/0xoakk.eth/hP9vDSG9UuYHDHCtWqOyTtfbozjpoxpvak0nJRnbVcU)我们主要聊了gas在gas war时的运用，但是gas的一些基础概念只是简单带过，所以这次我们聊一下gas的基础，让大家对gas有一个更清晰的了解。

* * *

首先，大家可以先想一个问题，我们支付多少gas是怎么算出来的？

其实这跟我们平时买东西一样，我们最后付多少钱取决于购买物品的数量和单价，那么换算到gas上也一样，就是 gas\_paid（eth） = gas\_used（个） \* gas\_price（eth）（支付的gas = gas数量 \* gas单价）。

但通常我们见到的单位其实是gwei，所以这里又涉及一个单位换算，1 eth = 10^9 gwei = 10^18 wei。

是不是很简单？一个简单的小学数学计算。

那么我们进一步深入，如果要得到支付的gas，gas的单价和gas的数量这两个未知数是怎么得来的呢？

一、先说gas的数量。

首先作为一个普通玩家，我们其实只用记住一句话，那就是越复杂的合约（越复杂的交易），花的gas越多。举一个简单的例子，可能很多人还没有发现，那就是买同一个NFT，在Opensea上花的gas费比在Blur上花的gas要低，这就是因为Blur的合约比Opensea的合约更复杂。

而如果想要看到具体需要的gas数量，其实钱包（比如metamask）会帮我们算一个大概值，也就是gas\_limit（燃料限制，单位也是个），如下图。

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

我没深入了解这个功能的实现原理，但是我猜测是metamask会在交易上链前先预执行一次这笔交易，然后能够得到执行这笔交易大概需要花费的gas数量。而gas\_limit通常会比实际要花费的gas数量高一些，这是为了防止gas数量不够导致交易失败。

一笔简单的转账交易需要的gas数量是21000，又因为转账的交易复杂度是固定的，所以转账交易的gas\_limit永远是21000。

那么大家又会发现这里的gas\_limit其实是可以编辑的，如果改大改小会发生什么呢？

首先如果是改小，那么交易就会因为gas不够而导致交易失败，并且gas是不会退还的。

而如果是改大，那么这里会先判断你的余额（eth）是否大于gas\_limit \* gas\_price（这里gas\_price怎么得来的后面再讲），如果余额不足，则会提示你的余额不够支付gas，无法确认交易，而如果足够，则会一次性扣掉你设置的gas\_limit \* gas\_price的eth，然后在执行完交易后会判断实际使用了多少gas（gas\_used），而这个时候系统会返还给你多余的eth，返还的eth = （gas\_limit - gas\_used）\* gas\_price。

二、再说gas的单价。

gas单价的计算由三部分构成：base\_fee（基础费），priority\_fee（小费），max\_fee（最高费用）。

1、base\_fee：全名base\_fee\_per\_gas。每一个区块都有一个底价作为门槛，来判断你的交易是否有资格打包入块（上链），只有当你的报价高于base\_fee的时候，你的交易才有资格被上链。而在交易完成后，无论成功和失败，base\_fee都是直接烧掉的，不会转给任何人。并且base\_fee是会随着链上拥堵情况的不同而每个块变化的。

base\_fee具体是怎么变化的呢？

首先我们需要了解每个块并不是可以容纳无限多的交易的，每个块最多可以允许块内所有交易消耗的gas数量加起来为3000万，并且以1500万为界限。在当前块总消耗gas低于1500万时，那么下一个块的base\_fee会降低，反之则会升高，而降低和升高幅度的上限为12.5%，即0.875 × previous\_base\_fee ≤ base\_fee ≤ 1.125 × previous\_base\_fee。

base\_fee的具体公式为： base\_fee = previous\_base\_fee \* (1 + 1/8 \* (previous\_block\_used\_gas / 1500000 - 1))

举一个简单的例子，当前块的base\_fee（previous\_base\_fee）为100，使用的总gas（previous\_block\_used\_gas）为3000万，那么下一个块的base就等于112.5。

结合etherscan我们能看得更直观，下图红框中的39.86%由 11956598 / 3000000 得到，因为低于50%，所以代表下一个块的base\_fee会降低，反之如果高于50%则会升高。

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

2、priority\_fee：全名priority\_fee\_per\_gas。矿工可以直接这部分所有的费用。小费是用来激励矿工的，简单说就是在满足base\_fee的情况下，priority\_fee给得越高，你的交易越快被打包。目前加小费常见的使用场景是在NFT发售时，能让你快速mint到你的NFT。

3、max\_fee：全名max\_fee\_per\_gas。这是设置你能接受的最高的单价base\_fee + priority\_fee，目的是为了防止如果你的交易没有成功在当前块打包，而下一个块base\_fee升高时，你的gas没有设置够而导致交易失败。如果max\_fee设置够高，在base\_fee + priority\_fee <= max\_fee时，你的交易都是允许被打包的。

这里需要注意一点，priority\_fee并不是我们设置多少就是多少，而是priority\_fee = min(max\_priority\_fee, max\_fee - base\_fee)，系统会在你设置的max\_priority\_fee和 max\_fee - base\_fee中取最小。

所以我们得到的最终的gas\_price = priority\_fee + bas\_fee。

如下图，我们常用的metamask在gas\_fee的高级设置中，max\_base\_fee其实就是max\_fee，priority\_fee就是max\_priority\_fee。

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

* * *

以上便是这次的所有内容，总结一下：

你支付多少eth的gas，取决于gas的数量和单价（gas\_paid = gas\_used \* gas\_price）。

gas的数量（gas\_used）取决于交易的复杂度。

gas的单价（gas\_price）取决于base\_fee和priority\_fee。

* * *

这里是[Oak](https://twitter.com/0xoakk)，不定期更新一些干货，欢迎大家关注我的推特[@0xoakk](https://twitter.com/0xoakk)和分享我的文章。

---

*Originally published on [Oak](https://paragraph.com/@samsung-us/gas)*
