Contract-Development
如何在合約創建期間最小化gas消耗
我在將合約部署到主網路時遇到了麻煩,我相信這是由於高耗氣量造成的。該合約的早期版本在主網路上執行。目前版本適用於我的私人測試網(使用創建
geth --dev
)。在測試網上,這些合約創建使用了大約 240 萬單位的 gas。我一開始嘗試在主網上部署它,有 200 萬個 gas,但遇到了一個 out of gas 異常(雖然 TA 被挖了,但合約創建沒有成功)。之後我用 300 萬試了一下,得到了這個(不是開采的):
"{"jsonrpc":"2.0","error":{"code":-32010,"message":"Transaction cost exceeds current gas limit. Limit: 2200000, got: 3000000. Try decreasing supplied gas.","data":null},"id":1}[\n]"
我完全被卡住了,不知道現在如何部署我的契約。我主要有兩個問題:
- 為什麼我可以將 240 萬 gas 的 TA 發送到測試網而不能發送到主網。我知道它們是不同的鏈,但它不應該使用相同的邏輯進行 TA 驗證嗎?如何將 3mill gas 限制的 TA 發送到主網路?
- 我不明白為什麼我的契約需要這麼多gas。它只有 264 行程式碼。它是三個映射、兩個結構、五個列舉、一個事件和一些相對簡單的函式。我怎樣才能知道我的契約的哪一部分消耗了這麼多的gas?有沒有工具呢?
geth 拒絕發送交易的原因是因為塊 gas 限制不同。在私有測試網上,它可以是任何東西,但預設為 550 萬。在主網上,目前只有 200 萬——所以 300 萬的 gas 交易根本不適合。這是因為最近網路上的垃圾郵件攻擊——開發人員要求礦工降低限制,他們做到了。希望礦工在收到硬分叉後將其恢復為預設值。(我說“希望”是因為這是礦工的決定,開發人員只能提出建議。)
唯一在創建時使用氣體的是建構子中發生的事情,以及編譯程式碼本身的大小。您可能可以通過打開優化器來減小大小,但很可能它已經打開了。
不過,我對它給出的數字並不感到驚訝。264 LoC 在乙太坊中實際上很多。我有一個 400~ LoC 契約,優化了 3~ 百萬氣體。
降低gas成本的三種方法:
- 簡化契約。這可能是不可能的,具體取決於您在做什麼。
- 將其拆分為多個契約。
- 重構它以使用庫。如果您使用大量結構和映射,這可能會使您的程式碼更加可讀。
最簡單的方法可能就是等待。你不是唯一一個被大契約困住的人,所以礦工們有動力再次提高gas限制,而且很快。