【问题标题】:Solidity field size of mapping type映射类型的 Solidity 字段大小
【发布时间】:2018-12-02 21:02:43
【问题描述】:

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

具体我想优化一下storage layout以下类型。

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

【问题讨论】:

    标签: ethereum solidity smartcontracts evm


    【解决方案1】:

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

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

    编辑

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

    因此,存储一个新的Balance 会将一个 32 字节的字写入存储,然后您添加到 allowances 映射的每个 uint 都会将一个 32 字节的字写入存储。

    【讨论】:

    • 正确。我想知道的是一个 Balance 实例需要多少字节。那么这将是 40 + ...?
    • 如果编辑为真,那么运行时如何知道哪些津贴属于mapping(address => Balance) 中的哪个值?
    • 映射通过散列工作。 foo[bar]bar 的哈希值,与foo 的存储槽相连。 programtheblockchain.com/posts/2018/03/09/… 可能会有所帮助,或者您链接到的文档。
    • 所以对于mapping(address => Balance) foofoo[a][b] 位于通过连接bafoo 的插槽找到的插槽中。
    • 假设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]的槽不同,所以整个计算是不同的。
    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2013-02-24
    • 1970-01-01
    • 2018-01-08
    • 2020-07-21
    • 2019-12-04
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多