¿Cuál es el orden de las operaciones para verificar una transacción?

No estoy preguntando si todos los nodos ejecutan cada transacción. Estoy pidiendo una secuencia de tiempo aproximada de eventos. Por ejemplo, en el caso de un intento de gasto doble, y el gastador doble está coludido con el minero que está agregando el siguiente bloque. ¿En qué momento un nodo aleatorio en la red, que participa en la minería, verifica que esto fue incorrecto y marca el problema?
- ¿Es solo el próximo minero que llega a agregar un bloque el que detecta este problema?
- ¿Cada nodo solo verifica/ejecuta la transacción la próxima vez que participa en la minería o solo cuando resuelve el PoW y puede agregar un nuevo bloque?
- ¿La próxima vez que estén en línea?
- ¿Existe un disparador tal que un nodo completo que pueda estar inactivo necesite ejecutar el código del contrato y verificarlo?

¿Qué pasa si los próximos N mineros también están coludidos? ¿Se requiere solo un minero para marcar la transacción como incorrecta o N+1?

Obviamente, todos los nodos no pueden ejecutar esa transacción antes de que se construya otro bloque, por lo que espero que haya una línea de tiempo aproximada de eventos.

Un nodo completo debe verificar todas las transacciones que aparecen en un nuevo bloque.
Estoy pidiendo específicamente el orden de las operaciones y una línea de tiempo. ¿Qué sucede si un nodo se desconecta? ¿Qué pasa si un nodo tiene una computadora congelada? Todos estos nodos no pueden estar sincronizados
Cuando un nodo se conecta por primera vez, recibirá bloques de otros nodos. Para cada bloque, primero realizará verificaciones básicas, como si el bloque principal ya está presente, la dificultad del bloque, etc. Si pasan las verificaciones básicas, ejecutará las transacciones en el orden en que están presentes en el bloque. Después de realizar todas las transacciones, verificará que el estado final resultante se almacene correctamente en el encabezado del bloque. Si todo está bien, se acepta el bloqueo.
Hay algunos modos, como el modo rápido de geth, que omitirá la ejecución de transacciones de bloques antiguos y solo los ejecutará para bloques recientes. Esto se hace para ahorrar tiempo y espacio de almacenamiento.
Todavía no recibo ninguna respuesta remota en un orden de operaciones de ejemplo. Si tengo un contrato inteligente y espero que se ejecute en todos los nodos, ¿en qué momento se ejecutó en el 99 % de los nodos? ¿Hay alguna indicación? ¿Los nodos verifican la transacción antes de la extracción para la siguiente adición de bloque? Después de ganar el Pow? ¿La próxima vez que realmente participen en una transacción en cadena? ¿Tarea de fondo que verifica bloques incluso si no están minando activamente?
El significado exacto es un poco diferente de lo que esperas. No tiene que ejecutarse en el 99% de los nodos. En cambio, debe ejecutarse en el 50% + 1 de los mineros (no con respecto a la cantidad de mineros sino al poder de hash total). Solo los mineros tienen incentivos para ejecutar contratos y deben verificar las transacciones extraídas antes de extraer un nuevo bloque o pueden perder la recompensa del bloque si el bloque anterior no era válido.
No se requieren otros nodos no mineros para ejecutar transacciones, pero aceptar un bloque no válido puede causar problemas. Porque otros nodos incluirán en la lista negra los nodos que propagan un bloque no válido. Por lo tanto, el nodo completo puede ejecutar contratos de todos modos para verificar que el bloque sea válido.
El principio de funcionamiento es bastante diferente y difícil de aceptar. Q1: cada nodo decide por sí mismo. P2: no se detecta el gasto doble. Nunca sucedió. Cada nodo funciona a partir de un orden inequívoco de eventos que cree. P3: Cada nodo completo calcula cada transacción, no solo los mineros. P4: Ver P3. P5: Llega un bloque con una lista de transacciones ordenada. Estas transacciones deben ser evaluadas. P6: No es lineal. Todos los mineros compiten por el privilegio de ordenar transacciones por un breve período. La mayoría determina la verdad. P7: Suposición no obvia e incorrecta. Ellos si.

Respuestas (2)

Cuando un minero resuelve el rompecabezas de prueba de trabajo en el bloque que está extrayendo, lo coloca en el encabezado del bloque y lo propaga a los otros nodos que conoce. Podrían ser otros mineros u otros nodos completos no mineros.

El nuevo bloque ahora se está propagando. Los nodos que reciben el nuevo bloque tienen que validarlo.

Los nodos completos no mineros harán lo siguiente:

  • Verifique que el PoW en el encabezado del bloque sea válido;
  • Propaga el bloque a los nodos del mismo nivel;
  • Verifique que las transiciones de estado en el bloque sean válidas.

Los nodos de minería hacen lo mismo, pero en un orden ligeramente diferente, lo que les permite comenzar a minar más rápidamente en el siguiente bloque:

  • Verifique el PoW en el encabezado del bloque;
  • Verifique que las transiciones de estado en el bloque sean válidas;
  • Propaga el bloque a los nodos del mismo nivel.

Verificar las transiciones de estado en un bloque completo de 8Mgas toma del orden de 100-200ms en una máquina decente.

Sobre sus preguntas específicas.

No estoy preguntando si todos los nodos ejecutan cada transacción.

Lo hacen, para garantizar que su estado sea internamente consistente. (En realidad, hay un argumento teórico del juego que va en contra de esto. Escuché que algunos mineros en realidad no están verificando que el contenido del bloque sea válido, y solo están asumiendo que es para permitirles comenzar a extraer el siguiente bloque).

¿En qué momento un nodo aleatorio en la red, que participa en la minería, verifica que esto fue incorrecto y marca el problema?

Debe ser marcado por el primer grupo de pares del minero, quienes deben validar las transiciones de estado.

¿Es solo el siguiente minero que agrega un bloque el que detecta este problema?

No, como arriba.

¿Cada nodo solo verifica/ejecuta la transacción la próxima vez que participa en la minería o solo cuando resuelve el PoW y puede agregar un nuevo bloque?

No, cuando reciben un bloque recién propagado.

¿La próxima vez que estén en línea?

Si se desconectan, cuando vuelven a conectarse y antes de que comiencen a minar nuevamente, deberán sincronizarse nuevamente con el cabezal de la cadena. La validación es parte de esta sincronización.

¿Existe un disparador tal que un nodo completo que pueda estar inactivo necesite ejecutar el código del contrato y verificarlo?

El desencadenante es que tendrá el nuevo bloque empujado hacia él.

Obviamente, todos los nodos no pueden ejecutar esa transacción antes de que se construya otro bloque, por lo que espero que haya una línea de tiempo aproximada de eventos.

En teoría lo hacen, de lo contrario no saben que están construyendo sobre un estado válido.

La transacción solo se verifica durante la minería, por lo tanto, por los nodos que extraen. Todos los demás nodos, cuando reciben el bloque, comprueban si la solución, según la dificultad, es correcta para el bloque. Entonces solo verifican la solución proporcionada por el minero. Si es correcto, lo aceptan, si no, lo rechazan.

Puede encontrar más información sobre la validez del bloque en el papel amarillo, parte 4.4.2: http://yellowpaper.io/

En cuanto a la orden de ejecución, no estoy nada seguro, pero prefiero no decir nada. También debería echar un vistazo al papel amarillo al respecto: http://yellowpaper.io/

Entonces, en base a esto, nadie ha abordado mi pregunta. El papel amarillo no es obvio sobre esto, por lo que estoy haciendo la pregunta aquí de alguien con conocimientos al respecto.