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;
Gavin Wood:未來一周左右將上線Kusama首條平行鏈Shell:波卡創始人兼 Web3 基金會主席 Gavin Wood 在Web 3.0訓練營二期開幕儀式上表示:過去幾個星期,我們在 Rococo 進行了拍賣測試,也在 Rococo 上上線了測試平行鏈。驗證者數量增加到 900 個,達到了 Kusama 的水平,這也增強了我們的信心,我們相信即它很快就可以正式上線了。此外他還透露,Kusama上的第一條平行鏈將被命名為Shell。“我計劃在接下來一周左右的時間里,驗證者完成更新后,我們給驗證者充裕的時間推進 0.9 版本,進行運行環境升級,做最后的檢查,在 Kusama 上上線第一條平行鏈,這第一條平行鏈將命名為'Shell'。”[2021/5/14 22:03:23]
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處進行配置即可。
波卡周報:Rococo重啟成功,目前接入9個平行鏈:根據PolkaWorld最新發布的波卡周報,本周重要事件包括:
1. Parity計劃開發并提議一個名為Statemint的通用資產平行鏈,作為首批公共利益平行鏈之一;
2. 關于SubstraTEE Milestone 3的國庫申請已通過;
3. 一項開發EVM NFT橋的國庫議案已經通過;
4. Figment發起一項國庫議案,申請DOTs作為他們的Figment Learn和DataHub平臺發展的激勵,以發展Polkadot開發者。目前波卡理事會正在審查這個議案;
5. 取消10號提案(一個force_transfer的提案)的議案已獲得波卡理事會的通過。該提案的地址有誤,已由提案11取代;
6. 目前提名成功最小的DOT數增加到了175個,Staking率增加到了64%;
7. Rococo已經重啟,目前已經連接9個平行鏈:Tick,Trick,Track,Phala,Acala,Bifrost,Crust,Plasm和Hydrate。網絡仍然處于正在穩定和優化中。[2021/3/14 18:43:42]
關于ExtrinsicBaseWeight的配置
通過runtime下frame_system::Config的BlockWeights的base_extrinsic進行配置。
關于WeightToFee:
WeightToFee可以理解為一單位Weight與一單位Balance之間的映射轉換。
Code實現
在代碼實現那塊主要是對一個pubstructLinearWeightToFee(sp_std::marker::PhantomData);添加WeightToFeePolynomial宏。
只需要實現這個宏里的polynomial()方法即可
polynomial()其實是在定義weight轉換為balance的多項式。
關于WeightToFeeCoefficient的配置細節
波卡:計劃下周進行鏈重啟 Rococo已連接11個平行鏈:3月6日,波卡官推發布Rococo發展回顧。主要內容包括:1.計劃在下周初進行一次鏈重啟,包括新的網絡優化;鏈重啟后,每天將添加20個驗證器,以總共200個驗證器為目標測試網絡穩定性。2.已連接11個平行鏈,分別是Tick、Trick、Track、Plasm Network、AcalaNetwork、Kiltprotocol、PhalaNetwork、polkaBTC、Darwinia Network、Crust Network和hydra DX。3.平行鏈團隊之間的XCMP測試正在與社區一起進行,這極大地有助于解決問題和討論XCMP Lite的要求。V0 XCMP Fee的實現處于實施的早期階段。[2021/3/6 18:20:10]
這個返回的是一個多項式公式
其中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的
金色相對論 | Bifrost產品經理Tyrone:波卡在平行鏈上線之前還有一個挑戰來源于以太坊開發進度:金色財經報道,12月11日消息,在今日舉行的金色相對論中,針對“波卡生態眾望所歸,未來的期許很高,那各位認為在波卡以及各個平行鏈還會面臨哪些挑戰?”等問題,Bifrost(彩虹橋)產品經理Tyrone表示,波卡在平行鏈上線之前還有一個挑戰來源于以太坊開發進度。 Vitalik于11月18日就表示以太坊2.0的原路線圖將發生變化,總體將數據分片作為Rollup基礎首要實現目標,基本鎖定在ZK Rollup和Optimistic Rollup之間,雖然在技術實現上還有許多難題,但新路線圖的公布說明了以太坊2.0要加快在擴容實現上的腳步。如若以太坊2.0早于波卡實現擴容方案,更多項目將涌入以太坊,同時現在受低吞吐量影響而蠢蠢欲動的項目將繼續扎根以太坊,DeFi將在以太坊2.0迎來一波新的進化,波卡生態的開啟或將面臨不小的挑戰。對平行鏈項目方來說,波卡才短短上線幾個月的時間,就涌入了300多個項目。平行鏈卡槽的競爭預計會非常激烈,只有接入波卡平行鏈的項目才能享有其無分叉升級,異構跨鏈,共享安全的特性。[2020/12/11 14:56:00]
TransactionByteFee做定制。
TransactionByteFee?=>?指定每個字節值多少Balance。
其次就是交易體的大小,但是要了解交易體的大小,首先需要了解交易體的內容構造。
關于交易體的構造:
Substrate入門-交易體-
???在Substrate中的交易不再稱為Transaction,而是稱為了Extrinsic,中文翻譯就是“外部的;外表的;外源性”,意味著被稱為Extrinsic的概念,對于區塊鏈而言是外部的輸入。這種定義脫離了本身“交易”的范疇,而是在鏈的狀態的角度下,認為交易及類似概念是一種改變狀態的外部輸入。
一個“外部輸入”至少會具備以下兩個條件:
發送者的證明
外部輸入的行為
其中第一點是顯然的,只要基于公私鑰體系,就一定需要發送者對這個發送的內容進行簽名,在鏈上通過這個簽名驗證合法性,解析出發送者的公鑰識別身份。等價于互聯網中客戶端持有的token這類的。而第二點就是這個“輸入”是到鏈上干嘛的,其相當于是用戶發送到鏈上的指令行為。
Bithumb將推出DeFi平臺Clover作為波卡平行鏈:韓國加密交易所宣布Bithumb即將推出DeFi平臺Clover,該平臺將鏈接波卡網絡,作為波卡平行鏈,由DOT技術提供支持。(Cointelegraph)[2020/10/13]
關于鏈下如何構造這個signature,
插曲:鏈下一個交易體的構成:
交易bytes內容的構造:
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
加密貨幣交易所作為投資者主要的入金和交易的渠道,其重要性不言而喻。只有給用戶提供最優質的體驗和最安全的服務,才能獲得用戶的信任和選擇.
1900/1/1 0:00:00分析師YassineElmandjra稱,由于不利的宏觀環境,比特幣等風險資產可能會繼續遭受損失.
1900/1/1 0:00:00親愛的CoinW用戶: 幣贏CoinW將于2022/7/619:00在創新區上線SienaDAOFanToken,開通SACN/USDT交易對.
1900/1/1 0:00:00據最新消息,波場去中心化超抵押穩定幣USDD正式登陸BitKan交易所。BitKan是一站式數字資產投資平臺,成立于2012年,為全球約170個國家超過500萬用戶提供數字資產服務.
1900/1/1 0:00:00DearValuedUsers,CandyDropislaunchingVISIONonJuly3.
1900/1/1 0:00:00DearValuedUsers,HuobiGlobalwillbeopeningMBX(Marblex)spottrading(MBX/USDT)andspotGridtrading(MBX/U.
1900/1/1 0:00:00