【发布时间】:2018-12-02 21:02:43
【问题描述】:
Solidity allows 映射结构内的类型。这样一个字段需要多少字节?
具体我想优化一下storage layout以下类型。
struct Balance {
uint40 amount;
mapping(address => uint) allowances;
}
【问题讨论】:
标签: ethereum solidity smartcontracts evm
Solidity allows 映射结构内的类型。这样一个字段需要多少字节?
具体我想优化一下storage layout以下类型。
struct Balance {
uint40 amount;
mapping(address => uint) allowances;
}
【问题讨论】:
标签: ethereum solidity smartcontracts evm
我认为您的意思是存储布局,而不是内存布局。
uint 是 uint256 的别名,它是 256 位的。因此,存储在该映射中的每个值都使用一个 32 字节的存储槽。
编辑
对于完整的Balance 结构,每个将消耗两个存储槽,但一个槽将始终为零。第一个插槽由uint40 使用,第二个插槽是mapping 的占位符,实际上没有存储任何值。就gas费用而言,这是免费的。
因此,存储一个新的Balance 会将一个 32 字节的字写入存储,然后您添加到 allowances 映射的每个 uint 都会将一个 32 字节的字写入存储。
【讨论】:
mapping(address => Balance) 中的哪个值?
foo[bar] 是bar 的哈希值,与foo 的存储槽相连。 programtheblockchain.com/posts/2018/03/09/… 可能会有所帮助,或者您链接到的文档。
mapping(address => Balance) foo,foo[a][b] 位于通过连接b、a 和foo 的插槽找到的插槽中。
all 位于插槽0,则all[1].allowances[2] 位于keccak256(2 || (keccak256(1 || 0) + 1)) 位置。换句话说,你找到all[1]的位置,也就是Balance,然后你加1得到all[1].allowances的槽。然后你连接 2 和那个插槽来获得all[1].allowances[2] 的位置。 all[2]的槽不同,所以整个计算是不同的。