Gas 中譯是:瓦斯、汽油,代表一種可燃?xì)怏w。這形象地比喻以太坊的交易手續(xù)費(fèi)計(jì)算模式,不同于比特幣中直接支付比特幣作為轉(zhuǎn)賬手續(xù)費(fèi), 以太坊視為一個去中心化的計(jì)算網(wǎng)絡(luò),當(dāng)你發(fā)送Token、執(zhí)行合約、轉(zhuǎn)移以太幣或者在此區(qū)塊上干其他的時候,計(jì)算機(jī)在處理這筆交易時需要進(jìn)行計(jì)算消耗網(wǎng)絡(luò)資源,這樣你必須支付燃油費(fèi)購買燃料才能讓計(jì)算機(jī)為你工作。最終燃料費(fèi)作為手續(xù)費(fèi)支付給礦工。
與比特幣不同的是,無論交易成功與否,你都需要為此支付燃料費(fèi)。這是因?yàn)榧词菇灰资?,礦工依舊為此交易進(jìn)行校驗(yàn)和計(jì)算,消耗了資源。同時你也無法在錢包中直接設(shè)置支付多少燃料費(fèi),因?yàn)閷?shí)際燃料費(fèi)是礦工根據(jù)計(jì)算得出的,并記錄在包含此交易的區(qū)塊中。
當(dāng)你聽到別人談?wù)?gas 時,實(shí)際是在討論兩個概念:gasUsed 和 gasPrice,默認(rèn)情況下是指 gasUsed。你可以把 gasUsed 看成是汽車所需多少升燃油。把 gas price 看成是燃油單價(jià)。
對于汽車,每升汽油6.46元(price),10
升汽油就是64.6元。對于以太坊,每gas是20Gwei(price),21000 個 gas 就是 20*21000 Gwei=
420000 Gwei= 0.00042 Ether。也就是說本次交易手續(xù)為 0.00042 Ether。
Tip
Gwei是以太幣的一種計(jì)算單位,具體見文末附錄:以太幣單位。
Gas Used?
那么,以太坊這臺計(jì)算機(jī)在處理交易時是如何統(tǒng)計(jì)計(jì)算量的呢?以太坊有專門的虛擬機(jī)處理交易,虛擬機(jī)根據(jù)交易中確定的一個一個的操作指令進(jìn)行逐個處理,而每個操作指令都有明文規(guī)定的Gas消耗量。 比如執(zhí)行一次加法運(yùn)算將消耗 3Gas,這樣交易需要消耗多少Gas完全取決于執(zhí)行完交易中的所有操作指令的累計(jì)Gas,交易執(zhí)行完成時虛擬機(jī)將反饋總消耗Gas量,稱之為 gasused。而你所需支付的手續(xù)費(fèi)等于gasPrice * gasUsed。
以太坊操作指令對應(yīng)Gas
指令Gas UsedNotes
STOP0停止執(zhí)行
ADD3兩個數(shù)相加
MUL5兩個數(shù)相乘
SUB3兩個數(shù)相減
DIV5兩個數(shù)相除
更多細(xì)節(jié)請參見:Gas清單
Gas Limit?
因?yàn)槭掷m(xù)費(fèi)等于
gasPrice * gasUsed,用戶在轉(zhuǎn)賬,特別是執(zhí)行智能合約時 gasUsed 無法提前預(yù)知。
這樣存在一個風(fēng)險(xiǎn),當(dāng)用戶的交易涉及一個惡意的智能合約,該合約執(zhí)行將消耗無限的燃料,這樣會導(dǎo)致交易
方的余額全部消耗(惡意的智能合約有可能是程序Bug,如合約執(zhí)行陷入一個死循環(huán))。
為了避免合約中的錯誤引起不可預(yù)計(jì)的燃料消耗,用戶需要在發(fā)送交易時設(shè)定允許消耗的燃料上限,即 gasLimit。 這樣不管合約是否良好,最壞情況也只是消耗 gasLimit 量的燃料。
然而,一筆交易所必須支付的燃料已經(jīng)在區(qū)塊中通過該交易已執(zhí)行的計(jì)算量記錄。如果你不想支出太多燃料,而故意設(shè)置過底的 gas limit 是沒太多幫助的。你必須支付足夠燃料來支付本交易所必要的計(jì)算資源。如果交易尚未執(zhí)行完成,而燃料已用完,將出現(xiàn)一個Out of Gas的錯誤。特別注意的是,即使交易失敗,你也必須為已占用的計(jì)算資源所支付手續(xù)費(fèi)。比如,你通過合約給 TFBOYS 投票,設(shè)置 gasPrice=2 gwei,gasLimit=40000(實(shí)現(xiàn)投票需要40001的燃料開銷),最終你投票失敗且仍然需要支付 40000*2 gwei= 80000 gwei= 0.00008 ETH。
另外,如果最終 gasUsed 低于
gasLimit,即燃料未用完。則剩余燃料(gasLimit - gasUsed )將在交易后退還給你。比如你發(fā)送 1 Ether
到另一個賬戶B,設(shè)置 gas limit 為 400000,將有 400000 - 21000 返回給你。
Tip
21000 是標(biāo)準(zhǔn)轉(zhuǎn)賬交易的gasUsed。因此一筆標(biāo)準(zhǔn)的轉(zhuǎn)賬交易你可以設(shè)置 gasLimit 為21000。
Gas Price?
因?yàn)槟闼枰Ц兜娜剂腺M(fèi)為燃料單價(jià)(gasPrice) * 燃料開銷(gasUsed),如果你想讓交易花費(fèi)更少,你能夠做的是降低你愿意支付的燃料單價(jià)。 另一方面,降低燃料單價(jià)的壞處是交易可能需要等待很長時間才被打包到區(qū)塊中。
這是因?yàn)榻灰兹剂腺M(fèi)將歸屬于挖出本區(qū)塊的礦工。當(dāng)?shù)V工挖礦時,他需要決定哪些交易放入到區(qū)塊中,可以隨機(jī)選擇交易,也可以不包含任何交易。為了鼓勵讓礦工將你的交易放入?yún)^(qū)塊,你會考慮將燃料單價(jià)設(shè)置得足夠誘人,已確保能優(yōu)先放入?yún)^(qū)塊。
但這還是一廂情愿,因?yàn)檫@個最終取決于礦工。大部分礦工遵循一個簡單策略,優(yōu)先打包本地交易,將接受到的交易按燃油單價(jià)從高到底排列,依次放入?yún)^(qū)塊中直到塞滿區(qū)塊,或者直到低于礦工所設(shè)置的燃料單價(jià)底限。
如果你著急交易,高燃料單價(jià)會使得你的交易排在別人前面。如果不著急,你只需設(shè)置一個足夠讓礦工包含你交易的燃油單價(jià)即可。
一般情況下:
高燃料單價(jià)為50 GWEI 的交易幾乎總能放到下一個區(qū)塊。
高燃料單價(jià)為22 GWEI 的交易通常會把它放到未來的幾個區(qū)塊中。
高燃料單價(jià)為8 GWEI 的交易通常會在未來幾分鐘內(nèi)放入?yún)^(qū)塊。
下圖是最近1000個區(qū)塊中不同燃料價(jià)格對交易確認(rèn)時間的影響:
可以因?yàn)楫?dāng)前以太坊的交易處理性能(15筆/秒),當(dāng)出現(xiàn)交易高峰期擁堵時,你需要考慮調(diào)整燃料單價(jià),比如在Token創(chuàng)建后,搶購火熱,為了中簽?zāi)阈枰O(shè)置更高的燃料單價(jià),以能夠優(yōu)先搶購Token。
在設(shè)置燃料單價(jià)時,你還需要考慮加密貨幣的價(jià)格波動,相對人民幣隨時都漲跌20%。按人民幣考慮,之前的交易
10 gas price
相當(dāng)于0.3元,而現(xiàn)在可能已經(jīng)是0.4元。所以需要根據(jù)實(shí)際情況,盡量調(diào)低燃料單價(jià)。而當(dāng)網(wǎng)絡(luò)中大部分交易都是較低燃料單價(jià)時,礦工也會去調(diào)整他的底限。
那么問題來了,到底該設(shè)置多少燃料單價(jià)才合適呢?你可以到ethgasstation網(wǎng)站上查看。它將告訴你現(xiàn)在整個以太坊的情況,并給你建議的燃料單價(jià),下圖是當(dāng)前的燃料單價(jià)設(shè)置建議。
附錄?
以太幣的計(jì)算單位?
Kwei(Babbage) =103
Wei
Mwei(Lovelace) =106
Wei
Gwei(Shannon) =109
Wei
Microether(Szabo) =1012
Wei
Milliether(Finney) =1015
Wei
Ether =1018
Wei