¿Todos los nodos ejecutan el código de contrato para cada transacción?

Esta pregunta se hizo en Reddit hace un tiempo:

Cuando un nodo envía una transacción a la red y tiene el receptor como contrato, ¿cada nodo ejecuta el bytecode del contrato con las entradas para confirmar el hash? ¿O el primer nodo que recibe la transacción ejecuta y crea el hash de la transacción que luego se distribuye y es lo que se usa para el consenso? Básicamente, ¿el código del contrato se ejecuta una o varias veces para cada transacción? Supongo que es lo primero si cada nodo ejecuta EVM. Reddit: Preguntas básicas sobre Ethereum EVM y State Storage

Respuestas (4)

Sí, la respuesta es bastante lógica. Cada nodo tiene que verificar los resultados de una transacción que invoca un contrato inteligente. El resultado es que al menos cada nodo completo ejecutará el código.

El hash de la transacción no es relevante hasta que se inserta en un árbol merkle. Al ejecutar la ejecución, lo único que nos importa es la cantidad de gas, los datos que se pasan y el código del contrato que se llama. Cuando se completa la ejecución, el árbol de almacenamiento del contrato puede actualizarse, por lo que volvemos a calcular el hash raíz de merkle de ese árbol (¡y cualquier otro contrato que pueda haber sido llamado por ese!)

fuente _

¿Qué hace un nodo no minero con el resultado de la ejecución de un contrato arbitrario? Un nodo de minería intentaría inherentemente verificar la transacción y agregar el resultado a la cadena de bloques, pero eso no se aplica a un nodo que no sea de minería.
Estoy sorprendido. No parece muy escalable si cada nodo debe ejecutar el mismo código. Pensaría que un nodo lo ejecutaría (quizás al azar) y luego firmaría la transacción como lista para agregarse al siguiente bloque. ¿Qué sucede cuando la demanda de código supera la capacidad de procesamiento de cada nodo individual?
@Brain2000 Actualicé los detalles de una pregunta sobre escalabilidad: ethereum.stackexchange.com/questions/133/…
@ Brain2000 Si solo un nodo ejecutara el EVM y luego publicara los resultados para que todos los demás nodos confíen ciegamente, eso generaría un problema de seguridad. Por otro lado, si solo el 51% de los nodos lo ejecutaran, conservando los recursos del otro 49% de los nodos, el problema de seguridad probablemente no surgiría.

Cada nodo completo procesa cada transacción. Los mineros eligen qué transacciones ejecutar, según el precio del gas. Una vez que se extrae un bloque, cada nodo debe volver a ejecutar todas las ejecuciones del contrato para verificar el bloque.

Entonces, ¿eso significa que cada nodo ejecuta todos los contratos extraídos dos veces? Una vez cuando no está confirmado y la segunda cuando se extrae.

Sí, cada nodo (completo) ejecuta el código de contrato para cada transacción.

Dado que ejecutar el código del contrato es relativamente costoso, los nodos solo lo hacen cuando lo necesitan. Cuando un nodo recibe una transacción, primero solo realiza algunas comprobaciones básicas, como:

  • la firma es valida?
  • ¿La cuenta de envío tiene suficiente Ether para pagar el gas?
  • ¿Está el gas por debajo del límite de gas del bloque?

Si pasan las comprobaciones básicas, el nodo transmite la transacción. Luego, los nodos mineros realizan el trabajo relativamente costoso de ejecutar la transacción, incluirla en un bloque y cobrar la tarifa de transacción. Cuando un nodo (completo) obtiene el bloque, ejecuta las transacciones en el bloque para verificar de forma independiente la seguridad y la integridad de la cadena de bloques que construye.

¿Hay un diagrama de flujo/diagrama de secuencia para esto?
@NathanAw No que yo sepa, y es posible que las implementaciones de nodos tengan diferencias.

En la versión actual, cada nodo ejecuta todos los contratos. Dado que esto no es escalable, es muy probable que se implemente "fragmentación", donde algunos estados están solo en ciertos nodos. A continuación, se accederá a ellos según sea necesario de forma asincrónica. Esto es en lo que Vitalik está trabajando actualmente

Sharding está llegando a Ethereum..