Por ejemplo, tengo dos enteros: uno es uint128, otro es uint64. Quiero almacenar esos dos enteros convirtiéndolos en bytes24. Y cuando los uso, analizo los bytes24 a uint128 y uint64.
¿Cómo hago esto?
Costo de almacenamiento
¡Combinar datos de variables de menos de 32 bytes antes de almacenarlos es una buena idea! SSTORE
es muy caro a 20 kilogas por palabra EVM (32 bytes). Afortunadamente, Solidity hará esto por ti bajo el capó si compilas con solc --optimize
. Consulte la sección "Más optimización" de este artículo sobre EVM para saber cómo funciona. También podría dejar que el compilador haga el trabajo por usted.
Costo de datos de transacción
Enviar los parámetros por separado tiene su propio costo de gas. Sin embargo, esto no debería estar en la parte superior de su lista de preocupaciones: solo cuesta 68 de gas por byte distinto de cero. Eso parece mucho para un uint completo de 32 bytes, pero si está pasando valores más pequeños, tendrán muchos ceros (solo tienen un precio de 4 gas por byte).
Resulta que solo ahorraría 128 gas en costos de datos de transacción al combinar los campos, porque solo está reduciendo la cantidad de ceros que envía, que son baratos. Ese gas ahorrado ni siquiera incluye el costo adicional de dividir los datos nuevamente en Solidity. Claramente, esto no vale la pena y probablemente tenga un efecto neto negativo en los costos de la gasolina.
Sin combinar los campos:
fieldA = 0x00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
fieldB = 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF
transaction non-zero bytes = (128 + 64) / 8 = 24
transaction zero bytes = (128 + 192) / 8 = 40
gas cost for parameters = 68 * 24 + 4 * 40 = 1792
Con la combinación de los campos:
fieldC = 0x0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
transaction non-zero bytes = (128 + 64) / 8 = 24
transaction zero bytes = 64 / 8 = 8
gas cost for parameters = 68 * 24 + 4 * 8 = 1664
kevin
tallista
kevin