与使用结构相比,我在合同编程中使用的常见模式可能效率低下。我想征询那些在内存和气体优化方面拥有更多经验的人的意见。例如,在我想在区块链上发送消息的情况下,我将按照以下步骤进行操作(因为它是一个示例,因此省略了很多修饰符和其他细节):
struct Message {
address otherParty;
bytes32 message;
}
struct User {
uint256 nextSent;
uint256 nextReceived;
uint256 lastReadIndex;
}
mapping (address => User) users;
//maps address to sent messages. (maps index to message struct)
mapping (address => mapping (uint256 => Message)) sent;
//maps address to received messages.
mapping (address => mapping (uint256 => Message)) received;
下面的代码会更好吗?我当前的思维过程是,连续两个映射将简单地将两个键散列在一起,这意味着内部映射不需要额外的内存。外部映射将已经为其哈希表reserve the required memory。
但是再一次,将映射放在User结构中可以使所有内容更加清晰。而且,如果我对内部映射不需要保留的内存有误,那么在每个用户中存储两个映射,或者为每个地址每个存储两个映射(这两个地址都与一个用户)。
struct Message {
address otherParty;
bytes32 message;
}
struct User {
uint256 nextSent;
uint256 nextReceived;
uint256 lastReadIndex;
mapping (uint256 => Message) sent;
mapping (uint256 => Message) received;
}
mapping (address => User) users;
期待这个问题的答案,如果两者都相同,这是社区所希望的(我会假设第二种方法)。