Contratos de solidez: control de fuente

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.

Respuesta corta

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.

Explicación

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.

Solución

Puede hacer uso del hecho anterior para hacer su DApp actualizable:

  1. Defina una interfaz ( Cat ) que tenga algunas funciones abstractas ( meow ) que desee que sean actualizables
  2. Definir un contrato ( Shorthair ) que implemente la interfaz ( contract Shorthair is Cat )
  3. Implementar el contrato ( Shorthair )
  4. Definir otro contrato ( FunMaker )

    1. Definir una variable de address catAddress ( address catAddress )
      • Esto es para almacenar la dirección de su "última" implementación
    2. En el constructor, acepta un parámetro de address
      • Asignar el valor a catAddress
    3. Cuando desee llamar a la function actualizable ( meow ), haga esto:

       Cat cat = Cat(catAddress) cat.meow() 
    4. 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 .

Advertencias

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.

¿Cómo sé el código fuente del contrato en una dirección específica?

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:

  1. Obtenga el código de bytes en una dirección específica mediante esta llamada
  2. Obtenga el código fuente del propietario
    • En la mayoría de los casos, están dispuestos a proporcionarle el código fuente
    • Esto se debe a que el espíritu de los contratos inteligentes es "definir qué hacer, hacer lo que se define"
    • La confianza proviene del hecho de que el usuario sabe exactamente cómo se implementa: ni más ni less
  3. Comstackrlo con un comstackdor de solidez
    • Puede encontrar el comstackdor en línea oficial a mano
  4. Haga una comparación de cadenas en los resultados