Si dos personas crean el mismo contrato inteligente, ¿se almacena dos veces?

Hay muchos casos en los que el mismo contrato se implementa muchas veces. Ahora, obviamente, cada contrato tiene su propio almacenamiento de datos persistente y todo, pero ¿el código de bytes de cada contrato también ocupa espacio varias veces en las computadoras de los nodos de Ethereum? ¿O hay algún mecanismo que deduplica el código del contrato y, en lugar de guardar todo el código una y otra vez, puede almacenarlo una vez y luego, en la creación posterior de un contrato idéntico, puede guardar algo como <same as contract 0xABC...>?

Respuestas (2)

Según mi conocimiento, el código de bytes se almacenará solo una vez. Llegué a esta conclusión de la sección 4.1 del libro amarillo.

El estado de la cuenta comprende los siguientes cuatro campos:

mientras tanto...

balance...

StorageRoot...

codeHash: el hash del código EVM de esta cuenta; este es el código que se ejecuta si esta dirección recibe una llamada de mensaje; es inmutable y, por lo tanto, a diferencia de todos los demás campos, no se puede cambiar después de la construcción. Todos estos fragmentos de código están contenidos en la base de datos estatal bajo sus hashes correspondientes para su posterior recuperación.

Si el hash del código de bytes de 2 contratos diferentes es el mismo, debe almacenarse en la base de datos estatal bajo este hash solo una vez. Al menos no hay razón para no implementarlo de esta manera. Para estar seguros, tendríamos que buscar en el código fuente de una implementación particular.

El software del nodo puede manejar esto como quiera. Supongo que solo lo almacenan una vez en su base de datos, pero el hash del código se almacenará en ambas ubicaciones.

Por supuesto, esto no brinda la posibilidad de ahorrar en gasolina durante la implementación, ya que todavía se le cobran 200 de gasolina por byte de código de contrato que implementa. Una buena solución para esto es un contrato de clonación/proxy que reenvía todas las llamadas/devoluciones a otra dirección de contrato mediante llamadas delegadas, lo que significa que ejecuta el código de otro contrato en el contexto de almacenamiento del contrato de clonación. Desarrollamos un contrato que hace esto en solo 96 bytes que se puede encontrar aquí .