
最近筆者被朋友詢問,為什麼他在區塊鏈的操作會遲遲無法上鏈?什麼是 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. 更多討論見後)。
這邊我們做簡短的 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 低,這兩件事本來就是矛盾的。因此該如何在這之中取得平衡是需要花時間分析整個數據的。對於這個課題,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.
文章作者:ChihYun Chuang