Variable local y variable de estado, y la diferencia entre ellas

Soy nuevo en solidez. Cuando leo la documentación de solidez , dice variable local y variable de estado . Pero no puedo encontrar la definición de los dos términos.

¿Alguien puede explicar el significado de variable local y variable de estado, y la diferencia entre ellos?

Respuestas (2)

Variables de estado

De los documentos de solidez aquí ,

Las variables de estado son valores que se almacenan permanentemente en el almacenamiento de contratos.

y puede declararse en un contrato de la siguiente manera,

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

Variables locales

Tiene el significado habitual, que su contexto está dentro de una función y no se puede acceder desde fuera. Por lo general, estas son las variables que creamos temporalmente para mantener valores al calcular o procesar algo. Las variables locales (de estructura, matriz o mapeo) hacen referencia al almacenamiento como se indica aquí , la variable local actuará como un alias para una preexistente en el almacenamiento. Consulte el ejemplo citado a continuación para comprender lo que sucede.

Un error común es declarar una variable local y asumir que se creará en la memoria, aunque se creará en el almacenamiento:

/// 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;
        }
    }

El tipo de la variable local x es almacenamiento uint[], pero dado que el almacenamiento no se asigna dinámicamente, debe asignarse desde una variable de estado antes de poder usarse. Por lo tanto, no se asignará espacio en el almacenamiento para x, sino que funcionará solo como un alias para una variable preexistente en el almacenamiento .

Lo que sucederá es que el compilador interpreta x como un puntero de almacenamiento y hará que apunte a la ranura de almacenamiento 0 de forma predeterminada. Esto tiene el efecto de que someVariable (que reside en la ranura de almacenamiento 0) es modificada por x.push(2).

La forma correcta de hacerlo es la siguiente:

pragma solidity ^0.4.0;

    contract C {
        uint someVariable;
        uint[] data;

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

Valores predeterminados para la ubicación de almacenamiento

Estos son los valores predeterminados para la ubicación de almacenamiento según el tipo de variable de que se trate ( fuente ):

  • las variables de estado siempre están almacenadas

  • los argumentos de la función están en la memoria por defecto

  • almacenamiento de referencia de variables locales de estructura, matriz o tipo de asignación de forma predeterminada

  • las variables locales de tipo de valor (es decir, ni matriz, ni estructura ni mapeo) se almacenan en la pila

Estoy confundido de que las variables locales siempre hagan referencia al almacenamiento. Como mencionó, por lo general, estas son las variables que creamos temporalmente para contener valores al calcular o procesar algo . No creo que necesite almacenamiento de referencia. ¿Puede explicar la relación entre las variables locales y las variables de almacenamiento/memoria? Gracias por adelantado.
Actualicé la respuesta, mira si te quedó claro ahora
La variable Storage/Memory/Stack es el concepto físico, y la variable Local/State es el concepto lógico. ¿Es correcto?
Almacenamiento, Memoria, pila es el lugar donde se almacena la variable, Local/Estado define tanto el alcance como el lugar en solidez

en términos simples: se trata de los alcances

consideramos como estados todas las variables definidas fuera del alcance de las funciones definidas (podemos considerarlas como variables globales) mientras que las variables locales son el resto: argumentos de funciones y variables declaradas dentro del alcance de las funciones. como saben, cada método tiene su propio alcance completamente nuevo.

Por diseño, establece como almacenado permanentemente en el almacenamiento del contrato

Existe cierta confusión, como se muestra aquí, las variables locales se almacenan en la memoria, mientras que la documentación de Solidity indica que (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