Contract-Development

如何在合約創建期間最小化gas消耗

  • May 23, 2017

我在將合約部署到主網路時遇到了麻煩,我相信這是由於高耗氣量造成的。該合約的早期版本在主網路上執行。目前版本適用於我的私人測試網(使用創建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]"

我完全被卡住了,不知道現在如何部署我的契約。我主要有兩個問題:

  1. 為什麼我可以將 240 萬 gas 的 TA 發送到測試網而不能發送到主網。我知道它們是不同的鏈,但它不應該使用相同的邏輯進行 TA 驗證嗎?如何將 3mill gas 限制的 TA 發送到主網路?
  2. 我不明白為什麼我的契約需要這麼多gas。它只有 264 行程式碼。它是三個映射、兩個結構、五個列舉、一個事件和一些相對簡單的函式。我怎樣才能知道我的契約的哪一部分消耗了這麼多的gas?有沒有工具呢?

geth 拒絕發送交易的原因是因為塊 gas 限制不同。在私有測試網上,它可以是任何東西,但預設為 550 萬。在主網上,目前只有 200 萬——所以 300 萬的 gas 交易根本不適合。這是因為最近網路上的垃圾郵件攻擊——開發人員要求礦工降低限制,他們做到了。希望礦工在收到硬分叉後將其恢復為預設值。(我說“希望”是因為這是礦工的決定,開發人員只能提出建議。)

唯一在創建時使用氣體的是建構子中發生的事情,以及編譯程式碼本身的大小。您可能可以通過打開優化器來減小大小,但很可能它已經打開了。

不過,我對它給出的數字並不感到驚訝。264 LoC 在乙太坊中實際上很多。我有一個 400~ LoC 契約,優化了 3~ 百萬氣體。

降低gas成本的三種方法:

  1. 簡化契約。這可能是不可能的,具體取決於您在做什麼。
  2. 將其拆分為多個契約。
  3. 重構它以使用。如果您使用大量結構和映射,這可能會使您的程式碼更加可讀。

最簡單的方法可能就是等待。你不是唯一一個被大契約困住的人,所以礦工們有動力再次提高gas限制,而且很快。

引用自:https://ethereum.stackexchange.com/questions/10157