¿Cómo obtienen los nodos completos la información sobre los bloques obsoletos?

En Bitcoin, se producen muchas bifurcaciones cuando varios mineros extraen bloques al mismo tiempo. Entonces habrá varios bloques a la misma altura de bloque. Estaba mirando la guía para desarrolladores de Bitcoin P2P en https://developer.bitcoin.org/devguide/p2p_network.html

Para propagar bloques, un repetidor envía un mensaje "inv" a sus pares. Los compañeros solicitan información de encabezado con "getheaders" y el relé responde con un mensaje de "encabezados". Luego, los compañeros solicitan información de bloque con "getdata" y el relé responde con un mensaje de "bloqueo".

En este caso, ¿cómo se puede asegurar que los pares obtengan múltiples bloques a la misma altura de bloque? Un repetidor podría propagar deliberadamente mensajes "inv" y "headers" para solo uno de los bloques a la misma altura de bloque.

¿Cómo pueden los compañeros saber que ocurrió una bifurcación? ¿Obtener la información sobre la bifurcación es responsabilidad del relevo o del par?

Respuestas (1)

Una suposición de seguridad es que los nodos están conectados al menos a un par honesto. Si todos sus pares son maliciosos, es perfectamente factible que retengan información sobre ciertos bloques o transacciones de una víctima. Busque ataques de eclipse, si desea saber más sobre este estilo de ataques, o las mitigaciones que existen contra ellos.

Entonces, ¿se espera que un retransmisor honesto envíe encabezados para las cadenas laterales en el mensaje "inv" y "encabezados"? Si varios relés envían un mensaje "inv" a un nodo, ¿enviará el nodo un mensaje "getheaders" a cada uno de ellos y comparará? ¿O el nodo enviará el mensaje "getheaders" a solo uno de los relés?
Suponiendo que al menos uno de los relés sea honesto, ¿qué controles/mecanismos utiliza el nodo para asegurarse de que tiene una vista completa?
No existe tal cosa como una "vista completa". Cada nodo decide de forma independiente qué bloque considera que es el actualmente activo en función de la información que tiene, y los nodos honestos transmitirán esta información a sus pares. Los nodos solo conocen los bloques obsoletos porque en el momento en que se retransmitieron, desde la perspectiva del retransmisor, no estaban obsoletos.
Gracias, Pieter :) Por favor, hágame saber si esto es correcto. Supongamos que un nodo está conectado a 8 pares. Cada uno de los pares (honestos) que tiene un nuevo bloque envía un mensaje "inv" al nodo "si el par considera que este bloque será parte de la cadena principal". El nodo responde con el mensaje "getheaders" a "todos los pares" que enviaron el mensaje "inv". Cada vez que un par devuelve un encabezado, el nodo solicita "obtener datos" al mismo par. Si el nodo no obtiene el "bloqueo" en 2 segundos, el nodo elige otro par que envió el mismo encabezado y le solicita "obtener datos".
¿Existe alguna especificación (algo) formal de los supuestos necesarios para que funcione la propagación del bloque de Bitcoin? Por ejemplo: ¿Qué significa compañero "honesto" aquí? ¿Qué información debe propagar un par "honesto" y qué información es opcional? Estoy tratando de integrar Bitcoin con otra cadena de bloques. Conocer los supuestos formales es un poco importante.
¿Hay algún pseudocódigo en alguna parte sobre cómo funcionan los nodos al propagar bloques?
No puede haber una especificación formal del protocolo Bitcoin, porque no hay una autoridad que pueda decidirlo. Las reglas de la red están definidas por lo que ejecuta la gente, por insatisfactorio que pueda ser. Imagine que escribimos un documento y de alguna manera lo bendecimos para que sea la especificación del protocolo Bitcoin. Y ahora alguien encuentra una discrepancia entre ese documento y el software del nodo que realmente se ejecuta en la red. En ausencia de una autoridad que pueda obligar a todos a descargar un nuevo software, la única conclusión es que el documento es incorrecto y debe corregirse.
Por supuesto, hay documentación, donde las personas describen las reglas (en lugar de prescribirlas ). Algunos de ellos se pueden encontrar en la wiki de bitcoin.it (aunque muchos están desactualizados) y en developer.bitcoin.org . Los cambios más significativos que afectan la interacción entre diferentes implementaciones se proponen primero como BIP ( github.com/bitcoin/bips ), pero muchas más políticas específicas del cliente, como el comportamiento de retransmisión, se encuentran simplemente en los códigos fuente respectivos del cliente.