代码打铭文的Gas结构困惑

近期因为BRC20铭文大爆涨所带来铭文大热,每个公链都会来一次铭文铸造,导致市场大热。这样就带来一个问题,如何多快好省地打铭文呢?

打铭文实际上也是一种链上转账交易,只不过是自己转自己,然后在链上留下特殊的数据结构,再由中心化的组织或者机构团体进行数据索引。

既然是交易转账,那想省钱,就需要了解Gas费的结构,特别是EIP 1559之后的Gas费结构,与之前只有gasPrice很不同。

小狐狸钱包中gas fee的自定义配置

手续费的组成

手续费由两个部分组成:gas cost和gas price。其中,gas cost衡量的是运算成本,单位为gas;而gas price(或fee per gas)则是衡量每一单位gas使用者愿意支付的代价,单位为ETH的小数位Gwei。每笔交易花费的总成本就是gas cost乘以gas price。

组成费用的这两个部分,其中的gas cost部分不需要讨论,因为EIP 1559之后的规则和以前一样。方便起见,我们假设gas cost固定为1 gas或者基本交易手续费21000 gas。

变化较大的是gas price的部分,拆分成两个部分。

新的公式是gas price = base fee + priority。

用户需要设置两个max值。这两个值通常由钱包软件自动设置,但用户也可以自行设定,特别是写代码来执行区块交易的时候,这两个max值需要合理设置才能尽可能地节省手续费。理解这些值由哪些角色决定有助于避免混淆其意义,所以即使钱包软件会自动设置,用户也要视为自己设定的,钱包只是辅助执行用户的意愿。

就如在向区块发送交易前所写的字典配置

tx = {
            'nonce': nonce,
            'type': 2,    # EIP 1559费用类型
            'maxPriorityFeePerGas': Web3.to_wei(1, 'gwei'),
            'maxFeePerGas': int(web3.eth.gas_price * 1.1),
            'chainId': chain_id,
            'to': wallet.address,
            'data': data,
            'value': Web3.to_wei(0, 'ether')
        }

在这个交易结构中,只需要注意这里没有用gasPrice

  • maxFeePerGas(最大基础费用)是用户愿意为每一单位gas最多支付的wei数;
  • maxPriorityFeePerGas(优先费用)是用户愿意为每一单位gas支付给矿工的wei数。
  • 需要记住,这两个数在浏览器钱包中的单位不是wei,但绝大多数是Gwei。

这是什么含义呢,这么理解

用户的交易能否被打包由矿工决定。但一旦打包,区块链会先吃第一口,矿工才能吃剩下的。

在区块链吃第一口时无法超过maxFeePerGas,在矿工吃剩下时也不能超过maxPriorityFeePerGas。

区块链会根据短暂时间内系统负担的程度决定想吃多少。这个数值称为base fee(基础费用),在浏览器钱包中的单位是Gwei。这个数字可以在一些仪表板上查询到。

严格来说 对于想严格了解细节的读者,这里摘出了部分EIP-1559的规格。否则可以直接进例题看看是否可以理解。

eip 1559规则

代码中还有一个变量叫gas_limit,这是区块交易者所设定的最高gas数量限制,如标准的ETH转账需要21000个单位gas,但我们在代码里面下发交易的时候,可以设定为这个单位的1.1倍,交易执行完剩下的gas会归还给交易者,如上面的代码gas_refund所示。

使用案例

对于以下案例部分,只会用到前两行,用本文使用的名字简化之后长这样。

案例1:(以下假设用户都有足够余额,交易成功)

现在base fee为114 Gwei。用户将max fee设置为255 Gwei,max priority设为1 Gwei。请问每单位gas用户需要支付多少Gwei?

答:区块链需要支付114 Gwei,而用户愿意支付255 Gwei,因此区块链可以支付114 Gwei。然后区块链吃完后还剩下141 Gwei,但用户只愿意支付给矿工1 Gwei。因此矿工只能吃到1 Gwei。

结论:每单位gas的费用为114+1=115 Gwei。

案例2:用户设置同前,base fee涨到280 Gwei。

答:区块链想支付280 Gwei,但用户只愿意支付255 Gwei。交易未被打包,继续在交易池中等待。

案例3:base fee为114 Gwei,max fee为255 Gwei,max priority为255 Gwei。

答:区块链吃完114 Gwei后,剩下的141 Gwei也会全部由矿工吃掉。共花费255 Gwei。

案例4:base fee为114 Gwei,max fee为255 Gwei,max priority为1 Gwei,gas为24000,这笔标准转账交易会归还多少费用

答:区块链和矿工吃完114+1=115 Gwei,剩下110 Gwei没扣除,而gas则只使用21000gas,剩下3000gas,因此归还了3000*115Gwei = 345000 Gwei。

什么时候会发生例题三的情况?

  • 第一种情况是区块链使用量突然暴增的情况。

这时,即使区块链已经在调升base fee,但系统无法服务当下所有出价足够的用户。因此这些用户会使用max priority去争取矿工优先打包。

在系统使用量稳定的时候,base fee会调整到系统能服务所有愿意付出该价格以上的用户。用户只需给矿工很少的代价争取打包即可(例如1 Gwei)。

不着急的用户不必担心第一种使用量暴增问题,睡个觉等热闹结束,系统使用量没那么高时,再来执行自己的交易即可。但需要注意第二种情况。

  • 第二种情况是用户使用了旧型的交易格式(Legacy Transaction)。

这会发生在没有针对伦敦升级更新的钱包软件上,以及科学家代码中只设置gasPrice的时候。先前的钱包软件只会设置gasPrice这个参数,这个参数在伦敦升级后会被解释为max fee和max priority的值。例如,钱包软件设置gasPrice为255 Gwei,则协议会解释为max fee是255 Gwei,max priority也是255 Gwei。

使用旧交易格式对用户不利,因为相较于新交易格式(Type 2 Transaction)可以将max priority设置成1 Gwei,旧交易格式相当于允许矿工第二口把max fee吃到饱。

总结

伦敦升级之后的EIP-1559系统性地省下不少交易成本。对于一般使用量较少的用户来说可能比较没有感觉。但经常需要发送交易的交易所则有许多数据,Coinbase最近发布报告用实际案例分析省了多少手续费。也有新论文表示升级之后使用者平均等待时间减少了。

对于一般用户而言,如果最近需要发送交易的话,尽量找有支持新交易格式的钱包发,可以省不少手续费。钱包有实现的话,发送交易时可以看到max fee和max priority等字样。写代码的话,同样要注意这三个交易参数的设置,即: type、maxPriorityFeePerGas、maxFeePerGas

参考资料

  1. A Definitive Guide to Ethereum EIP-1559 Gas Fee Calculations: Base Fee, Priority Fee, Max Fee
  2. 倫敦升級之後的 gas 費用計算
  3. EIP 1559规则说明
  4. Eth官方的gas说明

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Scroll to Top