Ethereum 映射类型的实体字段大小

Ethereum 映射类型的实体字段大小,ethereum,solidity,smartcontracts,evm,Ethereum,Solidity,Smartcontracts,Evm,结构内部的实体映射类型。这样一个字段需要多少字节 具体来说,我想优化以下类型的 struct Balance { uint40 amount; mapping(address => uint) allowances; } 我想你指的是存储布局,不是内存布局 uint是uint256的别名,为256位。因此,存储在该映射中的每个值在存储器中使用一个32字节的插槽 编辑 对于完整的Balance结构,每个结构将占用两个存储插槽,但一个插槽始终为零。第一个插槽由uint40使用

结构内部的实体映射类型。这样一个字段需要多少字节

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

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

我想你指的是存储布局,不是内存布局

uint
uint256
的别名,为256位。因此,存储在该映射中的每个值在存储器中使用一个32字节的插槽

编辑

对于完整的
Balance
结构,每个结构将占用两个存储插槽,但一个插槽始终为零。第一个插槽由
uint40
使用,第二个插槽是
映射的占位符,实际上没有存储任何值。就汽油价格而言,那是免费的


因此,存储一个新的
余额
将向存储器写入一个32字节的字,然后添加到
余量
映射中的每个
uint
将向存储器写入一个32字节的字。

我想你指的是存储器布局,而不是内存布局

uint
uint256
的别名,为256位。因此,存储在该映射中的每个值在存储器中使用一个32字节的插槽

编辑

对于完整的
Balance
结构,每个结构将占用两个存储插槽,但一个插槽始终为零。第一个插槽由
uint40
使用,第二个插槽是
映射的占位符,实际上没有存储任何值。就汽油价格而言,那是免费的


因此,存储一个新的
余额
将向存储器写入一个32字节的字,然后添加到
余量
映射中的每个
uint
将向存储器写入一个32字节的字。

正确。我想知道的是一个Balance实例需要多少字节。那么这将是40+…?如果编辑为真,那么运行时如何知道哪些余量属于
映射(address=>Balance)
中的哪个值?映射通过散列工作
foo[bar]
位于与
foo
的存储槽相连的
bar
的散列中。可能会有帮助,或者您链接到的文档。因此对于
映射(地址=>Balance)foo
foo[a][b]
位于通过连接
b
a
foo
的插槽找到的插槽。假设
all
位于插槽
0
,则
all[1]。津贴[2]
位于位置
keccak256(2 | | |(keccak256(1 | | 0)+1))
。换句话说,您可以找到
all[1]
的位置,这是一个
余额
,然后添加1以获得
all[1]的插槽。津贴
。然后连接2和该插槽,以获得
所有[1]的位置。容差[2]
all[2]
的插槽不同,因此整个计算过程不同。正确。我想知道的是一个Balance实例需要多少字节。那么这将是40+…?如果编辑为真,那么运行时如何知道哪些余量属于
映射(address=>Balance)
中的哪个值?映射通过散列工作
foo[bar]
位于与
foo
的存储槽相连的
bar
的散列中。可能会有帮助,或者您链接到的文档。因此对于
映射(地址=>Balance)foo
foo[a][b]
位于通过连接
b
a
foo
的插槽找到的插槽。假设
all
位于插槽
0
,则
all[1]。津贴[2]
位于位置
keccak256(2 | | |(keccak256(1 | | 0)+1))
。换句话说,您可以找到
all[1]
的位置,这是一个
余额
,然后添加1以获得
all[1]的插槽。津贴
。然后连接2和该插槽,以获得
所有[1]的位置。容差[2]
all[2]
的插槽不同,因此整个计算过程不同。