首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >映射的存储优化

映射的存储优化
EN

Ethereum用户
提问于 2022-08-06 22:18:13
回答 1查看 141关注 0票数 0

对于最优存储优化,将较小的数据类型组合在一起是理想的。

例如:

代码语言:javascript
复制
uint128 x;
unit 128 y;
unit 256 z;

而不是:

代码语言:javascript
复制
uint128 x;
unit 256 z;
unit 128 y;

但是映射是如何在存储中工作的呢?一个映射需要多少存储空间?当我们给它添加新的记录时,它是如何工作的?以及如何对它们进行适当的优化?

EN

回答 1

Ethereum用户

回答已采纳

发布于 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#映射和动态数组

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/133145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档