Graduación

1

Proyectos desarrollados por los estudiantes

Introducción al Ethereum Developer Program

2

¿Cómo convertirse en blockchain developer?

3

¿Qué es el Ethereum Developer Program?

4

Ethereum Developer Program: Plan de Contenido

5

Ethereum Developer Program: Guía de estudio

Semana 1: Importancia del Manejo de Memoria

6

Importancia del Manejo de Memoria

7

Importancia del Manejo de Memoria: Actividades

8

Cómo se almacenan los datos en Ethereum

Semana 2: Web3-react

9

Salto de Web2 a Web3: React

10

Salto de Web2 a Web3: Actividades

11

Web3 Stack

12

¿Qué es Web3-React y cómo usarlo en tu próximo proyecto?

Semana 3: Ethereum Virtual Machine y Criptografía

13

Infraestructura y Funcionamiento de la Ethereum Virtual Machine

14

Fundamentos de Criptografía y EVM

15

Criptografía y Funcionamiento de la Ethereum Virtual Machine: Actividades

Semana 4: Creando tu primer Smart Contract

16

Crea tu primer smart contract

17

Crea tu primer smart contract: Actividades

Semana 5: Solidity

18

Aprendiendo Solidity desde cero

Superando la primera etapa del Ethereum Developer Program

19

RETO: NFT dinámicos con datos Off Chain

Semana 6: Tokens y Tokenización

20

Tokens y Tokenización

Semana 7: Testing Tools y Despliegue

21

Testing Tools y Despliegue: Actividades de la semana

22

Testing Tools y Despliegue

Semana 9: Auditoría y Seguridad de Smart Contracts

23

Auditoría y Seguridad de Smart Contracts

24

Auditoria y Seguridad de Smart Contracts: Resumen y actividades

Semana 10: Integraciones en Web3: Web3.js vs. Ether.js

25

Integraciones en Web3: Web3.js Vs Ether.js

Semana 11: Monetización para Blockchain Developers

26

Monetización para Blockchain Developers

Recursos Adicionales

27

Consideraciones de seguridad para smart contracts

28

Memory vs. Storage en Solidity

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

11 Días
21 Hrs
8 Min
22 Seg

Memory vs. Storage en Solidity

28/28

Lectura

Solidity tiene 2 palabras reservadas para el almacenamiento de datos: memory y storage. Como desarrollador es importante que conozcas las diferencias entre ellas y cuando debes usar una u otra.

De acuerdo con la documentación de Solidity, estas dos palabras clave se utilizan para referenciar tipos de datos donde…

Los tipos complejos, es decir, los tipos que no siempre caben en 256 bits, deben manejarse con más cuidado que los tipos de valor que ya hemos visto. Dado que copiarlos
puede ser bastante costoso, debemos pensar si queremos que se almacenen en memory -memoria- (que no es persistente) o en storage -almacenamiento-
(donde las variables de estado son preservadas).

Cada tipo complejo, es decir, matrices y estructuras, tiene una anotación adicional, la “ubicación de datos”, sobre si se almacena en la memoria o en el almacenamiento.

Ahora es importante ver dónde la Ethereum Virtual Machine (EVM) almacena datos:

La máquina virtual Ethereum tiene tres áreas donde puede almacenar elementos.

El primero es “storage” -almacenamiento-, 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.

El segundo es “memory” -memoria-, se utiliza para almacenar valores temporales. Se borra entre llamadas de funciones (externas) y es más barato de usar.

El tercero es “stack”, que se utiliza para contener pequeñas variables locales. Es de uso casi gratuito, pero solo puede contener una cantidad limitada de valores.

Más importante,

Si, por ejemplo, se pasan tales variables en llamadas a funciones, sus datos no se copian si pueden permanecer en la memoria o en el almacenamiento.

Aquí es donde se vuelve confuso, pero ten presente los siguientes puntos:

  1. Las palabras clave storage y memory se utilizan para hacer referencia a datos en el almacenamiento y la memoria, respectivamente.
  2. El almacenamiento del contrato se asigna previamente durante la construcción del contrato y no se puede crear en la llamada de una función. Después de todo, tiene poco sentido crear una nueva variable en el almacenamiento de una función si se va a conservar.
  3. La memoria no se puede asignar durante la construcción del contrato, sino que se crea en la ejecución de una función. La variable de estado del contrato siempre se declara en el almacenamiento. Nuevamente, tiene poco sentido tener una variable de estado que no pueda persistir.
  4. Cuando asignamos una variable con referencia memory a partir de una variable de referencia de storage, estamos copiando datos de la memoria al almacenamiento. No se crea ningún nuevo almacenamiento.
  5. Cuando asignamos una variable con referencia storage a partir de una variable con referencia a memory, estamos copiando datos del almacenamiento a la memoria. Se asigna nueva memoria.
  6. Cuando una variable de storage se crea en función localmente mediante la búsqueda, simplemente hace referencia a los datos ya asignados en el almacenamiento. No se crea ningún nuevo almacenamiento.

