WEI:平行链上线技术系列二:Substrate交易费率和Benchmark

SubstrateTransactionfees?andBenchmark

交易费用存在的意义

我们需要为我们的区块链设计手续费,是为了激励参与方更加有效的协作,调节资源的利用率,毕竟天下没有免费的午餐。

Substrate的Fees如何计算

使用以下参数计算交易的最终费用:

basefee:这是用户为交易支付的最低金额。它在运行时被声明为baseweight,在runtime下配置

WeightToFee即可。

weightfee:与交易消耗的执行时间成比例的费用。

lengthfee:与交易的编码长度成比例的费用。

tip:增加事务优先级的可选提示,使其有更高的机会被包含在事务队列中。

base_fee、weight_fee和length_fee构成inclusionfee(包含费用)。inclusionfee(包含费用)是交易被包含在一个区块中必须可用的最低费用。

使用?transaction?paymentpallet

pallet-transaction-payment提供了计算inclusionfee的基本逻辑。

这个pallet提供以下配置项:

Config::WeightToFee将weight转换为基于货币类型的可扣除费用

Config::FeeMultiplierUpdate通过定义一个乘数来更新下一个块的费用,基于上一个块结束时链的最终状态。

Config::OnChargeTransaction管理transactionfee的取款、退款和存款。

ps:交易费用在交易执行之前被提取。事务执行后,可以调整事务权重以反映事务使用的实际资源。如果交易使用的资源少于预期,则更正交易费用并存入调整后的交易费用。

交易费用的公式

inclusion_fee=base_feelength_fee;

SubDAO将参与波卡首轮平行链竞拍并推出平行链网络Starfish:10月14日消息,波卡DAO基础设施SubDAO计划参与波卡第一轮平行链竞拍,并将正式推出平行链网络Starfish(海星网络)。其中所有为 SubDAO 竞拍提供 DOT 质押的社区用户都可获得SubDAO原生代币GOV(Governance)作为奖励,具体竞拍策略和奖励规则将于近期公布。

SubDAO 是波卡 DAO 基础设施,创始团队由 IBM 前 Technical Team Leader 和波卡早期开发者组成,它允许任何去中心化组织快捷地创建和管理 DAO,并提供基于区块链的电子协议签署、DAO 社交、资产管理等工具与服务。[2021/10/14 20:28:33]

final_fee=inclusion_feetip;

细化之后的公式->

在这个公式中,targeted_fee_adjustment是一个乘数,可以根据网络的拥塞情况调整最终费用。

base_fee其实就是ExtrinsicBaseWeight的大小转换为Balance的值

length_fee是交易体存储的费用。

weight_fee通过两个参数计算:

??a.在ExtrinsicBaseWeight运行时声明并适用于所有外部变量的。

??b.#解释外部复杂性的注释。

要将权重转换为货币,运行时必须定义一个WeightToFee实现转换函数的结构体Convert.

请注意,在调用外部发件人之前,会向外部发件人收取包含费用。即使交易在执行时失败,费用也会从发件人的余额中扣除。

基础费用

是用户为交易支付的最低费用。它在Runtime被声明为baseweight,其实就是ExtrinsicBaseWeight的大小转换为Balance的值。所以需要设计Weight转换为Balance的公式--?WeightToFee,WeightToFee在pallet-transaction-payment处进行配置即可。

KuCoin (库币)平台Kusama平行链插槽竞拍已支持Sakura项目:据KuCoin(库币)官方公告,KuCoin平台Kusama平行链插槽竞拍已支持新的Sakura项目,用户可通过Pool-X平台为其投票,参与插槽竞拍,为支持的波卡生态项目助力。

据悉,通过KuCoin参与Kusama插槽竞拍除了有机会瓜分链上奖池外,项目方还设立了KuCoin专属奖池,一旦项目竞拍成功,所有在KuCoin参与并为该项目助力的用户可瓜分该奖池。

KuCoin(库币)旨在发掘优质区块链项目,为来自207个国家的800万用户提供现货、杠杆、合约、Staking 、借贷等一站式服务。[2021/6/18 23:47:41]

