Lista de bloques huérfanos (no referenciados)

El bloque huérfano es un bloque que no tiene un padre conocido en la cadena de bloques más larga.

Según tengo entendido, esto significa que el bloque huérfano no tiene una referencia como "hash de bloque anterior" en ningún bloque más nuevo. ¿Es correcto?

En caso afirmativo, investigo un poco y no entiendo por qué obtengo algunos resultados extraños.

Por lo tanto, extraigo todos los hashes de bloque de los archivos dat sin procesar. Luego extraigo todos los datos de "hash de bloque anterior" de los archivos de datos sin procesar. Como resultado, tengo 2 matrices: hashes de bloque (matriz A) y referencias principales (matriz B). Entonces, si resto B de A, obtendría una lista de bloques huérfanos.

¿Es la forma correcta de obtener una lista de bloqueo huérfanos o no?

PD: obtengo estos resultados después de analizar los archivos dat de blk00000.data blk00953.dat(elegí dos bloques de la lista compilada):

000000000000000003D57B69D1AC77F64287C893C16ADBC1816C6D7386CCC3C0 – orphaned 0000000000000000011523D7477DD274B7E0DCC2C616B2E2F584FFDEC20237D3 - main chain

main chainy orphanedson el estado basado en sitios de exploración de bloques.

En estos dos bloques no hay ninguna referencia como "anterior" en los archivos de datos sin formato. Estoy confundido - "¿por qué?"

El término 'bloque huérfano' se usaba comúnmente para al menos dos cosas muy diferentes: consulte bitcoin.stackexchange.com/a/5869/208 . Parece que te refieres al segundo significado aquí, que ya no es relevante. Desde la introducción de la sincronización de encabezados primero, ya no existen tales huérfanos.
@PieterWuille gracias por la ayuda) Pero el primer bloque de mi ejemplo se extrajo el 29 de noviembre de 2016 (después del lanzamiento de bitcoin core v0.10) y este bloque está en el archivo dat que está en el disco \blocks dir
Los sitios web de Block Explorer usan el término 'huérfano' para significar "ya no está en la cadena principal", no "ningún padre conocido".
aquí se trata de los bloques que no tienen referencias después. Los tengo.

Respuestas (1)

Como resultado, tengo 2 matrices: hashes de bloque (matriz A) y referencias principales (matriz B). Entonces, si resto B de A, obtendría una lista de bloques huérfanos.

No, al hacerlo obtendrá una lista de bloques obsoletos (que comúnmente se conocen como bloques huérfanos). Lo que está haciendo es obtener todos los bloques que no son padres de nada, no bloques que no tienen padres.

000000000000000003D57B69D1AC77F64287C893C16ADBC1816C6D7386CCC3C0 – orphaned 

El término "huérfano" aquí significa que el bloque no tiene hijos. Este es el segundo significado del término "bloque huérfano". Se esperaba este resultado ya que está eliminando de su lista de hashes de bloque la lista de bloques principales, y este bloque no es principal.

0000000000000000011523D7477DD274B7E0DCC2C616B2E2F584FFDEC20237D3 - main chain

Este bloque está en la cadena principal. Probablemente esté en su lista porque eso es con lo que se sincronizó su nodo y este fue su bloque más reciente.

Creo que mi inglés no es tan bueno. Quiero decir que cada bloque tiene referencia en el anterior, pero por ejemplo en blk00234.dat bloque actual que no tiene referencia en él en toda la base de datos. Este bloque se llama huérfano. ¿Es verdad?
los bloques pueden llegar a su nodo en el orden correcto, por lo que es posible tener un bloque sin padre en su almacenamiento local
Sí, un bloque que no tiene hijos se denomina comúnmente huérfano. Pero esa no es la definición de huérfano que estás usando.
(... pero por ejemplo en blk00234.dat...) la cadena principal es igual en todos los nodos, pero los archivos blk no son iguales byte a byte entre sí. su versión tiene bloque huérfano en el archivo #234, la mía no tiene
@amaclin, ¿así que dice que una base de datos completa de bitcoin ( \blocks\blk*.datarchivos) no es igual para todos los que instalan el cliente de bitcoin?
Sí. mi archivo es diferente al tuyo. y mi copia no tiene 0000000000000000003D57B69D1AC77F64287C893C16ADBC1816C6D7386CCC3C0
Pero creo que el principal principio de blockchain es mantener la misma base de datos en cada nodo.
@Denis El objetivo es que todos tengan la misma cadena de bloques. Sin embargo, la cadena de bloques en sí no es una base de datos, y no todos tendrán exactamente los mismos bloques en el mismo orden. Pero el software del nodo podrá analizar los datos de la cadena de bloques y determinar qué bloques usar para que todos los nodos terminen usando la misma cadena de bloques. Los nodos pueden tener diferentes datos de blockchain, pero la gran mayoría serán los mismos. Las únicas diferencias son con los bloques huérfanos, ya que los nuevos nodos no los conocerán y esos bloques huérfanos pueden propagarse lentamente.
@AndrewChow, ¿quieres decir que la base de datos local no es igual para todos los nodos?
Sí, las bases de datos no son iguales para todos los nodos.
@AndrewChow, sienta el principio básico de la tecnología p2p) La base de datos es igual para cada nodo. Eso es verdad. Especialmente para la cadena Bitcoin. Entonces -1_
@Denis, No, eso está completamente mal. Por favor, comprenda cómo funciona el protocolo P2P antes de saltar a tales conclusiones. Todo el sistema es asíncrono, lo que significa que los pares recibirán bloques en diferentes momentos y completarán los bloques de validación en diferentes momentos. Hay latencia en la retransmisión de bloques, y eso hace que los nodos no estén de acuerdo.
Por ejemplo, dos mineros (minero A y minero B) pueden encontrar un bloque a la misma altura aproximadamente al mismo tiempo. Cuando se transmite el bloque, los compañeros recibirán un bloque antes de recibir el otro. Esto significa que algunos pares tendrán el bloque de A primero y el bloque de B en segundo lugar. Sus bases de datos ahora no están de acuerdo. Si algún otro minero extrae un bloque encima del bloque de A y no hay carrera en ese momento, el bloque de A pasa a formar parte de la cadena principal y el bloque de B queda huérfano.
Ahora suponga que C decide configurar un nuevo nodo completo. Solo descargará bloques en la cadena principal, por lo que su base de datos solo contendrá el bloque de A, no el de B, ya que el bloque de B quedó huérfano y ya no es relevante. C todavía usa la misma cadena de bloques que todos los demás, pero su base de datos será diferente a la de otras personas.
¿ Pero los archivos blk*.daten blocksdir son los mismos para todos los que están conectados a bitcoin?
No, ellos no son. Los bloques no se descargan ni almacenan en el disco en orden, por lo que es probable que los archivos de bloque sean diferentes solo por el orden. Además, como en mi ejemplo anterior, si tiene un nuevo nodo, no habrá descargado y almacenado en el disco un bloque huérfano, pero otros nodos que estaban en línea en el momento en que se extrajo el bloque habrán descargado y almacenado el bloque huérfano. . Eso hará que sus archivos de bloque sean diferentes de otros nodos.
La base de datos @AndrewChow es igual para cada nodo, byte por byte.
@Denis no, no lo son. ¿Por qué sigues insistiendo en que lo son? Mantengo varios nodos y puedo probar que tienen diferentes archivos de bloques y bases de datos. Si tiene un nodo, puedo probar que mis nodos tienen archivos de bloques y bases de datos diferentes a los suyos.
@AndrewChow si esto es así, entonces el principio principal de la cadena de bloques colapsa.