Come fa Bitcoin Core a sapere di essere sulla catena più lunga?

Aug 23 2020

Nel tentativo di implementare un client, mi chiedo quale sia l'approccio più efficiente per capire se sei su un fork.

Supponiamo che tu scelga un peer a caso e passi attraverso l'IBD usando l'approccio delle intestazioni. Dopo aver raggiunto la punta della catena, qual è il modo più efficiente per verificare se questa è la catena più lunga?

Immagino che tu debba chiedere ai tuoi colleghi qual è la loro migliore intestazione e, in base alla risposta e ad alcune euristiche, decidere se sei sulla catena più lunga o meno. È semplicemente fatto tramite getheaders? Qual è l'euristica? E cosa fai se scopri di essere su una forchetta?

Sarebbero apprezzati anche i puntatori al codice pertinente in bitcoin o btcd.

Grazie

EDIT: Nel caso in cui questo non sia ovvio, non sto chiedendo se può sapere con certezza che si trova sulla catena più lunga (non può), ma piuttosto qual è il miglior tentativo per rimanere sulla catena più lunga a sempre.

Risposte

5 pinhead Aug 23 2020 at 22:09

Prima di tutto, trovare la catena più lunga non è l'obiettivo, ma la catena con la prova di lavoro più accumulata [ 1 ]

Ora, trovare la catena più impegnativa è l'obiettivo dell'intero nodo. L'intero significato della sua esistenza è trovare la catena di lavoro più impegnativa, quindi puoi scegliere quasi tutte le linee dai moduli di rete e convalida del codice e spiegarla in quei termini.

Per essere un po 'più specifici:

  • Il nodo completo si collega ad almeno 8 peer. Le versioni più recenti si connettono a 2 peer extra in modalità "solo blocchi". I peer vengono scelti in modo da essere il più diversificati possibile (per sottorete IP o mappa AS). Se un nuovo blocco non è stato aggiunto entro un certo timeout (penso siano 40 minuti) Bitcoin Core aggiunge un altro peer in uscita.
  • Il nodo completo invia una getheadersrichiesta a ogni peer e tiene traccia del miglior blocco di cui ogni peer è a conoscenza.
  • Se un peer ha un'intestazione di blocco valida con un lavoro accumulato maggiore rispetto al nostro suggerimento corrente, gli chiediamo i blocchi corrispondenti. Se quei blocchi sono validi, diventa il nostro nuovo suggerimento per la catena. Una riorganizzazione può o non può essere necessaria per arrivare a quello stato.

Se comprendi concettualmente come funziona la sincronizzazione delle intestazioni, la funzione FindNextBlocksToDownload () è il passaggio successivo. È qui che il nodo decide se un peer ha intestazioni con un lavoro maggiore rispetto al suo suggerimento della catena corrente e richiede quei blocchi da quel peer.

Quindi tutto ciò che possiamo fare è connetterci a molti colleghi e presumere che almeno uno di loro conosca la catena di lavoro più importante. Ciò rende la scoperta tra pari e la scelta a quali peer connettersi di importanza critica.