关于ExtrinsicBaseWeight的配置

通过runtime下frame_system::Config的BlockWeights的base_extrinsic进行配置。

关于WeightToFee:

WeightToFee可以理解为一单位Weight与一单位Balance之间的映射转换。

Code实现

在代码实现那块主要是对一个pubstructLinearWeightToFee(sp_std::marker::PhantomData);添加WeightToFeePolynomial宏。

只需要实现这个宏里的polynomial()方法即可

polynomial()其实是在定义weight转换为balance的多项式。

关于WeightToFeeCoefficient的配置细节

这个返回的是一个多项式公式

其中negative值是控制整体多项式是加上该多项式还是减去该多项式

negative的对应关系:

true→-

flase→

多项式的公式如下

例如:

如果我们想实现一个1:1的WeightToFee的转换,那这里的配置应该是:

波卡网络理事会成员Qinwen: 渐进式上线保证波卡平行链稀有性并减轻中继链负担:2月4日 15:00,波卡网络理事会成员Qinwen作客MXC抹茶社区,就“波卡平行链插槽拍卖在即,这些事实你必须知道”作出分享。

Qinwen 表示:“Polkadot是一个去中心化的网络。任何项目都可以为生态系统做出贡献,任何与Polkadot兼容的区块链都可以竞标插槽或作为平行线程进行连接。之前在Gavin的一些社区采访中也提到,平行链会先在 Kusama 网络上部署;对于创世期来说,不太可能有许多平行链, 上线是渐进式进行的,首批平行链将不会通过竞拍产生,而是系统级平行链,来减轻中继链的负担,增加更多的平行链。”[2021/2/4 18:54:50]

对应的多项式为:

小总结:

WeightToFee只是Weight转换成Balance的映射转换,只需要在pallet_transaction_payment指定WeightToFee即可。

因为交易费中涉及到weight的内容不止basefee,还有weightfee,这两个都是把pallet_transaction_payment指定的WeightToFee作为转换公式。

basefee公式:

字节费用

lengthfee主要计算的是交易体大小的费用。

对于lengthfee的计算公式:

Length_Fee=交易体大小*每字节所需费用

每字节的费用可以在runtime下pallet_transaction_payment的

TransactionByteFee做定制。

TransactionByteFee?=>?指定每个字节值多少Balance。

其次就是交易体的大小,但是要了解交易体的大小,首先需要了解交易体的内容构造。

关于交易体的构造:

Substrate入门-交易体-

???在Substrate中的交易不再称为Transaction,而是称为了Extrinsic,中文翻译就是“外部的;外表的;外源性”,意味着被称为Extrinsic的概念,对于区块链而言是外部的输入。这种定义脱离了本身“交易”的范畴,而是在链的状态的角度下,认为交易及类似概念是一种改变状态的外部输入。

现场丨Bifrost联合创始人Lurpis:波卡处于萌芽期 平行链上线才能看出波卡是否为牛市的爆发点:金色财经现场报道,10月11日,由金色财经、Candaq和哼哈互动联合发起的金色沙龙第55期“Polkadot-波卡万物生长与跨界破圈对话”在北京正式举行。在本次沙龙上, Bifrost联合创始人兼CEO Lurpis表示,

波卡和以太坊是两个维度的事物,波卡的无分叉升级、异构跨链和共享安全性的几个特性吸引了很多开发者。随着时间的发展,波卡的技术架构会更加灵活,因为它扩展性强,并且能以更低的成本做一些产品上的升级。他认为,跨链、DeFi、DAO是渐进式的,如果在波卡上实现DeFi,就要先实现跨链,波卡上的DeFi 是可以支持多资产的。DeFi下一步才是Dao的环节,Dao作为项目去中心化治理的前提,通过对参数上的调整,达到项目市场发展目标。

此外,他指出现在这个阶段整个波卡是处于比较早的萌芽期,随着平行链的上线,各地的业务开展情况,才能看出来波卡会不会是下一个牛市中爆发的方向。[2020/10/11]

一个“外部输入”至少会具备以下两个条件:

发送者的证明

外部输入的行为

