售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
菲力肯开始了太空竞赛。矿工的力量开始显现。官方代码也有很多问题。几天后,版本从0.5.1升级到0.5.6。我已经很久没有研究过与go语言相关的逻辑了,但是最近我研究了与文件硬币中的气体计算相关的逻辑。让我们分享它。本文分析了0.5.6的逻辑,Lotus代码的最后提交信息如下:
提交606 a 58 BC 6b c 035 EC 0 b 90 c 6b 50488 e 29 e 90 f 4238 f
author : aayus Rajasekaran[email protected]
日期2003年8月29日:星期六:56336024 2020-0400
Lotus版本0.5.6
Lotus代码CHANGELOG清楚地记录了燃气成本模型的变化:从最初的限额/价格到限额/溢价/费用上限。新燃气模式参照EIP-1559:发送交易,交易成本不超过“费用上限”。矿工赚取的交易费是“溢价*限额”。简而言之,费用上限是天然气成本的上限,而矿工可以赚取的费用是溢价上限。(费用-保险费)*燃气费用限额将被烧毁。
feecap是如何建立的?限制设置得尽可能大吗?
燃气成本计算的相关逻辑在节点/impl/full/gas中的燃气估算消息燃气功能中实现.然后,将详细介绍基数/限额/溢价/费用上限。
1.基本费用
每个模块都将设置一个基本费用。该块中的事务需要烧录相应的baseFee。请注意baseFee,虽然名称看起来像费用,但实际上是价格,具体的燃烧成本是baseFee *限制。与基本费用相关的设置在构建/参数共享中定义。
const BlockGasLimit=10 _ 000 _ 000 _ 000
const BlockGasTarget=BlockGasLimit/2
const base feemaxchangedenom=8//12.5%
const InitialBaseFee=100e6
const MinimumBaseFee=100
常量打包效率同步=4
const PackingEfficiencyDenom=5
在初始块中,baseFee设置为InitialBaseFee(10^8).当从当前块生成下一块时,需要根据当前块的总限制来确定。具体逻辑请参见连锁店/商店/基本费用的计算基本费用和计算基本费用功能。
最小基本费用-最小基本费用(100)
区块气体限额-区块中所有交易的气体限额之和,在计算基本费用(打包效率/打包效率)时,可享受10%的折扣
“超出”部分区块气体限制-每个区块都存在气体限制的目标大小-区块气体目标。超出块目标被视为超出部分。注意过度,可能是积极的,也可能是消极的。
更新的基本费用-下一个块的基本费用,在当前块的基本费用的基础上增加12.5%(基本费用最大变化)。相关计算逻辑如下:
变化:=大。Mul(baseFee,大。NewInt(delta))
变化=大。NewInt(构建。BlockGasTarget))
变化=大。NewInt(构建。BaseFeeMaxChangeDenom))
简单地说,如果当前区块的天然气消耗量超过区块天然气消耗量,基本费用将增加12.5%。在这种逻辑下,你会发现当有许多交易时,基本费用会迅速增加和减少。
最新的24小时基本费用可在飞狐浏览器中查看:
2.GasLimit
天然气限额是指交易执行时愿意支付的“石油量”。交易消耗的气体限额几乎是固定的。请检查用于计算过程的GasEstimateGasLimit函数。简而言之,当一个事务需要获得气体限制时,在当前块高度,“执行”该事务:
res,err :=a . Stmgr . callwithGas(CTX,msg,priorMsgs,ts)
只是为了在执行过程中得到消耗的气体,并没有真正改变当前的状态。
3.GasPremium
天然气溢价是指交易执行时愿意支付的“石油价格”。天然气成本是石油数量乘以石油价格的结果。石油的数量与交易本身有关,几乎是固定的。显然,油价越高,天然气成本越高,矿商的收入就越高,他们也更愿意先打包交易。从发送者的角度来看,油价越低越好。Lotus代码提供了一种计算天然气溢价的方法。请检查GasEstimateGasPremium函数,该函数分为几个步骤:
检查前面模块(4=2*2)中的所有交易,并根据天然气溢价从高到低进行排序
计算所有交易的“平均”天然气溢价。平均意味着找出一半石油消耗的天然气溢价:
:=构建。BlockGasTarget * int64(块)/2
prev1,prev2 :=大。零(),大。零()
对于_,价格:=范围价格{
prev1,prev2=price.price,prev1
价格限制
如果在0 {
继续
{}
{}
加上千分之五的随机性
//平均值1,stddev 0.005=95%在-1%以内
噪声:=1兰特。NormFloat64()*0.005
premium=类型。BigMul(高级,类型。NewInt(uint64(噪声*(1精度))1)
premium=类型。Bigp(高级,类型。NewInt(1精度))
4.GasFeeCap
除了天然气溢价,交易还需要支付基本费用。也就是说,一般来说,交易成本是:(天然气溢价基础费)*天然气限额。问题是基本费用是可变的,对于交易的发送者来说可能太大而无法支付。燃气费上限是设定支付上限。有关相关的计算逻辑,请参见GasEstimateFeeCap函数。
交易很可能不会立即打包到下一个块中,因此在打包下一个块(10个块)时,有必要考虑基本费用的变化:
parentBaseFee :=ts。块()[0]。ParentBaseFee
递增因子:=数学。功率(1。1./float64(构建。BaseFeeMaxChangeDenom),float64(maxqueueblks))
feeInFuture :=类型。BigMul(parentBaseFee,类型。NewInt(uint64(递增因子*(18)))
feeInFuture=类型。bigp(FeInfuture,类型。NewInt(18))
每块基础费按12.5%的增幅计算。
经常账户余额的1%作为支付上限:
maxAccepted :=类型。法案。平衡,类型。NewInt(MaxSpendOnFeeDenom))
上述两种情况下的最小值被视为气体费用上限
5.GasLimit设置惩罚
众所周知,以太网中的气体极限可以设置得非常大。在正常情况下,超出的燃气费用将全额退还。尤其是,菲力考恩不完全是这样的。真正的天然气限额非常重要,因为它参与基本费用和天然气溢价的计算。如果为交易设定了不合理的气体限制,Filecoin将采用惩罚机制。惩罚气体成本也被消耗,并且计算逻辑查看ComputeGasOverestimationBurn函数。
当允许一定的误差时,计算超出的气体极限
常量(
气体过度使用数=11
gasOveruseDenom=10
(
超过:=气体限制-(气体过度使用数量*气体使用量)/气体过度使用量
在气体消耗量的1.1倍内,它被认为是一个合理的设置。
如果汽油用完了{
过量=气体使用
{}
过量的上限是使用的气体量。
根据超过的比例,确定要处罚的油量:
gasToBurn :=大。新积分(气体极限-气体使用)
gasToBurn=大。Mul(gasToBurn,大。新(结束))
GastBourn=big . p(GastBourn,big。NewInt(gasUsed))
简而言之,惩罚是过量/气体使用的比率。如果超过汽油用量,将被罚款。
摘要:
文件硬币的气体模型引入了基本费用来调整交易的拥挤。如果阻塞或阻塞交易不足,基本费用将按12.5%进行调整。计算每笔交易成本的公式为(燃气溢价基础费)*燃气限额。部分基本费用将被烧掉,而气体溢价将被用作矿工的手续费。请特别注意不要任意设置气体极限,否则会燃烧掉多余的气体极限。
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!