Twitter:https://twitter.com/0xoakk
Twitter:https://twitter.com/0xoakk

Subscribe to Oak

Subscribe to Oak
Share Dialog
Share Dialog


Hi all,这里是Oak,上一篇文章我们主要聊了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(燃料限制,单位也是个),如下图。

我没深入了解这个功能的实现原理,但是我猜测是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%则会升高。

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。

以上便是这次的所有内容,总结一下:
你支付多少eth的gas,取决于gas的数量和单价(gas_paid = gas_used * gas_price)。
gas的数量(gas_used)取决于交易的复杂度。
gas的单价(gas_price)取决于base_fee和priority_fee。
Hi all,这里是Oak,上一篇文章我们主要聊了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(燃料限制,单位也是个),如下图。

我没深入了解这个功能的实现原理,但是我猜测是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%则会升高。

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。

以上便是这次的所有内容,总结一下:
你支付多少eth的gas,取决于gas的数量和单价(gas_paid = gas_used * gas_price)。
gas的数量(gas_used)取决于交易的复杂度。
gas的单价(gas_price)取决于base_fee和priority_fee。
<100 subscribers
<100 subscribers
No activity yet