其中第一点是显然的,只要基于公私钥体系,就一定需要发送者对这个发送的内容进行签名,在链上通过这个签名验证合法性,解析出发送者的公钥识别身份。等价于互联网中客户端持有的token这类的。而第二点就是这个“输入”是到链上干嘛的,其相当于是用户发送到链上的指令行为。

关于链下如何构造这个signature,

插曲:链下一个交易体的构成:

交易bytes内容的构造:

pallet-funcindex发起人的Accountsignature(signed,signature,extra)call

pallet-funcindex是通过palletname和functionname在metadata里查询得到到index

交易执行之后可以在此处

explorer下观察到signature的信息:

Liam:目前的平行链还处于测试阶段,还要等待未来更多升级:9月3日消息,Stafi Cofounder?Liam在做客HyperPay焦点栏目时提及:波卡的中继链不但为接入其中的平行链提供了安全性,也保证了他们之间安全的信息传递。同时这些平行链可以同时工作,假如接入了10条平行链,那么这10条链可以同时工作互不影响,从而节省了计算时间。一些高度专业的平行链可以针对其专业领域有效实现数据存储和交易操作而不限定于区块链的脚本语言或虚拟机中。波卡平行链通过异步消息传递相互通信,仅仅在平心链相交的边界处支付手续费即可。目前的平行链还处于测试阶段,还需要等待未来的更多升级。[2020/9/3]

call里的内容主要由callindex和参数构造而成。

至此我们获悉了交易体的byte信息

所以对于上述的例子,相对应的字节费用为

其实在这里可以观察到由于交易体的设计,可以实现在发送之前就可以计算出交易的大小从而推导出交易的手续费。

还有其他的玩法:

交易版本与链上版本检查

交易存活性检查

特殊交易的额外信息检查

例如如果一个交易是转账transfer,可以直接检查发送者的余额是否足够,不用到区块执行阶段才判定。

权重费用(weight_fee)

在有限的区块生成时间和链上状态的限制下,权重被用来定义交易产生的计算复杂度即所消耗的计算资源,以及占据的链上状态。system模块定义了区块的总权重。

#

为了保证在网络繁忙的情况下,依然能够实现对区块链应用有效合理的管理,Substrate引入了三种不同级别的交易类型,既Normal、Operational和Mandatory类型。

Normal类型的交易是由网络中的普通用户提交,

Operational类型的交易是由网络中的管理员或者管理委员会共同触发。

Mandatory类型的交易表示网络中区块交易所必须的交易信息,通常是内在的交易,由验证人触发。

区块资源如长度和总权重按照一定比例在这三种类型的交易中进行分配,这一比例称为可用区块比。Kusama网络的设置为:

10^12weight=1s

1000weight=1ns

区块的总权重:2,000,000,000,000weight(2秒)

可用区块比:75%,即Normal交易最多只占用75%的区块资源,Operational类型的交易则可以占用100%的区块资源,新的交易如果导致对应资源使用率超过阈值后,会被拒绝。对于Mandatory类型的交易,即使在区块已经满了的情况下,依然可以把交易打包进区块内。

1、默认weight注释

Substrate中的所有可调度函数都必须指定权重。你可以使用注释的方式

#,这个规范允许你组合包括数据库读/写,权重的固定值以及基于banchmark的固定值。下面是一个基本的demo

ps:ExtrinsicBaseWeight会自动添加到声明的权重中,以考虑将空的外部数据简单地包含到块中的成本。

对数据库访问进行参数化

为了使权重注释独立于部署的数据库后端,它们被定义为一个常量,然后在表示可调度执行的数据库访问时在‘注释’中使用:

2、自定义weight

可以创建自定义重量计算类型,而不是使用上述默认重量注释。此类型必须实现以下特征:

WeighData:确定发货重量。

ClassifyDispatch:确定调度的类。

PaysFee:确定可调度的发件人是否支付费用。

最后,weightfee的公式:

动态调节费率

设置?FeeMultiplierUpdate参数即可

细节深入——Relay-chaintransactionfeesandper-blocktransactionlimits

TokenEconomics-ResearchatW3F

