Solidity

儲存長度為 2**256-1 與長度為 4 的空動態數組的成本

  • February 5, 2020

如果數組完全為空,儲存uint是否更昂貴

$$ $$長度為 2**256-1 與長度為 4?

如果數組僅在 foo 下面使用

$$ n $$, 並且長度比 n 長, 是任何高於 foo$$ n $$增加儲存成本?

不。

數組使用與映射相同的儲存方案。要寫入的槽是合約地址的雜湊值、在編譯時建立的變數的位置和索引。未初始化的值不會被寫入,如果被訪問,它們將返回 0x00…。為清楚起見,Solidity 數組強制執行一個規則,即合約只能訪問索引 < 長度,即不要超過末尾。

通常,EVM 和 Solidity 對寫入非常保守,除非您的契約要求它們重新組織數據,否則它們不會重新組織數據。

是否高於 foo

$$ n $$增加儲存成本?

如果那裡什麼都沒有。

試試這個:

pragma solidity 0.5.16;

contract ArrayStuff {

 bytes32[] d;

 function makeHuge() public {
     uint massive = uint(0)-uint(1); // biggest uint possible
     d.length = massive;
 }
}

你可以看到製作一個巨大的陣列需要大約 42K 的氣體。

這樣做有一些注意事項。理論上,您擁有所有插槽的索引。如果你能找到正確的雜湊衝突,你可能會亂寫任何東西。在實踐中,要計算出將散列到正確插槽的索引以踩到任何特別的東西是非常具有挑戰性的。

這是雜湊函式:https ://solidity.readthedocs.io/en/v0.6.1/miscellaneous.html#mappings-and-dynamic-arrays

希望能幫助到你。

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