13. Memory vs Storage

Hay ciertas formas de manipular los datos dentro de las blockchains y cada una de ellas se realiza de diferentes maneras por parte del minero que ejecutará el contrato, esto implica diferentes costos de gas.

# Storage

Datos que persistirán en la Blockchain y se almacenarán por tiempo indefinido (o definido) dentro de los registros distribuidos entre todos los nodos de la red.

Toda variable definida fuera de las funciones se almacenará de esta manera por defecto. Las variables dentro de las funciones necesitan del parámetro storage para poder escritas en la blockchain.

contract miContrato {
  uint a;
  string x;

  function ejemploFunc() {
    string storage ejemplo;
  }
}

# Memory & Calldata

Este tipo de almacenamiento será temporal solo durante el tiempo de ejecución, es decir, estos datos solo existirán mientras se esté ejecutando la función o instrucción. No se almacenarán datos almacenados en variables de tipo memory o calldata. Hay una diferencia relevante entre ambas operaciones y a continuación veremos cuándo utilizar una u otra.

# memory: Puede ser alterada

Cuando pasamos parámetros a una función y usamos la memoria como indicador del tipo de almacenamiento, podemos cambiar estos datos dentro de la función si así lo deseamos.

function memoryTest(string memory _ejemploTexto) public returns (string memory) {
  _ejemploTexto = "Dato Alterado";
  return _ejemploTexto;
}

# calldata: No puede ser alterada

Cuando usamos calldata, no tenemos permisos para cambiar los datos que se pasaron a la función.

function calldataTest(string calldata _datoEjemplo) external returns (string memory) {
  // No podemos alterarlo, pero sí retornarlo.
  return _datoEjemplo;
}

# Costos: Storage vs Memory vs Calldata

Storage es el más caro ya que almacena los datos dentro de la Blockchain, seguido de memory que es mucho más económico ya que no almacena nada pero usa más OPCODES que calldata, que resulta ser el más barato de todos los tipos de almacenamiento.

Last Updated: 9/10/2022, 4:27:54