Filecoin正在开始太空竞赛。矿工们的力量开始显现。官方代码也有很多问题。几天后,版本从0.5.1升级到0.5.6。我很久没读过围棋的逻辑了。最近,我看到了与filecoin的气体计算相关的逻辑。让我们一起分享吧。本文分析了0.5.6的逻辑。Lootus代码**一次提交信息如下:
提交606a58bc6bc035ec0b90c6b50488e29e90f4238f
作者:Aayus Rajasekaranlt;[email protected];
日期:2020年8月29日星期六00:56:24-0400
Lotus 0.5.6版
莲花代码的变更日志清楚地记录了燃气成本模的变化:从原来的限额/价格到限额/保费/费用上限。新的气体模参考EIP-1559:发送事务,交易成本不超过quot;feecap*limitquot;。矿业公司赚取的交易费为quot;primium*limitquot;。简单地说,feecap*limit是天然气成本的上限,而矿工可以赚取的费用是premium*limit。(feecap premium)*将燃烧限制的天然气成本。
feecap是如何设置的?限制是否尽可能大?
燃气成本计算的相关逻辑在node/impl/full/加油,加油Gasestimatemessagegas函数。接下来,我们将详细介绍base/limit/premium/feecap。
1基本费用
为每个区块设置一个基本费用。此块中的交易需要刻录相应的basefee。注意basefee。虽然名字看起来像是费用,但实际上是价格。燃烧的具体成本是basefee*limit。基本费用相关设置在build/paramsuU共享中定义vals.go公司中国人:
const BlockGasLimit=10_000_000_000_000
常量BlockGasTarget=BlockGasLimit/2
const BaseFeeMaxChangeDenom=8//12.5%
const InitialBaseFee=100e6
const MinimumBaseFee=100
const PackingEfficiencyNum=4
常数包装效率denom=5
在初始块中,basefee设置为initialbasefee(10^8)。从当前块生成下一个块时,需要根据当前块的总限制来确定。具体逻辑请查看公链/门店/basefee.goComputebasefee和ComputeNextBaseFee函数。
·**基本费用-**基本费用(100)
·区块天然气限额-区块内所有交易的天然气限额总和。计算基本费用时,给予10%的折扣(包装效率num/包装效率denom)
·区块气限的“超出”部分-每个区块的目标尺寸-区块目标。超出blockgastarget的部分视为超出部分。注意多余的部分,可以是正的也可以是负的。
·更新的基本费用-下一个区块的基本费用,在当前区块的基础费用基础上增加12.5%的超额(basefeemaxchangedenom)。相关计算逻辑如下:
变更:=大个子。骡子(基本费用,大纽因特(三角洲)
变更=大的。Div(改变,大纽因特( build.BlockGasTarget)
变更=大的。Div(改变,大纽因特( build.baseFeeMaxChangedNom)
简言之,如果当前区块的天然气限额消耗超过区块目标,基础费将增加12.5%。在这个逻辑下,你会发现基本费用会迅速增加,当有很多交易时会迅速减少。
**的24小时基本费用可以在飞狐浏览器(fingfox)上查看https://filfox.info/zh):
2气体极限
天然气限额是指交易愿意为交易的执行支付的“油量”交易消耗的天然气限额几乎是固定的。计算过程请参考gasestimategaslimit函数。当交易在当前高度执行时,交易需要“在当前高度执行”
res,err:=a。带气体的呼叫(ctx和msg、priorMsgs、ts)
调用gas只是为了得到执行过程中消耗的气体,而不是真正改变当前状态。
3气腹
天然气溢价是指交易愿意为交易的执行支付的“石油价格”石油价格乘以石油价格。石油的数量与贸易本身有关,几乎是固定不变的。显然,在高油价和高天然气成本的情况下,矿工的收入更高,更愿意先打包交易。从发帖人的角度看,价格越低越好。Lotus代码给出了一种计算天然气溢价的方法。请检查gasestimatorgaspremium函数,该函数分为几个步骤:
·查看以前区块(4=2*2)中的所有交易,并按天然气溢价从高到低排序
·计算所有交易的“平均”天然气溢价。平均法是指找出石油消耗量的一半所消耗的天然气溢价
在:=build.BlockGasTarget*int64(块)/2
上一页,第二页:=大。零(), 大。零()
价格:=范围价格{
前1,前2=价格,价格,上一个1
在-=价格限制
如果在>0{
继续
}
}
·加上千分之五的随机性
//平均值1,标准偏差0.005=>95%,在+-1%范围内
噪音:=1+随机标准浮动64()*0.005
溢价=types.BigMul类(保险费,类.NewInt(uint64(噪声*(1lt;lt;精度))+1)
溢价=types.BigDiv类(保险费,类.NewInt(1lt;lt;精度)
4煤气帽
除天然气溢价外,交易还需要支付基础费。也就是说,一般来说,交易费用是:(GAS FEE+基础费)*燃气限额。问题是,基础费是可变的,可能太大,交易发送方不愿意支付。GAS FEE封顶是设置缴费上限。有关计算逻辑,请参见gasestimatefeecap函数。
·很有可能下一个区块不会立即打包,因此当超过10个区块打包时,我们需要考虑基础费的变化
父母基本费用:=ts块()[0]。家长基础费
增加系数:=数学。动力(1.+1./浮动64(build.baseFeeMaxChangedNom),浮点64(maxqueueblks))
感觉未来:=types.BigMul类(家长费用,类.NewInt(uint64(增加系数*(1lt;lt;8)))
感觉未来=types.BigDiv类(感觉未来,类.NewInt(1lt;lt;8)
每个区块的基本费用按12.5%计算。
·以经常项目余额的1%作为支付上限:
**接受:=types.BigDiv类( 实际平衡, 类.NewInt(**值)
·以上两种情况的**值作为煤气费上限
5气体限制设定罚款
众所周知,以太坊的气体限制可以设置得非常大。一般来说,多收的煤气费将全额退还。特别是,filecoin并不是这样的。由于基费和天然气溢价的计算都涉及天然气限额,因此天然气的实际限额非常重要。如果交易设置了不合理的气体限额,filecoin将采用惩罚机制。罚款的天然气成本也被烧掉了。基于计算的VerestigationBurn函数。
·气体超限的计算有一定的误差
常量(
气体过量使用量=11
气体过量使用nom=10
)
超过:=gasLimit-(gasOveruseNum*gasUsed)/gasOveruseDenom
低于1.1倍的耗气量被认为是合理的设置。
如果用气过多{
过量=汽油
}
超出的上限是用气量。
·根据超标比例,确定处罚油量
胃灼热:=大纽因特(汽油限制-汽油)
加斯托本=大个子。骡子(加斯托本,大纽因特(完)
加斯托本=大的。Div(加斯托本,大纽因特(煤气)
简言之,惩罚是过量/天然气使用率。如果超过使用的气体,这是所有罚款轻。
小结:
基于filecoin的gas模,引入basefee来调整事务的拥塞。如出现区块拥堵或区块交易不足,则基础费将按12.5%调整。每笔交易的计算公式为:(天然气溢价+基础费)*天然气限额。部分基础费将被烧毁,天然气溢价将用作矿工的手续费。特别要注意的是,不能随意设定气限,超过的气限会被烧毁。
文章标题:filecoin的气体相关计算逻辑
文章链接:https://www.btchangqing.cn/98019.html
更新时间:2020年09月04日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。