¿Dónde se almacenan las variables locales de tipos de datos primitivos (elementales) en Solidity?

Aunque en las últimas versiones del compilador de solidity, se ha dejado claro que para las variables de referencia locales a una función, ahora se debe mencionar explícitamente su modificador de ubicación (memoria, almacenamiento), eliminando así toda la confusión sobre su naturaleza predeterminada.

Pero aún no está claro dónde están almacenadas todas las variables locales definidas como uint, uint8, bool, address, enum, etc. ¿Está almacenado en el almacenamiento, la memoria o la pila?

Respuestas (2)

Los tipos escalares primitivos:

  • bool
  • uint
  • DIRECCIÓN
  • etc.

residen en el almacenamiento cuando se declaran globalmente, y en la memoria cuando se declaran en funciones.

contract Locations {

  // storage
  bool switch;
  uint number;
  address account;

  function doSomething() public pure {
    // memory
    bool switch2;
    uint number2;
    address account2;
  }
}

Espero eso ayude.

¿Tenemos alguna fuente creíble que cite esto, o se menciona en la documentación de solidez en alguna parte? Escuché de algunas fuentes que algunos tipos de datos primitivos locales pueden incluso almacenarse en la pila.
No creo que sea posible hacer referencia explícita a valores en la pila fuera del ensamblaje. Todas las operaciones usan la pila, por lo que implícitamente ponemos valores en ella y los quitamos todo el tiempo, pero esto está oculto para nosotros mediante el uso de Solidity. Todas las variables declaradas están en memory, storageo calldata(creo calldataque solo se especifica para argumentos en externalllamadas a funciones, msg.datatambién se conoce como calldata).

Las variables se pueden almacenar de 3 maneras en solidez: almacenamiento, memoria y pila.

Almacenamiento: El almacenamiento es donde residen todas las variables de estado del contrato. Cada contrato tiene su propio almacenamiento y es persistente entre llamadas de función y bastante costoso de usar.

Memoria: la memoria es más barata de usar ya que almacena valores temporalmente. Se borra entre llamadas a funciones externas. La memoria no es persistente.

Pila: Casi de uso gratuito. La pila se puede usar para contener pequeñas variables locales, pero solo limitadas en número.

Los tipos de variables complejas, que no siempre caben en 256 bits, deben manejarse con cuidado. Por ejemplo, las matrices y las estructuras tienen una anotación adicional, denominada "ubicación de datos", que indica dónde se almacenan en la memoria o en el almacenamiento.

Entonces, puedes usar el siguiente concepto:

Ubicación de datos forzada:

  • parámetros (no retorno) de funciones externas: calldata

  • variables de estado: almacenamiento

Ubicación de datos predeterminada:

  • parámetros (también retorno) de funciones: memoria

  • todas las demás variables locales: almacenamiento

Además, eche un vistazo a: Almacenamiento y memoria - Solidity Docs

no aclara dónde se almacenan los tipos de datos primitivos.