Para recapitular, volvamos a la documentación:

"Ubicación de datos forzada:

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

  • variables de estado: storage

Ubicación de datos predeterminada:

  • parámetros (devueltos) de funciones: memory

  • todas las otras variables locales: storage"

Podemos cambiar la ubicación de los datos solo para parámetros de funciones y variables locales en función. Cada vez que una referencia de storage se envía a memory, se realiza una copia y la modificación adicional en el objeto no se propaga de nuevo al estado del contrato. Datos con referencia memory solo se puede “asignar” a storage si los datos de la memoria se pueden copiar a una variable de estado preasignada.


Veamos algunos ejemplos para ilustrar mejor lo visto anteriormente.

Empecemos viendo el caso de algunos getters.

function getUsingStorage(uint _itemIdx)
public
// definir como non-view para calcular gas
// view
returns (uint)
{
Item storage item = items[_itemIdx];
return item.units;
}

function getUsingMemory(uint _itemIdx)
public
// definir como non-view para calcular gas
// view
returns (uint)
{
Item memory item = items[_itemIdx];
return item.units;
}

Ambas funciones devuelven el mismo resultado, excepto que en getUsingMemory se crea una nueva variable y se usa más gas:

// getUsingStorage
"gasUsed": 21849

// getUsingMemory
"gasUsed": 22149

Por otro lado, para los setters:

function addItemUsingStorage(uint _itemIdx, uint _units)
public
// definir como non-view para calcular gas
// view
{
Item storage item = items[_itemIdx];
item.units += _units;
}

function addItemUsingMemory(uint _itemIdx, uint _units)
public
// definir como non-view para calcular gas
// view
{
Item memory item = items[_itemIdx];
item.units += _units;
}

Solo addItemUsingStorage modifica la variable de estado (consumiendo más gas):

// addItemUsingStorage
// `units` cambia en `items`
"gasUsed": 27053

// addItemUsingMemory
// `units` no cambia en `items`
"gasUsed": 22287

Para concluir, los puntos más importantes son:

  1. memory y storage especifica a qué ubicación de datos se refiere la variable.
  2. No se puede crear una nueva variable con referencia a storage en una función. Cualquier variable con referencia a storage en una función siempre hace referencia a un dato preasignado en el almacenamiento del contrato (variable de estado). Cualquier mutación persiste después de la llamada a la función.
  3. Nuevas variables con referencia a memory solo se pueden crear en una función. Pueden ser tipos complejos instanciados recientemente como arrays o structs (por ejemplo, a través de new int[…]) o copiados desde una variable de storage.
  4. Como las referencias se pasan internamente a través de los parámetros de la función, recuerde que están predeterminadas a memory y, si la variable estuviera en storage, se crearía una copia y cualquier modificación no persistiría.

💡 Para mayor referencia, visita el texto original “Ethereum Solidity: Memory vs Storage & When to Use Them.

Aportes 2

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Resumen

Almacenamiento de datos vía palabras reservadas en Solidity: memory y storage

Item storage item = items[_itemIdx];
Item memory item = items[_itemIdx];

Mediante el uso de estas palabras reservadas en nuestro script le decimos al a EVM la forma en que queremos guardar ciertos datos:

  • temporalmente (memory), se borran con el llamado de la función. Barato.
  • persistente a las llamadas (storage) y es más costoso. Actualiza estado de las variables del contrato.

También está el stack que guarda pequeñas variables locales. Sólo puede guardar una cantidad limitada de valores.

Te lo resumo así

**Storage variables **se refiere a las variables almacenadas permanentemente en la cadena de bloques. Las variables de estado (variables declaradas fuera de las funciones) se almacenan por defecto y se escriben permanentemente en la cadena de bloques.

Memory variables son temporales y se borran entre llamadas a funciones externas a su contrato. Las variables declaradas dentro de las funciones son de tipo memory y desaparecerán cuando finalice la llamada a la función.

La palabra clave acá es que una permanece en la blockchain (storage) vrs otra que solo mientras corra algún evento/function (memory)