Разница между множественными отображениями и отображениями структур в Солидности - PullRequest
0 голосов
/ 22 октября 2018

Обычный шаблон, который я использую в своем контрактном программировании, может быть неэффективным по сравнению с использованием структур.Я хотел узнать мнение тех, у кого больше опыта в оптимизации памяти и газа.Например, в случае, когда я хочу отправлять сообщения на блокчейне, я бы сделал следующее (оставив много модификаторов и других деталей, поскольку это пример):

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;

Будет ли приведенный ниже кодлучшая альтернатива?Мой текущий мыслительный процесс состоит в том, что два сопоставления подряд просто объединяют два ключа, а это означает, что для внутреннего сопоставления не требуется дополнительная память.Внешнее сопоставление уже резервирует требуемую память для его хеш-таблицы.

Но, опять же, размещение сопоставлений внутри структуры 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;

С нетерпением ждем ответов на этот вопрос, и если оба они одинаковы, что предпочитает сообщество (я бы предположил второй метод).

...