最近筆者被朋友詢問,為什麼他在區塊鏈的操作會遲遲無法上鏈?什麼是 Gas Limit?為什麼花了錢結果交易還是無法上鏈?要回答這些觀念,需要理解區塊鏈的一些機制。這裡我們將討論範疇限縮在 Ethereum 上。
用一個例子讓大家了解整個機制和術語。我國普遍採用火力發電,若是要讓發電機能順利運作,通常需要提供 “Gas” 讓其燃燒。為了計算發電成本,則會開始計價每一單位的 Gas 需要多少錢,我們這裡稱作 “Gas price”。故整個發電成本是 Gas * Gas Price。
此外 Gas Limit 意指你願意付出最大的 Gas 數量使得發電機可以開始順利發電。可預期的是為了要達成發電,成本最多會達到 Gas Limit * Gas Price。然而也許機器老舊,抑或是其他原因,當消耗光你願意付出的 Gas 數量(i.e. 意即到達 Gas Limit),仍然未能讓發電機順利運作。換句話說,消耗的成本 Gas Limit * Gas Price 便打水漂。
將上述的場景轉移到區塊鏈中,無論是執行一般交易或是智能合約,使用者都需要消耗 Gas。 Gas Limit 是你執行這個動作願意消耗 Gas 的最大值。 Gas Price 則是你願意為每一個單位的 Gas 付出多少錢。如同上面的例子, Gas Limit * Gas Price 便是你預期的最大花費。有這些觀念,我們可以回答一開始提出的問題。
為什麼我發出的交易遲遲無法上鏈?
這是因為 Gas Price 太低。如同火力發電,若是你要採購 Gas,則你願意付出越高的 Gas Price,就越容易從 Gas 賣方買到。在區塊鏈中,可以想像,你是跟“礦工”這個角色去“購買” Gas。因此願意付出越高價的 Gas Price,礦工會越樂意的優先賣你 Gas。因此 Gas Price 的高低會影響礦工願不願意賣你 Gas 的意願,所以影響你交易上鏈的速度。
為什麼我執行的交易失敗並且又花了一筆錢?
這是執行時所花的 Gas 的數量超過設定的 Gas Limit。因此導致執行失敗被直接處罰扣款。這樣的設計是避免有心人濫用區塊鏈的服務。一般來說,用戶應該要將 Gas Limit 設定的比預期花的 Gas 還高。由於沒有消耗 Gas 的部分的花費會退回,所以將 Gas Limit 設定較高是無妨的(i.e. 更多討論見後)。
Gas 核心術語總結
這邊我們做簡短的 Summary:
- Gas:用來計算消耗執行交易或是合約.. 等互動的基本單位。
- Gas Price:每一單位的 Gas 所願意付的成本。這會影響到上鏈的速度。
- Gas Limit:在執行提出的需求時,你願意付出最多 Gas 的數量。若是真實執行量超過這個值,那麼需求就會失敗,並且造成損失。
- Transaction fee:這次執行你所需付的手續費:Gas Price * Gas。
接下來,我們討論自然產生的問題。
- 既然 Gas Price 的出價會影響到交易上鏈的速度(i.e. 因為礦工喜歡單價高的)。 那麼該怎麼出價,可以使得交易在合理的時間上鏈且花費又比較低呢?
- 當執行與區塊鏈互動的行為時,該如何設定 Gas Limit?由於沒有用完的錢會退還給用戶,所以只要設夠高的 Gas Limit 即可。因此這個問題看起來似乎沒什麼。但是高的 Gas Limit 易導致資產被迫圈住無法動用進而使得用戶的資產流動性降低。另一方面,對於開發者而言,為什麼會寫出合約程式碼導致 Gas Limit 需要設得很高,該怎麼避免?這些仍然值得探討。
優化Gas Price及設定Gas limit的解決方案
對於問題一:
顯而易見的,快速上鏈跟 Gas Price 低,這兩件事本來就是矛盾的。因此該如何在這之中取得平衡是需要花時間分析整個數據的。對於這個課題,AMIS 團隊採取兩個方法:
- 利用統計分析提出一個更有效的演算法去預測合理的 Gas Price 價格。相比於其他常見的演算法,回測顯示我們的方法上鏈率更高且整體花費更低。這是因為我們的算法會評估上鏈的狀態去切換合理的預測方式。同時這個算法對於短期間 Gas Price 飆高仍然保有合理的上鏈率。對於大多數的情況,我們都可相信這個 Gas Price 預言機提供的結果。更多的細節可參考我們被接收的論文:A Practical and Economical Bayesian Approach to Gas Price Prediction 。
- 從預言機拿到的預測值仍然是有機率無法上鏈的。為了解決此問題,我們會自動地幫我們錢包(i.e. Qubic)的使用者自動地更新 Gas Price 的報價,使得上鏈成功率更高。
對於問題二:
當在執行智能合約時,這個問題特別重要。如果在未公開合約的情況下,開發團隊需要小心地幫用戶設定 Gas Limit。若是設定不合理的 Gas Limit,容易導致用戶發送失敗導致平白損失金錢。AMIS 團隊採取兩個方法:
- 在每次執行合約前,對合約做一個預處理以評估花費。並且根據這個花費乘上一個簡單比例去設定 Gas Limit ,避免 Gas 使用量超過此值導致交易失敗。在我們的產品 Qubic,若是使用信用卡購買 NFT,我們會根據我們的評估去設定 Gas Limit 而跟用戶收費,若是 Gas 使用量沒有這麼高,我們會將多餘的款項退回給用戶。這樣更能讓用戶安心使用。
- 在開發合約的時候,我們會撰寫 test 去評估 Gas 的使用量有沒有特別無法接受的情況發生。提早發現,提早治療。並且會小心的避免使用一些極為耗費 Gas 的合約寫法(e.x. 可能執行超多次數的迴圈)。這一點可以參考我們之前撰寫的文章:一個使用更少 Gas 的非重複亂數的生成算法 。
結論
對於發送交易或是執行合約都需要去理解區塊鏈本身的機制。但是使用 AMIS 的服務
可以讓用戶大大地減輕使用區塊鏈服務的困難度,不需要考慮 Gas Price 及 Gas Limit 的設定,因此使用起來就跟一般網銀交易相同。同時 AMIS 提供的以上服務都是經的起檢驗有公開的文件作佐證。歡迎大家使用我們的產品,並期待給予鞭策和指教。Thanks to Yu-Te Lin, Alan Chen, and Cara Shen.
FAQ
這通常是因為你設定的 Gas Limit(願意消耗的 Gas 最大值)太低。當區塊鏈在執行你的交易或智能合約時,如果消耗的 Gas 達到了你設定的極限,但運算還沒完成,交易就會失敗。為了防止惡意濫用資源,礦工依然會扣除你已經消耗的這部分手續費(Gas Limit * Gas Price),導致你白白花錢。
不會的。Gas Limit 只是你「預先授權」的最高額度。如果交易實際消耗的 Gas 比你設定的低,區塊鏈會自動把剩餘沒有用到的花費退還給你。不過,如果設定得過高,可能會導致你的部分資產在交易期間被「圈住」無法動用,短暫影響資金流動性。
AMIS 透過統計分析與預測演算法,能更精準地評估合理的 Gas Price 以確保上鏈率並降低成本。在產品端(如 Qubic),我們會在執行前預估花費並自動設定適當的 Gas Limit,多收的款項也會自動退回給用戶,讓使用者能像操作一般網銀一樣輕鬆,無需煩惱區塊鏈底層的複雜設定。