Локальная переменная и переменная состояния, а также разница между ними

Я новичок в солидности. Когда я читаю документацию по Solidity , там говорится о локальной переменной и переменной состояния . Но я не могу найти определение этих двух терминов.

Может ли кто-нибудь объяснить значение локальной переменной и переменной состояния, а также разницу между ними.

Ответы (2)

Переменные состояния

Из документов Solidity здесь ,

Переменные состояния — это значения, которые постоянно хранятся в хранилище контрактов.

и может быть объявлено в контракте следующим образом:

contract SimpleStorage {
    uint storedData; // State variable
    // ...
}

Локальные переменные

Несет обычное значение, что их контекст находится внутри функции и не может быть доступен снаружи. Обычно это переменные, которые мы создаем временно для хранения значений при вычислении или обработке чего-либо. Локальные переменные (структуры, массива или сопоставления) ссылаются на хранилище, как указано здесь , локальная переменная будет действовать как псевдоним для уже существующей в хранилище. Проверьте приведенный ниже пример, чтобы понять, что происходит.

Распространенная ошибка — объявить локальную переменную и предположить, что она будет создана в памяти, хотя она будет создана в хранилище:

/// THIS CONTRACT CONTAINS AN ERROR



 pragma solidity ^0.4.0;

    contract C {
        uint someVariable;
        uint[] data;

        function f() {
            uint[] x;
            x.push(2);
            data = x;
        }
    }

Тип локальной переменной x — uint[] storage, но поскольку хранилище не выделяется динамически, перед использованием его необходимо назначить из переменной состояния. Таким образом, для x не будет выделено место в памяти, а вместо этого он будет функционировать только как псевдоним для уже существующей переменной в памяти .

Что произойдет, так это то, что компилятор интерпретирует x как указатель хранилища и заставит его указывать на слот хранения 0 по умолчанию. Это приводит к тому, что параметр someVariable (находящийся в слоте хранения 0) модифицируется с помощью x.push(2).

Правильный способ сделать это следующий:

pragma solidity ^0.4.0;

    contract C {
        uint someVariable;
        uint[] data;

        function f() {
            uint[] x = data;
            x.push(2);
        }
    }

Значения по умолчанию для места хранения

Вот значения по умолчанию для места хранения в зависимости от того, к какому типу переменной оно относится ( источник ):

  • переменные состояния всегда находятся в памяти

  • аргументы функции по умолчанию находятся в памяти

  • локальные переменные структуры, массива или хранилища ссылок типа сопоставления по умолчанию

  • локальные переменные типа значения (т.е. ни массив, ни структура, ни отображение) не хранятся в стеке

Меня смущает, что локальные переменные всегда ссылаются на хранилище. Как вы упомянули, обычно это переменные, которые мы создаем временно для хранения значений при вычислении или обработке чего-либо . Я не думаю, что мне нужно эталонное хранилище. Можете ли вы объяснить связь между локальными переменными и переменными хранения/памяти? Заранее спасибо.
Я обновил ответ, проверьте, понятно ли вам сейчас
Переменная Storage/Memory/Stack — это физическая концепция, а переменная Local/State — логическая концепция. Это правильно?
Storage, Memory, stack — место, где хранится переменная, Local/State определяет и область видимости, и место в солидности

простыми словами: все о прицелах

мы рассматриваем как состояния все переменные, определенные вне области действия определенных функций (мы можем рассматривать их как глобальные переменные), тогда как локальные переменные — это остальные: аргументы функции и переменные, объявленные в пределах области действия функции. как вы знаете, у каждого метода есть своя совершенно новая область.

В соответствии с дизайном указано, что он постоянно хранится в хранилище контракта.

Как вы показали здесь, есть некоторая путаница, локальные переменные хранятся в памяти, тогда как в документации Solidity указано, что (default for local variables is storage and the location is forced to storage for state variables) solidity.readthedocs.io/en/v0.4.21/types.html#data-location