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]
的插槽不同,因此整个计算过程不同。