Места хранения и памяти данных

Каждая переменная, объявленная и используемая в контракте, имеет местоположение данных. EVM предоставляет следующие четыре структуры данных для хранения переменных:
Хранилище: часто это глобальная память, доступная для всех или любых функций в рамках контракта. Это хранилище является постоянным хранилищем, которое Ethereum хранит на каждом узле в своей среде.
Память: это часто локальная память, доступная для каждой функции в рамках контракта. часто это недолговечная и мимолетная память, которая разрывается, когда функция завершает свое выполнение.
Данные вызова: здесь часто хранятся все входящие данные о выполнении функции, включая аргументы функции. . часто это неизменяемое место в памяти.

Стек: EVM поддерживает стек для загрузки переменных и промежуточных значений для работы с набором инструкций Ethereum. это часто память рабочего набора для EVM. Стек имеет глубину 1024 уровня в EVM, и если он хранит что-то подобное, он вызывает исключение. расположение информации о переменной зависит от следующих двух факторов:

  • Расположение объявления переменной
  • Тип данных переменной

Основываясь на двух предыдущих факторах, существуют правила, которые управляют и выбирают расположение информации о переменной. принципы упомянуты здесь. Расположение данных также влияет на то, как работает оператор присваивания. Как назначение, так и расположение данных объясняются с помощью правил, которые ими управляют.

Правило 1

Переменные, объявленные как переменные состояния, всегда хранятся в ячейке хранения данных.

Правило 2

Переменные, объявленные как параметры функции, всегда хранятся в ячейке данных памяти.

Правило 3

Переменные, объявленные в функциях, по умолчанию хранятся в ячейке данных памяти.
Однако есть несколько предостережений:
Местом для переменных типа значения является память внутри функции, в то время как по умолчанию для переменной ссылочного типа является хранение. Обратите внимание, что хранилище по умолчанию используется для переменных ссылочного типа, объявленных внутри функции. Однако его часто перекрывают. Переопределяя расположение по умолчанию, переменные ссылочных типов часто располагаются в расположении данных в памяти. Упомянутые ссылочные типы — это массивы, структуры и строки. Ссылочные типы, объявленные внутри функции без переопределения, должны указывать на переменную состояния. Переменные типа значения, объявленные во время функции, не могут быть переопределены и не могут быть сохранены в месте хранения. Сопоставления всегда объявляются в месте хранения. это говорит о том, что они не могут быть объявлены внутри функции. они не могут быть объявлены как типы памяти. Однако отображения во время функции могут запрашивать отображения, объявленные как переменные состояния.

Правило 4

Аргументы, передаваемые вызывающими объектами параметрам функции, всегда сохраняются во время расположения данных
данных вызова.

Правило 5

Присваивания переменных состояния из другой переменной состояния всегда создают заменяющую копию. Объявлены две переменные состояния типов значений stateVar1 и stateVar2.

Правило 6

Присвоения переменных хранения из другой переменной памяти всегда создают замещающую копию. жесткий и быстрый массив uint stateArray называется переменной состояния. В функции getUInt определяется и инициализируется фиксированный массив uint localArray, расположенный в области памяти. следующая строка кода назначает localArray для stateArray.

На данном этапе значения обеих переменных эквивалентны. следующая строка кода изменяет одно из значений в локальном массиве на 10 и возвращает элемент в эквивалентном месте из массива stateArray1.

Правило 7

Присваивания переменной памяти из другой переменной состояния всегда создают замещающую копию. переменная состояния типа value, stateVar произносится и инициализируется значением 20. В функции getUInt произносится переменная области типа uint и инициализируется значением 40.

Переменная stateVar присваивается переменной localVar. На данном этапе значения обеих переменных равны 20. Следующая строка кода изменяет значение stateVar на 50 и возвращает localVar.

Правило 8

Присваивания переменной памяти из другой переменной памяти не создают реплики для ссылочных типов; однако они создают заменяющую копию для типов значений.

Листинг кода, показанный на следующем снимке экрана, иллюстрирует, что переменные ссылочного типа в памяти копируются по ссылке. На значение otherVar влияют изменения в переменной someVar:

Для получения более подробной информации посетите: https://www.technologiesinindustry4.com/2021/05/how-to-store-and-locate-memory-data-in-solidity.html