以太坊是目前第二大公鏈,它和比特幣不一樣,以太坊上的可以實現(xiàn)的功能更多,如果比特幣是一個可以進行加減乘除的計算器,那么以太坊就是一臺功能完備的計算機。以太坊系統(tǒng)的復(fù)雜度超過比特幣好幾個數(shù)量級。
在以太坊中,用戶可以自己寫一個智能合約,然后把智能合約放到以太坊中執(zhí)行。智能合約的執(zhí)行需要消耗資源,而以太坊上的資源是有限的。
在計算機系統(tǒng)中,停機問題(https://zh.wikipedia.org/wiki/停機問題)目前還沒有辦法完全證明。這個問題簡單來說就是沒辦法判斷一個程序是否能夠在有限的時間內(nèi)結(jié)束運行。
如果一個用戶提交了一個死循環(huán)程序到以太坊中,那么就會無限的執(zhí)行下去,從而將以太坊網(wǎng)絡(luò)擊垮。而使用 gas 機制則可以解決這個問題,智能合約中,每段代碼的執(zhí)行都會消耗一定量的 gas,在用戶提交交易的時候需要指定好。如果 gas 消耗完了,那么智能合約就必須停止,交易也會被撤銷,如果智能合約執(zhí)行完成, gas 還有剩余,就會退還給用戶。
需要特別說明的是,即使交易失敗,用戶也需要支付 gas 費用,因為以太坊為這些錯誤的交易也付出了計算資源。
除了這點之外,gas 還可以用來激勵礦工,用戶提交交易所消耗的 gas 費用最后都會給到礦工,礦工會優(yōu)先去打包那些提供了更高 gas 價格的交易,在以太坊中,如果希望自己的交易早點被打包,可以設(shè)置更高的 gas 價格。
g as 機制是以太坊系統(tǒng)的命脈。
gas 本質(zhì)就是維護以太坊網(wǎng)絡(luò)安全,這是從兩個方面來做到的,一方面通過 gas 來衡量計算量,一方面使用 gas 來吸引更多的礦工,礦工的數(shù)量越多,以太坊網(wǎng)絡(luò)就越安全。
gas 只能用于交易中,用戶不會接觸到 gas,gas 會在交易的提交的時候直接通過以太幣來兌換。
智能合約中,每個操作都會消耗一定的 gas 。每個操作都對應(yīng)一個 Opcode,下面是一些常見的 gas 消耗,完整的 gas 消耗說明看這里:https://github.com/crytic/evm-opcodes
以太坊中的交易最后會被確認,打包成區(qū)塊,這樣交易才算是完成,但是在一個區(qū)塊中,可以打包的交易是有限的,以太坊通過 gas 來限制可以打包的交易數(shù)。這樣就讓被打包的機會成為了一個稀缺的資源。
用戶提交一個交易后,gas 量可以看做是一個固定的值,礦工為了做到最大收益,就會選擇那些 gas 價格更高的交易。
很多以太坊的用戶經(jīng)常吐槽 gas 費過高,其實這里的過高不是指 gas 本身過高,而是指 gas 對應(yīng)的以太坊價格過高。
因為 Gas 的價格不是固定的,而是波動的,簡單來說就是根據(jù)供需關(guān)系來決定的,如果同時需要用以太坊的用戶多,那么Gas 的價格就貴,如果用戶的人少,那么 Gas 的費用就會少。
以太幣的最基本單位是 wei,1 ETH = 10 ^18 wei,而衡量 gas 價格的單位則是 gwei,1 ETH = 10 ^ 9 gwei。
在提交交易的時候,需要設(shè)定兩個參數(shù),一個是 gas 的最大消耗量(gas limited)和 gas 的價格,gas 的消耗量通常情況下會比較固定,不會有太大的變化,主要是 gas 的價格會波動很大。
在上面我們說到礦工會挑選那些 gas 費用比較高的交易進行打包。所以 gas 的價格設(shè)置得越高,那么總的 gas 費用就會越高。如果想讓當(dāng)前的交易盡快被確認,那么就需要設(shè)置一個當(dāng)前相對來說比較高的 gas 價格。
其實對當(dāng)前 gas 價格最清楚的就是那些礦工,所以礦工們也提供了一些服務(wù),讓用戶可以實時地了解到當(dāng)前 gas 價格的分布。比如 GasNow 就是一個比較常用的服務(wù),現(xiàn)在很多錢包中都在使用這個來為錢包的用戶提供 gas 價格建議。
如果你提交的交易不緊急,那么使用當(dāng)前的平均 gas 價格就可以,如果需要提交緊急的交易,那么就需要設(shè)置更高的 gas 價格。
文 / Rayjun