Supongamos que escribí un contrato en Solidity que actualmente está siendo ejecutado por varios nodos. Por alguna razón, hice un cambio – código o configuration o ambos. ¿Cómo sé que todos los nodos que ejecutan este contrato ejecutan la última versión del código?
Por el contrario, si el contrato se colocó en un repository abierto (por ejemplo, GitHub), ¿cómo sé que el código no fue alterado?
¿Qué sucede si la mayoría de los nodos decidieron alterar el código y ejecutar esa versión?
Está organizado en líneas completamente diferentes.
El bytecode del contrato (generalmente de un comstackdor), no la fuente, es parte de la cadena de bloques. es indiferente a los canales de distribución tradicionales.
La existencia del contrato es parte de la historia compartida de la cadena, porque el bytecode era (parte de) una transacción específica que implementó el contrato. Dicha transacción de deployment también es parte de la historia inmutable de la cadena.
Los nodos no tienen mucha latitud. No pueden decidir qué versión quieren ejecutar. O ejecutan el código real o dejan de formar parte del consenso.
Entonces, básicamente, usted sabe que todos los nodos ejecutan el contrato que implementó, con pocas excepciones (si las hay). Es la única interpretación correcta de la cadena.
Espero eso ayude.
No hay una "última" versión. Básicamente, no puedes hacer un "cambio" en el código implementado. Continúe leyendo si realmente necesita que su DApp sea actualizable.
Cuando comstack su código fuente de Solidity en el código de byte EVM, lo despliega en la cadena de bloques (gastando un poco de Ether), y espera a que se mine la transacción, se repara el progtwig DApp. Durante el time de ejecución, la única forma que podría hacer un cambio en el estado de DApp es invocar una function pública del contrato.
Puede hacer uso del hecho anterior para hacer su DApp actualizable:
Cat
) que tenga algunas funciones abstractas ( meow
) que desee que sean actualizables Shorthair
) que implemente la interfaz ( contract Shorthair is Cat
) Shorthair
) Definir otro contrato ( FunMaker
)
address catAddress
( address catAddress
)
address
catAddress
Cuando desee llamar a la function actualizable ( meow
), haga esto:
Cat cat = Cat(catAddress) cat.meow()
Cree otra function que acepte un parámetro de address
( setCatAddress
) para que pueda actualizar el valor de la variable de address
( catAddress
)
Ahora, su contrato inteligente ( FunMaker
) es actualizable. Cuando desee hacer una actualización, simplemente escriba otro contrato que implemente Cat
( Shorthair2
, Persian
, lo que sea) y despliéguelo. Después de la implementación, registre la dirección y llame a setCatAddress
en FunMaker
para sobrescribir el valor de catAddress
.
El espíritu de los contratos inteligentes es "definir qué hacer, hacer lo que se define". La confianza se basa en el hecho de que no se puede cambiar nada después de la implementación. Sin embargo, si implementa su DApp así, básicamente está invirtiendo los principios.
Además, el contrato que se llama ( Shorthair
) no puede tratar directamente con saldos y variables en la persona que llama ( FunMaker
). A pesar de que todavía es factible con un layout cuidadoso y soluciones alternativas, es mejor evaluar si vale la pena hacerlo en primer lugar.
Básicamente, no hay una manera simple.
La forma más simple que puedo imaginar es mediante la comparación de código de bytes: