區塊鍊網絡中的一些資源是有限的,例如,存儲和計算。交易費用可以防止個人用戶消耗過多的資源。 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 中,它必須在自己的系統時鐘可接受的範圍內。