对于最优存储优化,将较小的数据类型组合在一起是理想的。
例如:
uint128 x;
unit 128 y;
unit 256 z;而不是:
uint128 x;
unit 256 z;
unit 128 y;但是映射是如何在存储中工作的呢?一个映射需要多少存储空间?当我们给它添加新的记录时,它是如何工作的?以及如何对它们进行适当的优化?
发布于 2022-08-07 04:56:57
基于文档,映射和动态数组不能存储在正则状态变量之间,因为它们的大小不可预测。
因此,它们在声明的位置被分配了一个32个字节的槽。对于数组,数组的大小放置在这个槽中。对于映射,槽保持为空,但需要其位置以确保如果将其他映射放置在另一个映射旁边,则它们的元素将放置在不同的槽中。
存储就像一个数组,其中每个插槽为32字节(256位),大小为2**256 (约115792089237316195423570985008687907853269984665640564039457584007913129639936). )。所以,它是巨大的,你可以容纳很多32字节的数据。
因此,要计算数组元素的放置位置,将使用与元素索引连接的存储中的数组索引的keccak256散列。这将提供256位哈希,作为存储中数组数据的起始索引。数组可以使用其元素类型进行优化。检查这篇文章,在“引用类型存储布局”部分。
对于映射,其一个元素的索引用其键的keccak256散列与存储中的映射索引连接(存储中的映射索引用于区分它与可能放置在它附近的完全相同的键/值类型的另一个映射,因为keccak256散列将与此数据完全不同)。
所以,回到你的问题,我们没有什么可以做的优化一个映射。所以别太担心这个。映射可以在存储大小允许的范围内使用尽可能多的元素。
查看有关此概念的文档:https://docs.soliditylang.org/en/v0.8.7/internals/layout_在……里面_arrays#映射和动态数组
https://ethereum.stackexchange.com/questions/133145
复制相似问题