Как сопоставления в Solidity занимают память

Скажем, я объявляю сопоставление, которое использует числа uint256 в качестве ключей и сопоставляет их с одним 8-битным символом. Я добавляю 5 участников в это сопоставление.

Очевидно, что затем я могу получить доступ к любому из этих 5 символов, используя соответствующие индексы.

Итак, что я хочу знать, потребляет ли это отображение 5 * 8 = 40 бит памяти или 5 * 8 + 5 * 256 = 1320 бит?

Ответы (1)

Отображение — это динамический тип, работающий как хранилище (а не память) базы данных ключ-значение.

возьмем следующий пример

contract C {
    mapping(uint256 => uint256) items;
    function C() {
      items[0xC0FEFE] = 0x42;
    }
}

Ассемблерный код для функции C будет содержать:

  // Storing 0x42 to the address 0x798...187c
  0x42
  0x79826054ee948a209ff4a6c9064d7398508d2c1909a392f899d301c6d232187c
  sstore

что означает, что мы сохраняем значение 0x42в значении, соответствующем ключу 0x79826054ee948a209ff4a6c9064d7398508d2c1909a392f899d301c6d232187c, который является хэшем ключа сопоставления0xC0FEFE

вот интересное обсуждение того, почему сопоставление не может быть разработано для использования памяти. Почему (концептуально) сопоставления не могут быть локальными переменными?

Означает ли это, что индексы не будут занимать место в хранилище, поскольку они используются только для присвоения адреса хранения значению? Извините, если это звучит глупо (я новичок в Эфириуме), но означает ли это, что пример, упомянутый в вопросе, будет потреблять только 40 бит памяти?
1-да 2-в этом примере мы храним только 1 байт
Разве не хранится значение 0x00000000000000000000000000000000000000000000000000000000000000042, так как слоты 32 байта?
Точно каждое значение имеет ширину 32 байта. но изначально это только 1 байт. это как хранить 1 байт в массиве размером 32 байта (в моем комментарии я говорил о размере в точке входа)