Gas

帶大陣列輸入的天然氣價格

  • August 10, 2020

我正在編寫一個需要大型固定 uint256 數組作為輸入的函式。這個函式的目的是讀取這個大數組的一個元素並忽略所有其他元素。

   uint public test;

   function readArray(uint[10][10]["x"] _array) public {
       test = _array[1][1][1];
   }

就我(公認的基本)知識而言,在這份契約中,我並沒有做任何明顯耗費氣體的事情(例如更改或儲存大量此數組)。但是當我將“x”增加到 10 左右時,一切都崩潰了。

有沒有辦法在合約中輸入大量數據而不會崩潰?(我正在尋找一個任意大的 x 值)。

謝謝,安迪

嘗試將您的功能可見性從 更改publicexternal。將函式可見性聲明為外部允許 EVM 直接從函式呼叫中讀取數據,而不必複製數據。

話雖如此,我不知道使用這種方法可以輸入多大的輸入。

我意識到這只是一個人為的例子來說明問題。很難猜出為什麼你會“需要”輸入這麼多數據而忽略其中的大部分。你不想那樣做。

在範例中,x 每增加 1 倍,界面佈局的大小就會增加 100 倍 (10**2)。那還有 100 個 32 字節的字要解包。Gas 成本在經濟上限制了我們對 EVM 的無效使用。您需要以 O(1) 為目標,因此無論您在做什麼,都可以在任何規模上發揮作用。

您可以通過許多小操作而不是單個大操作來完成此操作。例如,

function setElement(uint x, uint y, uint z, bytes32 value) public {
 element[x][y][z] = value;
}

客戶端將遍歷數組並發送許多事務來填充數組。如果確實只有 1,1,1 處的元素是有意義的,那麼完全放棄數組的想法。

雖然介面支持使用數組,但必須謹慎使用,避免出現無法負擔或無法使用函式的情況。

希望能幫助到你。

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