一文講清楚以太坊的 gas,gasPrice,gasLimit

_ 版權聲明_


本文作者:苑風   
 請注意:轉載請聯繫作者獲得授權;  
轉載時請保留以上版權聲明…

“`

—————————————–
在開發 DApp 應用或者使用以太坊轉賬的時候,經常會接觸到 gas, gas price, gas limit 幾個詞彙。很多人被他們繞暈了。本文希望能對這個問題提供一些解讀,解決大家普遍的疑惑。

GAS 機制的意義

歐神說過,凡事都要看到 T-1 層的運行規則。我們對於 gas,要先理解背後的設計哲學。追蹤溯源,我們不得不先從比特幣說起。

比特幣是一個大的賬本,礦工打包區塊,給予 BTC 激勵。但受限於網絡的速度,區塊的大小是受限的,爲 1M。在這麼大的區塊鏈裏,能容納的交易顯然是有限的。那麼如果交易很多,怎麼辦?這有限資源配置的經濟學問題。兼顧公平,還是效率?

比特幣給出的解決方案是這樣的,每筆需要收取一定的手續費,誰給的多,誰就更加有機會被打包。完全是利益驅動礦工,非常符合人性。因爲區塊鏈的去中心特質,決定了需要用直接的經濟效益驅動參與者

區塊鏈發展到以太坊這裏時,我們同樣面臨類似的問題,如何設定區塊的大小,如何收取手續費?能直接照搬比特幣的機制嗎?

難!以太坊本質是一個超級計算機,交易不僅僅是一個簡答的記賬,背後有很多合約執行操作。你想想,部署一個複雜的合約要比執行一個簡單的以太坊轉賬要複雜很多,所佔用的資源要多很多。這兩筆交易,顯然是不對等的。那該怎麼收費呢?這個地方我們就需要兼顧公平與效率。不能太隨意,最好有量化的計算機制。

這個時候,GAS 機制的自然引入進來。通過 gas 去量化交易的複雜度,保證公平性。通過設定 gasPrice (基本單位爲 wei,以太坊的最小單位)來保證效率,保證資源調配的高效。這樣, gas x gasPrice 就是最終的手續費。這樣整個邏輯就很自然。平時不堵,大家意思意思,一旦堵了,就得提高 gasPrice, 保證交易能給很快被打包。當然,要是不着急,慢慢等也可以。

新的問題來了,gas 是如何量化的呢?

說破了其實很簡單。合約編譯成字節碼在 EVM 中執行,字節碼程序跟我們計算機的彙編程序差不多。就是把上面的代碼翻譯成底層的各種操作,比如加減乘除,數據存儲,條件語句這些。這樣我們可以把所有的操作符都統計出來,每種運算設定一個 gas 費用。整個執行過程所有字節碼加起來,就是本次交易的 gas 總費用。大家有興趣可以去查一下以太坊這一塊的資料,他有一個詳細的表去列出操作對應的 gas 費。

以太坊在解決交易的收費問題之後,我們還剩下交易區塊的大小問題。既然用 gas 費用去量化交易的費用,我們很自然地想到可以限定區塊的總的 gas,去限定一個完整的區塊。這個總 gas 就是區塊的 gasLimit。

好,到此爲止,應該差不都講清楚起基本的運作機制,我們在來看看下面幾個問題。

gas 和 gasLimit 區分

接上章,我們明白整個 gas 的設計哲學和工作機制之後,我們在實際開發或者使用以太坊的過程經常會遇到 gas, gasLimit 這兩個詞,他們有着不同的含義,經常容易被混淆,我們更加不同的場景來講述一下。

交易時:

我們隨便看一筆以太坊的交易:

一文講清楚以太坊的 gas,gasPrice,gasLimit

看標紅的地方,有 Gas Limit, Gas Used By Txn。 兩個值還不一樣,是不是很暈?且聽我慢慢道來。

Gas Limit: 就是我們在交易過程中,指定的!其實這個數值一般錢包自動把我們計算完。標準的以太坊轉賬是 21000。在 web3 接口通過制定 Gas 的值來指定 Gas Limit。

Gas Used By Txt: 是指這一筆交易執行完成之後,實際消耗的 Gas 值。最終的交易費用是根據它計算來的。

那爲什麼者兩個值會不一樣呢?

應該有些複雜的操作,我們提前是不能精確地知道它的 gas 消耗的。簡單來說,如果有 if 操作,你要進入那一塊代碼,是受限於外部輸入的。所以,Gas Limit 只能是比 Gas Used By Txt 多。

它通過可以有 web3.js 提供的 estimateGas 接口預估出來。當然,這些對於一般用戶來說,錢包都幫我們做得很好了,不用關心。

區塊打包:

看一個典型的區塊數據:

一文講清楚以太坊的 gas,gasPrice,gasLimit

同樣也存在 Gas Limit 和 Gas Used 的區別。

此處的 Gas Limit 就是一個區塊能容納的所有交易的 Gas 總和。礦工在打包交易的時候,只要他不傻,會優先把 gasPrice 高的交易搞進來,然後依次組裝成一個區塊。最終這些交易消耗的 gas 總和就是 Gas Used。

是的,對於一般用戶來說,不必要關心這個值。但是,對於開發者來說:

非常重要,非常重要,非常重要。

因爲這個值決定了,你的合約不能太複雜,如果太複雜,部署的時候 gas 消耗超過 800w,根本無法部署到鏈上

超過 800w 不是啥難事,代碼多一點,預先多存儲點東西上去,就可以做到了。這也是爲什麼經常需要拆分合約,通過合約互調的方式來寫邏輯。真的不是炫技,不這樣幹,無法部署上鍊,一點招都沒有!

gasPrice 設定

懂得如何設定合理的 gasPrice 是一項非常重要的技能。因爲它可以讓你在以太坊上行走,懂得這項技能有幾大優勢:

1. 總是比別人少花點錢

2. 提前搶到額度。經常發生在 1CO 的公募時期

3. 買到更便宜的價格,玩過 F3D 應該明白吧

我們一個典型的案例:

一文講清楚以太坊的 gas,gasPrice,gasLimit

這些被堵很長時間的,比如 50 分鐘以上的,就是典型的失敗者。還有那種給了居高 gas 費用的好心人,就不在此展示,實在傷人。

其實很簡單,交易的時候參考網站:

https://ethgasstation.info/

一文講清楚以太坊的 gas,gasPrice,gasLimit

看看當前是什麼價格,特別是寫合約開發,做批量處理處理的兄弟,多看看最新的價格,設定好,非常關鍵,可以省不少錢!

常見錯誤和解決方法

out of gas

一看就是交易的 gas 費用太低

gas limit error

經常出現在私鏈部署合約,由於私鏈默認的區塊的 gas limit 大概在 500w 左右,合約一大就無法部署上去。在測試鏈中也有可能這個問題。kovan 不錯,跟主鏈一樣,800w

一直 pending

gasPrice 給得太低,被礦工嫌棄不願意打包。也有解決方案。等待下篇詳細分析。

常用工具

梳理一下文章中主要用到的工具:

1. 區塊鏈瀏覽器:https://etherscan.io/

2. 價格查看器:https://ethgasstation.info/

3. 查看交易的分佈,看看誰把以太坊搞堵住:https://ethgasstation.info/gasguzzlers.php

歷史精選文章:

以太坊 DApp 最佳開發實踐-Parity 篇

以太坊 DAPP 最佳開發實踐-工具篇

破解獲得 Fomo3d 中閉源合約 F3DExternalSettings 的返回值

Fomo3D 源碼解密:框架篇

我們有專門的付費羣討論區塊鏈應用開發,添加下面的微信,可加入。

一文講清楚以太坊的 gas,gasPrice,gasLimit