Solidity

在 Solidity 的視圖(或純)函式中,每個循環可以進行多少次迭代?

  • August 9, 2021

假設我有一個視圖函式,它有一個循環,我必須使用這個循環。這個循環正在呼叫另一個視圖函式來驗證每個索引鍵的一些數據。

查看功能可以免費執行,無需支付 GAS 費用。

例如,這有效

function retrieve() public pure returns (uint256){
   uint256 ret = 0;
   for(uint t=0;t<1000;t++){
       ret = t;
   }
   return ret;
}

但是,這不起作用

   function retrieve() public pure returns (uint256){
       uint256 ret = 0;
       for(uint t=0;t<1000000000000;t++){
           ret = t;
       }
       return ret;
   }
}

我可以在視圖中迭代這種循環多少次?換句話說,我可以使用並使循環工作的 1000 到 1000000000000(參見上面的程式碼範例)之間的最大數字是多少?這個數字是如何確定的?

編輯:我能夠在測試網上進行 15000 次迭代,但不能進行 20000 次,所以我將其限制為最多 10000 次迭代,假設它只是呼叫索引並驗證值(並儘可能使用 try-catch)。無論如何,我仍然不知道是什麼決定了這個數字,以及它是如何確定的。

儘管僅在您連接的單個完整節點上執行的視圖功能不消耗氣體,但它也有氣體限制。因為惡意使用者可以像你一樣消耗整個節點的計算資源。

只是為了確保:viewpure函式只有在本地呼叫時是無氣體的。如果它們作為交易的一部分被呼叫,它們通常會花費 gas。本地(只讀)呼叫免費的原因是它只消耗您節點的資源(或為您提供節點的任何人) - 它不會傳播到區塊鏈,其他任何人都不能濫用資源。

我實際上不確定本地呼叫的視圖函式是否需要遵守與交易相同的氣體限制。無論如何,如果他們這樣做,您可以獲取所有數據並在本地進行處理。但是如果他們需要遵守氣體限制,那麼這就是你可能達到的限制(假設你在本地呼叫它)。對於主網,gas 限制目前約為 1500 萬 - 對於其他網路,它會有所不同。

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