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 h1
pero 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 ReceivedBlockTransaction
o ActivateBestChain
fallara, ¿se revertiría el disco o no? Si retrocediera, ¿por qué no poner el receivedBlockTransaction
y ActivateBestchain
antes store block on disk
?
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.
Once