原文標題:《波卡有哪些交易費用?》
撰文: Joe Petrowski
翻譯:PolkaWorld
區塊鏈網絡中的一些資源是有限的,例如,存儲和計算。交易費用可以防止個人用戶消耗過多的資源。Polkadot 使用基於重量(weight-based)的收費模型,而不是 gas 計量模型。因此,在交易執行之前要收取費用,一旦支付了費用,節點將執行交易。
Web3 基金會的研究團隊設計了 Polkadot 交易費用系統,基於以下原則:
- 每一箇中繼鏈塊都應進行有效的處理,以避免延遲塊生產。
- 中繼鏈的增長率應該是有限的。
- 每個區塊都應該爲特殊的、高優先級的交易留出空間,比如行爲不當的報告。
- 系統應該能夠處理需求高峯。
- 費用應緩慢變化,以便發送者能夠準確預測需要的交易費用。
費用計算
Polkadot 中繼鏈的費用根據三個參數計算:
- 按字節收費(也稱爲「長度費」)
- 重量費(weight)
- tip 小費(可選)
長度費是固定的每字節費用與交易大小(以字節爲單位)的乘積。(所以大家看到一些議案在鏈上沒有具體的解釋內容,只有一些很短的字符,就是爲了減少鏈上資源的使用和交易費用的成本。)
重量(weight)是一個固定的數字,用於管理驗證塊所需的時間。每個交易都有一個基本重量,用於說明所包含的開銷(例如簽名驗證)以及一個調度重量,用於說明執行交易的時間。總重量乘以每個重量的費用,就可以計算交易的重量費用。
小費是一種可選的交易費用,用戶可以添加該費用以提高交易的優先級。
這三項費用合起來就構成了交易費用。這個費用在交易執行前從發送方賬戶中扣除。一部分費用將歸區塊生產者所有,其餘部分將歸財政部所有。在波卡的創世中,這一比例分別設置爲 20% 和 80%。
區塊限制和交易優先級
Polkadot 中的塊同時具有最大長度(以字節爲單位)和最大重量。區塊生產者將用不超過這些限制的交易填充區塊。每個區塊的一部分(目前爲 25%)被保留用於與鏈運營相關的關鍵交易。區塊生產者只會用正常交易填滿區塊的 75%。鏈運營交易的一些示例:
- 不良行爲的報告
- 理事會的運作
- 對選舉中的成員的操作(如放棄候選人資格)
區塊生產者根據每筆交易的總費用確定交易的優先級。由於一部分費用將歸區塊生產者所有,因此區塊生產者會將費用最高的交易納入其中,以使其回報最大化。
費用調整
區塊鏈上的交易量非常不規則,因此交易費用需要一種機制來調整。從而用戶能夠預測交易費用。
Polkadot 使用了一種帶有小費的緩慢調整費用的機制來平衡這兩個考慮因素。除了塊限制,Polkadot 還具有塊滿度的目標。根據當前區塊相對於目標的完整性,下一區塊的費用增加或減少。每個重量的費用在 24 小時內最多可更改 30%。這個比率反映了需求的長期趨勢,但不是短期的峯值。爲了考慮短期內的暴漲,波卡在長度和重量費之外還使用了小費。用戶可以選擇在費用中添加小費,以使交易具有更高的優先級。
分片交易
在 Polkadot 的分片(平行鏈和平行線程)中發生的交易不會產生中繼鏈的交易費用。分片應用程序的用戶甚至不需要持有 DOT 代幣,因爲每個分片都有自己的經濟模型,可能有也可能沒有代幣。然而,在某些情況下,分片本身在中繼鏈上進行交易。
平行鏈在中繼鏈上有一個用於執行的專用插槽,因此它們的收集人不需要擁有 DOT 來同步塊。平行鏈本身會進行一些交易,例如,打開或關閉 XCMP 頻道,參與競標以續租其插槽,或升級其 runtime。平行鏈在中繼鏈上有自己的賬戶,需要使用這些資金代表平行鏈發行交易。
平行線程也將生成與平行鏈相同的交易。此外,收集人需要參與拍賣的每一個塊,以繼續他們的鏈。收集人需要有 DOT 來參與這些拍賣。
其他資源限制策略
交易重量在執行之前必須是可計算的,因此只能表示固定的邏輯。有些交易需要用其他策略限制資源。例如:
- 綁定:有些交易,如投票,可能需要綁定,在鏈上事件發生後將被退回或被 slash。在投票示例中,在選舉結束時返回,或者如果投票人試圖做任何惡意的事情,就會被 slash 懲罰。
- 押金:有些交易,如設置鏈上身份或聲明索引,會無限期地使用存儲空間。這需要一筆押金,如果用戶決定釋放存儲空間(例如,清除他們的 ide),則會退還押金。
- 銷燬:一項交易可能會根據其邏輯在內部銷燬。例如,如果一個交易創建了新的存儲條目,那麼它可能會銷燬掉髮送方的資金,從而增加了狀態大小。
- 限制:有些限制是協議的一部分。例如,提名者只能提名 16 個驗證人。這限制了 Phragmen 的複雜性。
拓展部分
這個部分只涉及來自普通用戶的交易。但是,如果你在區塊瀏覽器中查看區塊,你可能會看到一些與這些交易不同的 「 外部信息(extrinsics) 」。在 Polkadot (以及任何構建在 Substrate 上的鏈)中,外部信息是來自鏈外部的信息。外在信息分爲三類:
- 簽名的交易
- 未簽名交易
- 固定的(Inherents)
這裏僅介紹簽名交易,這是大多數用戶與 Polkadot 交互的方式。簽名交易來自一個有資金的賬戶,因此波卡可以收取交易費,以防止垃圾郵件。
未簽名交易用於特殊情況,即用戶需要提交來自不控制資金的密鑰對的外部消息。例如,當用戶在創世之後領取他們的 DOT 代幣時,他們的 DOT 地址還沒有資金,所以使用一個未簽名的交易。驗證人還以 「心跳(heartbeat)」 消息的形式提交未簽名的交易,以指示它們處於在線狀態。這些心跳必須由驗證人的 session keys 之一簽名。session keys 從不控制資金。未簽名的交易只在特殊情況下使用,因爲 Polkadot 不能對它們收費,因此每個交易都需要自己的自定義驗證邏輯。
最後,固定的消息(inherents)是未簽名或未包含在交易隊列中的信息。因此,只有塊生產者才能向塊添加固定消息。固定消息被假定爲「真的」,僅僅是因爲足夠多的驗證人已經同意它們是合理的。例如,Polkadot 塊包含固定的時間戳。沒有一種方法可以證明時間戳是真的,就像用簽名證明發送資金的願望一樣。相反,驗證人根據找到時間戳的合理性來接受或拒絕塊。在 Polkadot 中,它必須在自己的系統時鐘可接受的範圍內。
瞭解更多
Web3 Foundation Research:
https://research.web3.foundation/en/latest/polkadot/Token%20Economics.html#relay-chain-transaction-fees-and-per-block-transaction-limitsSubstrate Weights:
https://substrate.dev/docs/en/knowledgebase/learn-substrate/weightSubstrate Fees:
https://substrate.dev/docs/en/knowledgebase/runtime/feesExtrinsics:
https://substrate.dev/docs/en/knowledgebase/learn-substrate/extrinsics