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?
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
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
(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
dingdang
Achala Dissanayake
dingdang
Achala Dissanayake