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;
Tether回应《华尔街日报》:从未披露过任何股权是由于得到重要利益相关者的支持:8月30日消息,USDT 发行方 Tether 发文回应《华尔街日报》的质疑,称其试图诋毁 Tether 在与公众进行透明和诚实的沟通方面所做的工作。文中强调 Tether 所持有的 3 个月的国库券是安全资产,Tether 的业务能够产生利润,从未披露过任何股权是由于得到重要利益相关者的支持,并已被 NYAG 接受。
此外,Tether 还表示攻击 Tether 的储备资产是因为有利于市面上的其他稳定币,Tether 的披露是市场上最诚实和最透明的。任何提及 Tether 的商业模式中存在的失败边际,都是基于《华尔街日报》假定的卖空者叙述。Tether 在最近几个月轻松赎回超过 160 亿美元的已发行代币,使资产配置与前几个月基本保持一致,同时显着减少其对商业票据的敞口。?
据悉,《华尔街日报》此前发表文章称,目前 Tether 拥有价值 677.4 亿美元的资产和价值 675.4 亿美元的负债,两者仅相差 1.91 亿美元。这样的情况或将导致,即使其储备资产价值下降 0.3% 也可能“使 Tether 在技术上无力偿债”。[2022/8/30 12:58:25]
final_fee=inclusion_feetip;
细化之后的公式->
在这个公式中,targeted_fee_adjustment是一个乘数,可以根据网络的拥塞情况调整最终费用。
base_fee其实就是ExtrinsicBaseWeight的大小转换为Balance的值
length_fee是交易体存储的费用。
weight_fee通过两个参数计算:
??a.在ExtrinsicBaseWeight运行时声明并适用于所有外部变量的。
??b.#解释外部复杂性的注释。
要将权重转换为货币,运行时必须定义一个WeightToFee实现转换函数的结构体Convert.
请注意,在调用外部发件人之前,会向外部发件人收取包含费用。即使交易在执行时失败,费用也会从发件人的余额中扣除。
《华盛顿邮报》:美参议员提案允许加密公司访问美联储支付渠道:金色财经报道,据《华盛顿邮报》消息,最近有人发现美国共和党参议员 Cynthia M. Lummis 和民主党参议员 Kirsten Gillibrand 此前共同提出《负责任金融创新法案》(Responsible Financial Innovation Act)中有一条鲜为人知的条款,允许加密公司在美联储获得账户,这些账户持有人可以访问美联储的支付系统,允许他们在不涉及与独立银行接触的情况下为客户结算交易。
据一些金融监管机构和专家表示,该措施的影响将波及整个行业及其他领域。此前,美联储一直不愿将主账户授予以加密货币为重点的银行,过去两年,Custodia Bank 和 Kraken Financial 两家公司都未能获得美联储的主账户,而这两家公司均获得了 Cynthia M. Lummis 的支持。[2022/7/4 1:48:56]
基础费用
是用户为交易支付的最低费用。它在Runtime被声明为baseweight,其实就是ExtrinsicBaseWeight的大小转换为Balance的值。所以需要设计Weight转换为Balance的公式--?WeightToFee,WeightToFee在pallet-transaction-payment处进行配置即可。
关于ExtrinsicBaseWeight的配置
通过runtime下frame_system::Config的BlockWeights的base_extrinsic进行配置。
关于WeightToFee:
WeightToFee可以理解为一单位Weight与一单位Balance之间的映射转换。
Code实现
在代码实现那块主要是对一个pubstructLinearWeightToFee(sp_std::marker::PhantomData);添加WeightToFeePolynomial宏。
只需要实现这个宏里的polynomial()方法即可
NYDIG在《华尔街日报》投放整版比特币广告:金色财经报道,据The Block新闻总监推特消息,6月30日,纽约数字投资集团(NYDIG)在《华尔街日报》纸质版投放了整版比特币广告,广告标语为“人民的比特币”。[2021/7/1 0:18:24]
polynomial()其实是在定义weight转换为balance的多项式。
关于WeightToFeeCoefficient的配置细节
这个返回的是一个多项式公式
其中negative值是控制整体多项式是加上该多项式还是减去该多项式
negative的对应关系:
true→-
flase→
多项式的公式如下
例如:
如果我们想实现一个1:1的WeightToFee的转换,那这里的配置应该是:
对应的多项式为:
小总结:
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。
掌柜调查署 | Bondly CEO Brandon:Bondly将在Polkadot使用自己的平行链,提供一个类似于支付宝的金融系统:在今日举行的《掌柜调查署 | Bondly重新定义“价值”与“交易”》直播中,Bondly CEO Brandon表示,Bondly是一个可信任的、可移植的、透明的交换协议,旨在帮助更多人进入去中心化金融市场,Bondly推出的一系列可信DeFi产品能够成为用户日常交易活动的一部分,确保人们可以安心处理每次兑换代币或在线购物交易。我们将在Polkadot使用我们自己的平行链,提供一个类似于支付宝的金融系统,专注于购买和销售数字商品,如NFT,域名等。
电子商务行业市场价值高达3.5万亿美元,但却被一些大公司垄断。通过引入专注于解决当前交易摩擦的DeFi产品,Bondly希望彻底改变现状,并成为推动行业发展的先驱。[2021/1/5 16:30:24]
其次就是交易体的大小,但是要了解交易体的大小,首先需要了解交易体的内容构造。
关于交易体的构造:
Substrate入门-交易体-
???在Substrate中的交易不再称为Transaction,而是称为了Extrinsic,中文翻译就是“外部的;外表的;外源性”,意味着被称为Extrinsic的概念,对于区块链而言是外部的输入。这种定义脱离了本身“交易”的范畴,而是在链的状态的角度下,认为交易及类似概念是一种改变状态的外部输入。
一个“外部输入”至少会具备以下两个条件:
发送者的证明
外部输入的行为
其中第一点是显然的,只要基于公私钥体系,就一定需要发送者对这个发送的内容进行签名,在链上通过这个签名验证合法性,解析出发送者的公钥识别身份。等价于互联网中客户端持有的token这类的。而第二点就是这个“输入”是到链上干嘛的,其相当于是用户发送到链上的指令行为。
关于链下如何构造这个signature,
插曲:链下一个交易体的构成:
交易bytes内容的构造:
Zenlink将在平行链卡槽拍卖到来时上线1.0测试版本:在10月17日由Polkaworld主办的“波卡中国行”深圳站上,Zenlink中国负责人郭涛表示,随着波卡平行链卡槽拍卖的临近,质押KSM或者DOT引起的流动性问题势必会很突出,Zenlink将根据波卡官方平行链的进度推出可供社区参与的1.0测试版本,计划优先和波卡DeFi平台Acala以及Staking流动性解决商Bifrost、Stafi合作,让用户可以在Zenlink上完成相关DEX交易,享受卡槽拍卖带来的Staking收益的同时,也能获得相应KSM或DOT的流动性。[2020/10/17]
pallet-funcindex发起人的Accountsignature(signed,signature,extra)call
pallet-funcindex是通过palletname和functionname在metadata里查询得到到index
交易执行之后可以在此处
explorer下观察到signature的信息:
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
标签:SUBSRANLLEOBISubscriptionsBRANApolkawallet下载3X Long Huobi Token Token
SOL价格从历史最高点下跌了87%,但改善基本面是否强化了其投资论点?加密货币行业陷入深度回调,最近的报告显示,大多数山寨币比2021年的高点下跌了70%以上.
DearValuedUsers,HuobiGlobalwillbeopeningMBX(Marblex)spottrading(MBX/USDT)andspotGridtrading(MBX/U.
金色财经报道,据《华盛顿邮报》消息,最近有人发现美国共和党参议员CynthiaM.Lummis和民主党参议员KirstenGillibrand此前共同提出《负责任金融创新法案》(Responsi.
据官方消息,为了保护整个区块链行业和加密市场,7月2日,波场联合储备已向CeFi交易所存入了500万枚USDC,以回购USDD和TRX.
原文作者:MagnetyIntern原文编译:TechFlowIntern如您所知,如果没有Starknet上强大的DeFi生态系统,Magnety就无法发挥作用.
7月1日消息,作为加密货币金融机构BlockFi与美国多州和解协议的一部分,俄勒冈州金融监管部将从BlockFi获得近100万美元赔偿.