¿En qué orden se procesan los bloques nuevos?

El nodo A recibe un bloque más nuevo con altura h1, que determina que es válido y, por lo tanto, almacena el bloque en el disco. Un poco más tarde recibe otro bloque de la misma altura h1pero con mayor cantidad de prueba de trabajo que el anterior. ¿Qué haría el nodo A?

También estoy confundido sobre el orden de procesamiento de un nuevo bloque. El orden en el código fuente:

              success                          success
Check(block)----------->store block on disk------------------>ReceivedBlockTransaction-------->ActivateBestChain

Si fallara ReceivedBlockTransactiono ActivateBestChainfallara, ¿se revertiría el disco o no? Si retrocediera, ¿por qué no poner el receivedBlockTransactiony ActivateBestchainantes store block on disk?

Respuestas (2)

Primero para aclarar:
dos bloques competidores a la misma altura que se construyen sobre el mismo bloque principal siempre tienen la misma cantidad de prueba de trabajo , ya que eso depende de la dificultad, que será la misma para ambos competidores.

Por lo tanto, una reorganización de la cadena solo ocurrirá en la práctica si una punta de cadena competidora se adelanta a una punta de cadena previamente aceptada al acumular una mayor longitud. *

Bitcoin Core almacena los bloques de la competencia que recibe como una rama lateral, si los encabezados la convierten potencialmente en la mejor cadena. De lo contrario, los descarta.

Cuando se produce la reorganización de la cadena, Bitcoin Core deshará cada bloque de la punta uno a la vez, volviendo al ancestro común con la nueva mejor cadena, luego aplicará los bloques en la nueva mejor cadena uno a la vez hasta que esté en el nuevo consejo

* Es posible construir un caso en torno a un cambio de dificultad donde las puntas de cadena competidoras tienen diferentes dificultades a la misma altura. Luego, el de mayor dificultad reemplazaría al de menor dificultad a la misma altura. Sin embargo, eso requeriría una división de cadena de más de una longitud de bloque.

Cuando el cliente recibe cadenas de bloques en conflicto, la cadena con el mayor trabajo general "ganará" y será la que el nodo A considere la verdadera cadena. Si las dos cadenas son iguales (por ejemplo, porque dos mineros encontraron un bloque aproximadamente al mismo tiempo), conservará ambas hasta que vea que un nuevo bloque en una de las cadenas la convierte en la mejor cadena. En el ejemplo que describiste, esto se llama reorganización de la cadena .

No estoy lo suficientemente familiarizado con el código fuente para decirte exactamente cómo lo hace, pero es evidente que lo hace. Asumiría que elimina los bloques de una cadena huérfana del disco una vez que sabe que está huérfano.

Hola Tim, gracias por tu respuesta. Creo que el bloque de procesamiento es una serie, no paralelo. Un nodo debe procesar uno por uno e incrementar su altura de cadena principal. Entonces, si hay dos bloques nuevos de la misma altura (A y B), los nodos almacenarían el bloque que el nodo obtuvo primero (A) y agregarían su altura en 1. cuando el nodo encontró B, la altura de su cadena principal ya es más alta que el bloque B , por lo que no aceptará B. Pero si algún tiempo después el nodo encuentra una cadena más larga que su cadena principal y la cadena tal vez esté bifurcada por B, el nodo se reorganizará. Mi punto es que el nodo no se mantendrá en ambos bloques de la misma altura. ¿Tengo razón?