Solidity

是否可以在“氣體耗盡”返回之前控制“gasleft()”並退出循環?

  • September 4, 2022

已部署的智能合約具有公共視圖功能,可通過 for 循環搜尋結構映射。

問題在於,在 500 圈數據(有 10,000 個索引並且還在增長..)中,區塊鏈返回:

{
 "code": -32000,
 "message": "out of gas"
}

那麼,合約現在就沒用了。在 OUT GAS 之前如何控制 GASLEFT 和退出循環的任何想法?

謝謝!

讓我在現有的好答案中添加一些內容。

是的,您可以在契約中實施這種技巧。但我強烈建議不要。主要是因為:

  1. 契約絕不應依賴運營的天然氣成本。所以你不應該估計一些剩餘操作需要多少氣體。天然氣成本可能會隨著不同的區塊鏈分叉而發生巨大變化。
  2. 您應該避免開放式循環,或者至少使它們可分頁。因此,如果您有 10000 個條目,並且您 100% 確定必須遍歷所有這些條目,則該循環應該允許批量檢索數據:首先您獲取前 X 個條目,然後獲取下一個 X 條目等。如果頁面/批次尺寸可以自由選擇,可以避免任何氣體問題。唯一的缺點是複雜性增加,理論上,數據可能會在頁面之間發生變化。

當然可以,只需執行以下操作:

do{
// Your stuff
}while(gasleft() > whateverYouNeed)

(whateverYouNeed 是執行一次循環所需的氣體量 + 之後的情況(可能 *1.5,以防萬一)

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