Solidity

映射的儲存優化

  • August 7, 2022

為了優化儲存優化,將較小的數據類型放在一起是理想的。

例如做:

uint128 x;
unit 128 y;
unit 256 z;

代替:

uint128 x;
unit 256 z;
unit 128 y;

但是映射在儲存中是如何工作的呢?一個映射需要多少儲存空間?當我們向其中添加新記錄時,它是如何工作的?以及如何正確優化它們?

根據文件,映射和動態數組不能儲存在正常狀態變數之間,因為它們的大小不可預測。

因此,它們在聲明它們的地方被分配了一個 32 字節的插槽。對於數組,數組的大小放在這個槽中。對於映射,槽保持空,但需要它的位置來確保如果其他映射並排放置,它們的元素將被放置在不同的槽中。

儲存就像一個數組,其中每個插槽為 32 字節(256 位),大小為 2**256(約 115792089237316195423570985008687907853269984665640564039457584007913129639936)。所以,它很大,你可以在那裡放置很多 32 字節的數據。

因此,為了計算數組元素的放置位置,將keccak256使用與元素索引連接的儲存中數組索引的雜湊值。這將提供一個 256 位散列,作為該數據在儲存中的索引。

對於一個映射,它的一個元素的索引是通過keccak256其鍵的雜湊值與儲存中的映射索引連接的(儲存中的映射索引用於將其與具有完全相同鍵/值類型的另一個映射區分開來)可以放在靠近它的地方,因為keccak256散列將與此數據完全不同)。

因此,回到您的問題,我們無法優化映射。所以不要太擔心這一點。映射可以採用儲存大小允許的盡可能多的元素。

檢查此概念的文件:https ://docs.soliditylang.org/en/v0.8.7/internals/layout_in_storage.html#mappings-and-dynamic-arrays

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