contract A {
uint8 a = 0;
}
cuesta 20150 + 2000 de gas durante la creación.
en comparación con
contract A {
uint a = 0; // or uint256
}
costando 5050 + 2000 de gas durante la creación
Es extraño que una variable que ocupa menos espacio de almacenamiento cueste más gasolina. ¿Por qué es así?
El EVM funciona con palabras de 256 bits/32 bytes (decisión de diseño discutible). Cada operación se basa en estas unidades base. Si sus datos son más pequeños, se necesitan más operaciones para reducir la escala de 256 bits a 8 bits, por lo que verá un aumento de los costos.
Por cierto, si cambia los "Detalles" en el compilador de solidez en línea, le dará el volcado de ensamblaje exacto de donde provienen los códigos de operación adicionales. No tuve tiempo ahora para interpretarlos, pero si lo hace y descubre que hay algo adicional, estoy seguro de que el equipo de Solidity estará feliz de agregar optimizaciones para solucionarlos.
Sin embargo, debe tenerse en cuenta que en una estructura, uint8 SÍ cuesta menos que un uint tradicional, debido a la función de empaquetado ajustado. También asegúrese de que sus unidades estén junto a sus otras unidades, y bytes junto a bytes, etc. Esto aumenta aún más las características compactas.
struct
debería uints
definirse uno tras otro en otros tipos también y ¿por qué? @VoR0220SOLC 0.4.18: ahora la diferencia es pequeña
https://ethfiddle.com/6lt852gx7K
Contrato A usando uint8
costos 75414 para implementar
Contrato B usando uint256
costos 73867 para implementar
Una diferencia de 1547 gas.
Actualización en diciembre de 2021:
Si prueba algo como esto: 5 variables en lugar de solo 1, lo que podría parecerse más a un escenario del mundo real con múltiples variables, no solo una.
contract A {
uint8 a = 0;
uint8 b = 0;
uint8 c = 0;
uint8 d = 0;
uint8 e = 0;
}
Entonces es más barato que su versión uint256.
De la remezcla:
uint8: 69484gas uint256: 78420gas
Actualización junio 2022 (0.8.15)
uint8: 83524gas uint256: 90183gas
Entonces, ahorra en gasolina usando uint de menor tamaño, como dicen otros comentarios, si esos son arreglos, ahorra más.
uzyn
uint256
. Siguiente pregunta Me pregunto si entonces siempre tiene sentido apegarse a uint256 y nunca más pequeño.nick johnson
alper
uint32
dentro de a enstruct
lugar deuint256
y la insertamos en una matriz, cuesta mucho menos gasolina.