Я новичок в солидности. Когда я читаю документацию по Solidity , там говорится о локальной переменной и переменной состояния . Но я не могу найти определение этих двух терминов.
Может ли кто-нибудь объяснить значение локальной переменной и переменной состояния, а также разницу между ними.
Переменные состояния
Из документов 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); } }
Значения по умолчанию для места хранения
Вот значения по умолчанию для места хранения в зависимости от того, к какому типу переменной оно относится ( источник ):
переменные состояния всегда находятся в памяти
аргументы функции по умолчанию находятся в памяти
локальные переменные структуры, массива или хранилища ссылок типа сопоставления по умолчанию
локальные переменные типа значения (т.е. ни массив, ни структура, ни отображение) не хранятся в стеке
простыми словами: все о прицелах
мы рассматриваем как состояния все переменные, определенные вне области действия определенных функций (мы можем рассматривать их как глобальные переменные), тогда как локальные переменные — это остальные: аргументы функции и переменные, объявленные в пределах области действия функции. как вы знаете, у каждого метода есть своя совершенно новая область.
В соответствии с дизайном указано, что он постоянно хранится в хранилище контракта.
(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
дингданг
Ачала Диссанаяке
дингданг
Ачала Диссанаяке