Локальная переменная хранения

Я читаю здесь документацию по солидности и, кажется, изо всех сил пытаюсь понять следующее.

Местоположения данных важны, потому что они изменяют поведение присваиваний: присваивания между хранилищем и памятью, а также переменной состояния (даже из других переменных состояния) всегда создают независимую копию. Присвоения локальным переменным хранения присваивают только ссылку, и эта ссылка всегда указывает на переменную состояния, даже если последняя тем временем изменяется. С другой стороны, присвоение ссылочного типа, хранящегося в памяти, другому ссылочному типу, хранящемуся в памяти, не создает копии.

1)Разве переменная состояния не всегда хранится в хранилище? Итак, что вышеизложенное означает присваивания между хранилищем и памятью, а также переменной состояния?

2) Что такое локальная переменная хранения?

pragma solidity ^0.4.0;

contract C {

    uint state_variable; // same as global storage variable

    function test() returns uint{
        uint local_variable = 10; //same as local storage variable
        return local_variable * state_variable;
    }
}

Верно ли мое понимание выше? Есть ли способ узнать, находятся ли эти переменные в памяти или в хранилище, я смотрю дизассемблированные коды операций в remix IDE, но не могу их понять.

Спасибо!

Ответы (2)

Присвоение значения переменной может быть выполнено путем предоставления ссылки или создания независимой копии. Если это ссылка, когда исходная, назначенная переменной, изменяется, значение переменной также изменяется. Рассмотрим следующее,

a = 10 // value of a is 10
b = a // variable b is assigned a value
a = 20

если присваивание выше назначило ссылку, теперь значение b также будет равно 20. Если присвоение было выполнено путем создания независимой копии, значение b будет по-прежнему равно 10.

В документе Solidity говорится, что если назначение выполняется между хранилищем и памятью или назначение переменной состояния, оно всегда будет создавать независимую копию. Если это переменная локального хранилища, она будет только ссылкой.

Ссылаясь на пример, представленный в документах Solidity, локальная переменная хранения — это переменная, определенная внутри функции. (Область действия переменной ограничена функцией)

Помимо принятого ответа, я думаю, что необходимо также определить, какие местоположения данных.

Документация дает хорошее описание доступных местоположений данных .

Расположение данных

Каждый ссылочный тип имеет дополнительную аннотацию «местоположение данных» о том, где они хранятся. Имеется три местоположения данных: memory, storageи calldata. Данные вызова — это неизменяемая непостоянная область, в которой хранятся аргументы функции, и в основном она ведет себя как память. Это требуется для параметров внешних функций, но также может использоваться для других переменных.