¿Cómo combino números enteros para ahorrar gas en datos de transacciones y almacenamiento?

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?

Respuestas (1)

Costo de almacenamiento

¡Combinar datos de variables de menos de 32 bytes antes de almacenarlos es una buena idea! SSTOREes 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
Según tengo entendido, ¿un parámetro es más barato que dos parámetros?
Entendido, agregué una sección sobre el costo del gas por enviar parámetros en una transacción. Acepte si esto responde a su pregunta.
Muchas gracias, entiendo. Hago muchas pruebas, ahora decido guardar los dos parámetros en una estructura.