¿Qué determina los costos de transacción (Remix)?

He revisado varias preguntas de SE relacionadas con este tema y no he visto una respuesta. En Remix , he creado dos archivos .sol separados. Los archivos se llaman file1.sol y file2.sol. El código para los dos archivos se ve así:

archivo1.sol

pragma solidity ^0.4.0;

contract MyFirstContract {

}

archivo2.sol

pragma solidity ^0.4.0;

contract MyOtherContract {

}

Cuando reviso los costos de transacción y ejecución, estoy un poco confundido. La parte que contra

          | transaction cost | execution cost |
file1.sol | 68926 gas        | 10862 gas      |
file2.sol | 68990 gas        | 10862 gas      |

¿Por qué los costos de transacción son diferentes cuando los contratos son prácticamente iguales? Al principio, sospeché que había un espacio adicional o algo más en el contrato. Sin embargo, comprobé que no era así. ¿Por qué hay diferentes costos de transacción en estos dos contratos?

No pude reproducir tal comportamiento. La versión actual en remix.ethereum.org siempre indica el costo de tx: 68990 gas, costo de ejecución: 10862 gas. Independientemente del nombre del archivo o nombre del contrato.
como @Ismael, tampoco puedo reproducir sus resultados para el primer archivo, obtengo 68990 para ambos. Compruebe si no ha cambiado el compilador mientras lo intentaba. Le propongo que pase las instrucciones de códigos de operación generadas por el compilador (modo de depuración).
Lo intenté de nuevo y pude confirmar los valores que ingresé. Sigo viendo los diferentes costos de gasolina.

Respuestas (1)

Puedo reproducir esto con la versión del compilador 0.4.12+commit.194ff033.Emscripten.clang (pero, en mi caso, al revés: file1.sol tiene un costo de implementación de 68990, file2.sol tiene un costo de implementación de 68926. )

Hay una diferencia de 64 gases en el costo entre las dos implementaciones. La razón de esto es que, aunque el código de implementación tiene exactamente la misma longitud (82 bytes), uno de los conjuntos de códigos de bytes tiene un byte cero en un lugar donde el otro tiene un byte distinto de cero.

Al transmitir una transacción a la cadena de bloques, el costo del gas por byte de calldata es 68 para bytes distintos de cero y 4 para bytes cero (Apéndice G del Libro amarillo , G_txdatanonzero vs. G_txdatazero ). De ahí la diferencia de 68 - 4 = 64 gases entre sus códigos.

El byte diferente en realidad ocurre en la sección de metadatos del contrato adjunto , no en el código de implementación o el código implementado en sí mismo, que son idénticos para ambos ejemplos, como cabría esperar. Las siguientes son las secciones de metadatos para los contratos: el compilador genera automáticamente los metadatos y comprende un hash de Swarm del contenido del archivo fuente más algunos otros fragmentos:

a165627a7a72305820176535c2c0a4a3ac4a26111bf3f9aa4ab0fa5db14d592f8574bf15f1f42f46420029
a165627a7a723058204e0a27613ab151031db65041c0e2ff84bf88842fd7b2cc00163bc9af9acd05230029
                          zero/non-zero byte difference is here ^^

Por lo tanto, con dos archivos de origen casi idénticos, tiene alguna posibilidad de que haya una diferencia en el costo de implementación debido a esto, y depende de la versión del compilador, ya que la versión del compilador está incrustada en los datos utilizados para crear el hash Swarm.

Gracias por su respuesta. ¿Puede decirme si el costo de la transacción está relacionado con el tamaño del texto del contrato (es decir, el código)? ¿O el costo de la transacción está determinado por el tamaño del contrato compilado? Supongo que esto último. Sin embargo, no estoy 100% seguro.
En este caso, el tamaño del contrato compilado (el código de bytes). Sus hallazgos anteriores se relacionan con la implementación del contrato, es decir, la transacción que envía el código de bytes del contrato a la cadena de bloques y lo almacena allí. Las transacciones posteriores que llaman métodos en el contrato no están relacionadas con el tamaño del contrato.