Какова будет фактическая стоимость газа для картирования и есть ли какие-либо ограничения по размеру?

Я хочу получить оценку того, сколько будет стоить хранить произвольное количество элементов в отображении формы BYTES32 -> BYTES32. Я вижу здесь , что STORAGEADDоперация стоит 20000 газа, что, как я полагаю, является инструкцией по добавлению элемента в отображение (это правильно?) .

Цена на газ сегодня составляет 20 gwei, поэтому 20 * 10^9 wei дает мне в общей сложности 20000 * 20 * 10^9 * 10^-18 = 0,0004 эфира ~ 0,0048 доллара США (с 1 ETH = 12 долларов США).

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

Ответы (2)

Общее хранилище состоит из 32-байтовых слотов, адресованных 256 битами. Это дает нам 2^256 * 32байты для использования. Когда вы добавляете элемент в mapping, он отправляется в случайное место в хранилище, рассчитанное с помощью sha3, см. этот ответ .

Добавление элемента в сопоставление никогда не завершится ошибкой, потому что всегда будет sha3рассчитанное место для размещения информации. Конечно, чем ближе вы подходите к 2^256вставкам, тем выше вероятность того, что вы в конечном итоге перезапишете что-то еще.

Хорошее эмпирическое правило заключается в том, что вам нужно приблизительно sqrt(n) записей, прежде чем вы ожидаете столкновения, поэтому в этом случае 2 ^ 128. Это примерно 3,4e38, то есть 340 миллионов миллионов миллионов миллионов миллионов миллионов. en.wikipedia.org/wiki/Birthday_problem#Square_closed Существуют также средства для исправления коллизий хешей в картах, допускающие теоретически бесконечные записи, но я не уверен в точной реализации в EVM.

См. этот ответ на аналогичный вопрос. Короче говоря: вы можете хранить любое количество элементов в отображении.