簡介
與許多區(qū)塊鏈的傳統(tǒng)情況一樣亡脸,Gas是一個度量單位,用來衡量為了執(zhí)行上鏈消息操作消耗了多少存儲和/或計算資源,它的工作原理如下:為了消息被執(zhí)行并包含在一個塊中(即為了消息能成功上鏈),消息發(fā)送方會指定他們愿意支付的最大金額浅碾,這是根據(jù)所有的GAS單位數(shù)(GasLimit
)(它通常預(yù)期高于實際的使用GAS的單位(GasUsed
))和每單位GAS的費用(GasFeeCap
)規(guī)定的大州。
傳統(tǒng)上,GasUsed * GasFeeCap
作為獎勵給區(qū)塊生產(chǎn)礦工,該計算公式的結(jié)果被視為消息包含的優(yōu)先費垂谢,也就是說厦画,消息按遞減順序排序,且GasUsed * GasFeeCap
最高的消息優(yōu)先滥朱,因為它們給礦工帶來了更多的利潤根暑。
然而,由于一些原因徙邻,這種支付GAS的策略(GasUsed * GasFeeCap
)對區(qū)塊開采礦工來說是有問題的排嫌。首先,一個區(qū)塊生成礦機(jī)可能免費上鏈一條高成本的消息(就所需的鏈資源而言)鹃栽,在這種情況下躏率,鏈本身需要承擔(dān)成本。其次民鼓,消息發(fā)送方可以為低成本的消息設(shè)置任意高的價格(同樣,就鏈資源而言)蓬抄,從而導(dǎo)致DoS漏洞丰嘉。
為了應(yīng)對這種情況,F(xiàn)ilecoin區(qū)塊鏈定義了一個每條消息都需要燃燒的基準(zhǔn)費用(BaseFee
)嚷缭。他們給出的理由是:GAS是鏈上資源消耗的一種衡量標(biāo)準(zhǔn)饮亏,燃燒掉比獎勵給礦工更有意義。這樣就避免了礦商的收費操縱阅爽。BaseFee
是動態(tài)的路幸,根據(jù)網(wǎng)絡(luò)擁塞情況自動調(diào)整。這使網(wǎng)絡(luò)應(yīng)對spam攻擊時更具有彈性付翁。在SPAM攻擊期間简肴,網(wǎng)絡(luò)負(fù)載會增加,由于基準(zhǔn)費用的增加百侧,攻擊者不可能長期保持整個塊都是SPAM信息砰识。
最后,GasPremium
是發(fā)送方支付的優(yōu)先費用佣渴,以激勵礦工挑選最有利可圖的信息辫狼。換句話說,如果消息發(fā)送者希望更快的上鏈其消息辛润,他們可以設(shè)置更高的GasPremium
膨处。
參數(shù)
-
GasUsed
是為了執(zhí)行消息而消耗的資源數(shù)量(或GAS單位)的度量。每個單位的GAS是用attoFIL來測量的,因此真椿,GasUsed是一個代表能量消耗單位的數(shù)字鹃答。GasUsed
與消息是否正確執(zhí)行或失敗無關(guān)。 -
BaseFee
是每條消息執(zhí)行時燃燒的每單位GAS的設(shè)定價格(以attoFIL/gas單位衡量)(發(fā)送到一個不可恢復(fù)的地址)瀑粥。BaseFee
的值是動態(tài)的挣跋,根據(jù)當(dāng)前的網(wǎng)絡(luò)擁塞參數(shù)進(jìn)行調(diào)整。例如狞换,當(dāng)網(wǎng)絡(luò)中 GAS 限用量超過5B時避咆,BaseFee
增加,當(dāng)GAS限用量低于5B時修噪,BaseFee
會減少查库。
應(yīng)用于每個塊的BaseFee
都應(yīng)該包含在塊本身中。鏈的頭部必須要包含當(dāng)前BaseFee的值黄琼。BaseFee
適用于每個GasUsed
的單位樊销,因此,一條消息燃燒的GAS總量為BaseFee * GasUsed
脏款。注意围苫,每個消息都會觸發(fā)BaseFee
,但是它的值對于同一塊中的所有消息都是相同的撤师。 -
GasLimit
以GAS為單位的度量剂府,并由消息發(fā)送方設(shè)置。它對一條消息在執(zhí)行上鏈操作時應(yīng)該被允許消耗的gas的數(shù)量(即gas的單位數(shù))施加了嚴(yán)格的限制剃盾。消息對于它所觸發(fā)的每個基本操作都會消耗gas腺占,而耗盡gas的消息將失敗。當(dāng)一條消息失敗時痒谴,由于該消息的執(zhí)行而發(fā)生的對狀態(tài)的每一次修改都將恢復(fù)到它之前的狀態(tài)衰伯。不管消息執(zhí)行是否成功,礦機(jī)都將獲得執(zhí)行消息所消耗資源的獎勵(參見下面的GasPremium
)积蔚。 -
GasFeeCap
是信息發(fā)送方愿意支付的每單位GAS的最高價格(以attoFIL/gas單位衡量)意鲸。與GasLimit
一起,GasFeeCap
設(shè)置了發(fā)送方為消息支付的FIL的最大金額:發(fā)送方保證消息的成本不會超過GasLimit * GasFeeCap
attoFIL(不包括消息為接收方支付的任何費用)库倘。 -
GasPremium
是消息發(fā)送方為了消息上鏈愿意支付的“小費”(在基準(zhǔn)費之上)的每單位GAS的價格(以attoFIL/gas衡量)临扮。一條消息通常可以被賺取的利潤是GasLimit * GasPremium
attoFIL教翩,通常GasPremium = GasFeeCap - BaseFee
杆勇。請注意,GasPremium
應(yīng)用于GasLimit
饱亿,而不是GasUsed
蚜退,以便讓礦工的消息選擇更簡單闰靴。
注意
-
GasFeeCap
應(yīng)該始終高于網(wǎng)絡(luò)的BaseFee
,如果消息的GasFeeCap
低于BaseFee
,則其余部分將來自礦工作為懲罰钻注。這個懲罰適用于礦工蚂且,因為他們選擇了一條支付低于網(wǎng)絡(luò)BaseFee
(即不能支付網(wǎng)絡(luò)成本)的消息。然而幅恋,如果同一個發(fā)送方在消息池中有另一條消息杏死,其GasFeeCap
遠(yuǎn)大于BaseFee
,則礦工可能會選擇其GasFeeCap
小于BaseFee
的消息(同時也會選擇另一條GasFeeCap
遠(yuǎn)大于BaseFee
的消息)捆交。因為如果存在多個消息淑翼,則礦機(jī)應(yīng)該從消息池中挑選發(fā)送方的所有消息。原因是品追,第二條消息增加的費用將彌補(bǔ)第一條消息損失玄括。 - 如果
BaseFee + GasPremium > GasFeeCap
,那么礦工可能不會獲得整個GasLimit * GasPremium
作為他們的獎勵肉瓦。 - 一條消息的花費被嚴(yán)格限制在
GasFeeCap * GasLimit
之內(nèi)遭京。從這筆金額中,首先支付(燒掉)BaseFee
泞莉。之后哪雕,最高GasLimit * GasPremium
將給予礦工作為獎勵。 - 一條消息會在GAS耗盡時失敗鲫趁,退出代碼為“out of gas”热监。
GasUsed * BaseFee
將仍然燃燒(在這種情況下GasUsed = GasLimit
),礦工將仍然獎勵GasLimit * GasPremium
饮寞,前提是GasFeeCap > BaseFee + GasPremium
。 -
GasFeeCap
的值太低列吼,很可能會導(dǎo)致消息被困在消息池中幽崩,因為從利潤的角度來說它不太有吸引力,任何礦工都不愿意打包上鏈這條消息寞钥。當(dāng)這種情況發(fā)生時慌申,需要更新GasFeeCap
,從而使消息對礦工更具吸引力理郑。消息的發(fā)送方可以推送一個新的消息到消息池(默認(rèn)情況下,將傳播到其他礦工的消息池)蹄溉,這條新消息與舊信息的標(biāo)識符必須是相同的(例如,相同的Nonce),然后更新這條新消息的GasPremium
,至少增加至少25%您炉。
翻譯自https://spec.filecoin.io/#section-systems.filecoin_vm.gas_fee