EVM может восстановить хранилище, используя ключевое слово «удалить» в Solidity.
Однако память расширяется, когда под ключевое слово «новое» выделяется больше, верно? Локальные переменные также хранятся в памяти?
Когда память сжимается, чтобы память не расширялась?
Нет. Использование памяти во время выполнения одного EVM/исполнения контракта только увеличивается.
То есть вы получаете платный газ за увеличение объема используемой памяти, но не получаете возмещение за уменьшение объема. Как вы говорите, это отличается от хранения.
С точки зрения « Желтой книги » объем памяти в словах составляет mu_i
. Всякий раз, когда это пересчитывается, это всегда с точки зрения max(mu_i, current_memory_access)
- так что это монотонно; он никогда не падает.
Что еще более интересно, простое чтение памяти (но не запись в нее) может увеличить объем используемой памяти mu_i
. Таким образом, с вас будет взиматься плата за расширение памяти, если вы просто читаете за пределы текущей верхней части памяти. См. определение MLOAD
в Желтой книге.
Solidity в основном хранит локальные переменные в памяти, но иногда может использовать стек для промежуточных значений.
Шучжэн
delete
также к переменным памяти, т. е. может ли он использоваться для установки памяти в «ноль»?Бенджаминион
delete
работает с переменными памяти; он просто устанавливает его в ноль.Шучжэн