_ 版權聲明_
本文作者:苑風 請注意:轉載請聯繫作者獲得授權; 轉載時請保留以上版權聲明…
“`
—————————————–
在開發 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 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 Limit 和 Gas Used 的區別。
此處的 Gas Limit 就是一個區塊能容納的所有交易的 Gas 總和。礦工在打包交易的時候,只要他不傻,會優先把 gasPrice 高的交易搞進來,然後依次組裝成一個區塊。最終這些交易消耗的 gas 總和就是 Gas Used。
是的,對於一般用戶來說,不必要關心這個值。但是,對於開發者來說:
非常重要,非常重要,非常重要。
因爲這個值決定了,你的合約不能太複雜,如果太複雜,部署的時候 gas 消耗超過 800w,根本無法部署到鏈上。
超過 800w 不是啥難事,代碼多一點,預先多存儲點東西上去,就可以做到了。這也是爲什麼經常需要拆分合約,通過合約互調的方式來寫邏輯。真的不是炫技,不這樣幹,無法部署上鍊,一點招都沒有!
gasPrice 設定
懂得如何設定合理的 gasPrice 是一項非常重要的技能。因爲它可以讓你在以太坊上行走,懂得這項技能有幾大優勢:
1. 總是比別人少花點錢
2. 提前搶到額度。經常發生在 1CO 的公募時期
3. 買到更便宜的價格,玩過 F3D 應該明白吧
我們一個典型的案例:
這些被堵很長時間的,比如 50 分鐘以上的,就是典型的失敗者。還有那種給了居高 gas 費用的好心人,就不在此展示,實在傷人。
其實很簡單,交易的時候參考網站:
看看當前是什麼價格,特別是寫合約開發,做批量處理處理的兄弟,多看看最新的價格,設定好,非常關鍵,可以省不少錢!
常見錯誤和解決方法
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 源碼解密:框架篇
我們有專門的付費羣討論區塊鏈應用開發,添加下面的微信,可加入。