Solidity
映射的儲存優化
為了優化儲存優化,將較小的數據類型放在一起是理想的。
例如做:
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
散列將與此數據完全不同)。因此,回到您的問題,我們無法優化映射。所以不要太擔心這一點。映射可以採用儲存大小允許的盡可能多的元素。