区块链上的交易需求通常非常不规则。一方面,在一天内的小时或一个月内的天数范围内存在活动高峰。另一方面,有长期趋势的交易量增长趋势。我们需要一种机制,在考虑这些因素的情况下,随着时间的推移自动更新交易费用。

根据供求规律,提高费用就可以减少需求,降低费用就可以促进需求。

为了应对活动高峰,我们面临着在快速提高交易费用或可能有很长的交易包含时间之间进行权衡——两者都是不良影响。我们提出了两种机制。第一种快速调节机制,可以非常迅速地调整价格,与活动的高峰和低谷同步。第二种慢速调整机制,是以长期趋势的速度进行缓慢调整,并使用小费为用户提供在高峰时段控制等待时间的可能性。parity官方建议使用带有tips的慢速调整机制。

关于动态调整机制的设置,也是在pallet_transaction_payment下进行配置。

小费

小费不是必须的的,具体数量是由交易发送者决定的,并且完全由区块生产着获得;

而交易费用的其他组成部分会根据一定的比例进行分配,国库80%,区块生产者20%。

题外话:最后的手续费去哪里了

至此关于交易手续费的内容,就全部介绍完毕,我们也进一步了理解了各个参数的含义,这个时候我们再回头看细化之后的公式,就能理解底层计算的计算逻辑了。

关于手续费最终计算的代码:https://github.com/paritytech/substrate/blob/polkadot-v0.9.18/frame/transaction-payment/src/lib.rs#L505-L537

关于Benchmark

SubstrateBenchmarkingDocumentation

benchmark主要是用于调整weight的内容,字节费用通过配置pallet_transaction_payment的runtime即可解决。

在Substrate中,10^12个weight单位=1秒,或1,000个weight单位=1纳秒。

为什么需要使用benchmark

拒绝服务(DoS)是分布式系统的常见攻击媒介。这种攻击的一个简单示例是用户重复执行涉及密集计算的外部函数。为了防止用户向网络发送垃圾信息,我们向用户收取发送cal的费用。调用成本应反映系统产生的计算和存储成本,调用越复杂,费用越高。但是,我们仍然希望鼓励用户使用我们的区块链系统,所以我们也希望这个估算成本相对准确,这样我们就不会向用户收取不必要的费用。

基准测试允许开发人员向最终用户收取适当的交易费用,以更准确地表示系统上的外部成本。设置合适的权重函数,准确反映底层计算和存储,也是Substrate中重要的安全保障。

简单的理解:weight可以手动设置,但是每台机器的性能可能不一致,可以使用benchmark做一个测试然后测算出指定机器下weight的大致范围。

确定机器配置

在进行benchmark之前,我们需要先确定机器的配置信息。

Benchmark的可用选项

进行Benchmark测试

在pallet下创建benchmarking.rs文件

编写完benchmark之后需要在生产机器下去进行benhmark测试。

关于benchmark的一些配置项:

你可以指定weight的模版生成定制之后的weight文件

模版文件

./.maintain/frame-weight-template.hbs内容:

根据模版文件生成指定的weight文件

测试完成之后,关于weights的值也就估算成功了,在pallet里引入weight即可

Otherlink

https://github.com/paritytech/subport/issues/149

中如何计算工龄在Substrate中如何计算交易权重姒煜的博客-CSDN博客

Gavin:关于Weight你必须了解的要点哔哩哔哩bilibili

TokenEconomics-ResearchatW3F

https://github.com/paritytech/substrate/pull/3157

Substrate入门-交易体-

play-substrate/lib.rsatmaster·kaichaosun/play-substrate

Substrate区块链应用的交易费用设计

波卡Substratepallet开发的权重计算与基准测试

在Substrate中如何计算交易权重

weightandfees

postdispatchweightcorrection

calculatefees

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

BNBNFT:深度解析NFT和ETH之间的相关性

简介 自从去年夏季的疯狂涨势后,NFT正面临有史以来的市场冷静期。我们在第一篇文章中调查了蓝筹股NFT的表现,这篇文章中将继续研究推动NFT市场价格变化的宏观趋势.

[0:15ms0-0:654ms