映射类型的 Solidity 字段大小

Solidity field size of mapping type

Solidity allows 结构内的映射类型。这样一个字段需要多少字节?

具体来说,我想优化以下类型的storage layout

struct Balance {
    uint40 amount;
    mapping(address => uint) allowances;
}

我认为你的意思是存储布局,而不是内存布局。

uintuint256 的别名,它是 256 位。因此存储在该映射中的每个值都使用存储中的一个 32 字节槽。

编辑

对于完整的 Balance 结构,每个结构将占用两个存储槽,但一个槽始终为零。第一个槽由 uint40 使用,第二个槽是 mapping 的占位符,实际上没有存储任何值。就 gas 成本而言,这是免费的。

所以存储一个新的 Balance 将写入一个 32 字节的字到存储,然后每个 uint 你添加到 allowances 映射将写入一个 32 字节的字到存储。