Gas
帶大陣列輸入的天然氣價格
我正在編寫一個需要大型固定 uint256 數組作為輸入的函式。這個函式的目的是讀取這個大數組的一個元素並忽略所有其他元素。
uint public test; function readArray(uint[10][10]["x"] _array) public { test = _array[1][1][1]; }
就我(公認的基本)知識而言,在這份契約中,我並沒有做任何明顯耗費氣體的事情(例如更改或儲存大量此數組)。但是當我將“x”增加到 10 左右時,一切都崩潰了。
有沒有辦法在合約中輸入大量數據而不會崩潰?(我正在尋找一個任意大的 x 值)。
謝謝,安迪
嘗試將您的功能可見性從 更改
public
為external
。將函式可見性聲明為外部允許 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 處的元素是有意義的,那麼完全放棄數組的想法。
雖然介面支持使用數組,但必須謹慎使用,避免出現無法負擔或無法使用函式的情況。
希望能幫助到你。