Solidity
是否可以在“氣體耗盡”返回之前控制“gasleft()”並退出循環?
已部署的智能合約具有公共視圖功能,可通過 for 循環搜尋結構映射。
問題在於,在 500 圈數據(有 10,000 個索引並且還在增長..)中,區塊鏈返回:
{ "code": -32000, "message": "out of gas" }
那麼,合約現在就沒用了。在 OUT GAS 之前如何控制 GASLEFT 和退出循環的任何想法?
謝謝!
讓我在現有的好答案中添加一些內容。
是的,您可以在契約中實施這種技巧。但我強烈建議不要。主要是因為:
- 契約絕不應依賴運營的天然氣成本。所以你不應該估計一些剩餘操作需要多少氣體。天然氣成本可能會隨著不同的區塊鏈分叉而發生巨大變化。
- 您應該避免開放式循環,或者至少使它們可分頁。因此,如果您有 10000 個條目,並且您 100% 確定必須遍歷所有這些條目,則該循環應該允許批量檢索數據:首先您獲取前 X 個條目,然後獲取下一個 X 條目等。如果頁面/批次尺寸可以自由選擇,可以避免任何氣體問題。唯一的缺點是複雜性增加,理論上,數據可能會在頁面之間發生變化。
當然可以,只需執行以下操作:
do{ // Your stuff }while(gasleft() > whateverYouNeed)
(whateverYouNeed 是執行一次循環所需的氣體量 + 之後的情況(可能 *1.5,以防萬一)