La mayoría de los gastos de gas de Ethereum se concentran en el almacenamiento. Cada operación que cambia el estado (almacenamiento) de la red Ethereum suele ser costosa. Como resultado, concentrarse en cómo se conservan y se puede acceder a los datos puede generar importantes reducciones de costos. En esta sesión, veremos algunas formas de optimizar el almacenamiento con Remix.
La cadena de bloques Ethereum proporciona almacenamiento permanente. Todo lo guardado en la cadena de bloques estará disponible mientras la cadena de bloques sobreviva, pero esta permanencia tiene un costo. La optimización del almacenamiento no solo reduce los costos sino que también garantiza que el estado global de Ethereum se utilice de manera eficiente.
Solidity almacena variables en ranuras. Cada ranura tiene 32 bytes. Cuando las variables caben en una sola ranura, se pueden leer o actualizar con una sola operación SLOAD o SSTORE, respectivamente.
Consideremos dos contratos:
Solidez
// Sin optimización
pragma solidez ^0.8.9;
contratos de almacenamiento no optimizado {
uint256 public value1;
uint256 public value2;
}
Solidez
// Con optimización
pragma solidez ^0.8.9;
contratos de almacenamiento optimizado {
uint128 public value1;
uint128 public value2;
}
Implemente ambos contratos en Remix y observe las diferencias de gas al interactuar con sus variables.
En la versión optimizada, tanto value1
como value2
comparten una única ranura de 32 bytes.
Cuando haya terminado con una ranura de almacenamiento, especialmente el almacenamiento de datos temporal, puede eliminar o poner a cero la ranura para obtener un reembolso de gasolina.
Solidez
pragma solidez ^0.8.9;
contrato RefundExample {
uint256 public temporalData;
función storeTemporaryData(uint256 datos) público {
temporaryData = data;
}
función clearTemporaryData() público {
delete temporaryData;
}
}
Implemente este contrato en Remix.
Almacene algunos datos temporales y luego bórrelos.
Consulta el costo del gas. Observe el reembolso de gasolina que recibe por la operación delete
.
Si no es necesario acceder a los datos en cadena, considere registrarlos como un evento en lugar de almacenarlos. Los eventos son mucho más baratos que las operaciones de almacenamiento.
Solidez
pragma solidez ^0.8.9;
contrato EventExample {
evento DataStored(uint256 datos);
función storeData (datos uint256) público {
emit DataStored(data);
}
}
Implemente e interactúe con el contrato en Remix.
Tenga en cuenta los costos de gas más baratos en comparación con el almacenamiento.
Es fundamental practicar ahora que domina algunos enfoques fundamentales de optimización del almacenamiento. Participe en los ejemplos ofrecidos y experimente creando los suyos propios. En la siguiente sesión, profundizaremos en la optimización de la visibilidad de funciones y la reutilización de código con bibliotecas. Tenga en cuenta que la optimización es tanto un arte como una ciencia. ¡Continúa experimentando!
La mayoría de los gastos de gas de Ethereum se concentran en el almacenamiento. Cada operación que cambia el estado (almacenamiento) de la red Ethereum suele ser costosa. Como resultado, concentrarse en cómo se conservan y se puede acceder a los datos puede generar importantes reducciones de costos. En esta sesión, veremos algunas formas de optimizar el almacenamiento con Remix.
La cadena de bloques Ethereum proporciona almacenamiento permanente. Todo lo guardado en la cadena de bloques estará disponible mientras la cadena de bloques sobreviva, pero esta permanencia tiene un costo. La optimización del almacenamiento no solo reduce los costos sino que también garantiza que el estado global de Ethereum se utilice de manera eficiente.
Solidity almacena variables en ranuras. Cada ranura tiene 32 bytes. Cuando las variables caben en una sola ranura, se pueden leer o actualizar con una sola operación SLOAD o SSTORE, respectivamente.
Consideremos dos contratos:
Solidez
// Sin optimización
pragma solidez ^0.8.9;
contratos de almacenamiento no optimizado {
uint256 public value1;
uint256 public value2;
}
Solidez
// Con optimización
pragma solidez ^0.8.9;
contratos de almacenamiento optimizado {
uint128 public value1;
uint128 public value2;
}
Implemente ambos contratos en Remix y observe las diferencias de gas al interactuar con sus variables.
En la versión optimizada, tanto value1
como value2
comparten una única ranura de 32 bytes.
Cuando haya terminado con una ranura de almacenamiento, especialmente el almacenamiento de datos temporal, puede eliminar o poner a cero la ranura para obtener un reembolso de gasolina.
Solidez
pragma solidez ^0.8.9;
contrato RefundExample {
uint256 public temporalData;
función storeTemporaryData(uint256 datos) público {
temporaryData = data;
}
función clearTemporaryData() público {
delete temporaryData;
}
}
Implemente este contrato en Remix.
Almacene algunos datos temporales y luego bórrelos.
Consulta el costo del gas. Observe el reembolso de gasolina que recibe por la operación delete
.
Si no es necesario acceder a los datos en cadena, considere registrarlos como un evento en lugar de almacenarlos. Los eventos son mucho más baratos que las operaciones de almacenamiento.
Solidez
pragma solidez ^0.8.9;
contrato EventExample {
evento DataStored(uint256 datos);
función storeData (datos uint256) público {
emit DataStored(data);
}
}
Implemente e interactúe con el contrato en Remix.
Tenga en cuenta los costos de gas más baratos en comparación con el almacenamiento.
Es fundamental practicar ahora que domina algunos enfoques fundamentales de optimización del almacenamiento. Participe en los ejemplos ofrecidos y experimente creando los suyos propios. En la siguiente sesión, profundizaremos en la optimización de la visibilidad de funciones y la reutilización de código con bibliotecas. Tenga en cuenta que la optimización es tanto un arte como una ciencia. ¡Continúa experimentando!