Guida al network di Bitcoin. Parte  9a
Guida al network di Bitcoin. Parte  9a
Bitcoin

Guida al network di Bitcoin. Parte 9a

By Alessio Salvetti - 21 Dic 2019

Chevron down
Ascolta qui
download

Questo articolo è il nono di una guida al network di Bitcoin, accessibile anche a coloro a digiuno di codice. Questo articolo continua altresì una sorta di approfondimento pensata per entrare gradualmente in quella che molti definiscono “la tana del bianconiglio”.

A livello bibliografico è d’obbligo citare il testo “Mastering Bitcoin” di Andreas Antonopoulos, riferimento costante, dal quale sono state tratte le immagini. Chi fosse interessato ad approfondire questi temi, con o senza integrazione delle dinamiche legate al codice, può trovare supporto nei corsi formativi e nella attività consulenziali erogate da Bcademy.

Il network di Bitcoin

Bitcoin è strutturato come architettura di rete tra pari (P2P network) costruita sopra (on top) internet. Tra pari significa che non vi sono nodi della rete con poteri differenti dagli altri, e tutti alla pari appunto hanno l’onere e l’onore di fornire e godere dei servizi di rete: i nodi si connettono in una rete mesh dalla topologia piatta (flat): non ci sono server, servizi centralizzati o gerarchia di alcun tipo. Il termine network si riferisce appunto all’insieme dei nodi che fanno girare il protocollo Bitcoin (vi sono in aggiunta altri protocolli, come Stratum usato per il mining e i wallet da mobile: questi protocolli sono forniti di server di routing gateway che hanno accesso al network Bitcoin usandone il protocollo ed estendendo il network appunto facendo girare altri protocolli).

Sebbene i nodi siano paritetici, ci sono differenti ruoli che dipendono dalle funzionalità che supportano. Un nodo Bitcoin è un insieme di funzioni:

 

  • Routing;
  • blockchain (database);
  • Mining;
  • wallet (servizi).

 

 

Tutti i nodi includono la funzione di routing per partecipare al network, ergo validano e propagano transazioni e blocchi, scoprono e mantengono connessioni tra pari:

  • alcuni nodi (full nodes) mantengono una copia completa e aggiornata della blockchain, verificano autonomamente e autorevolmente transazioni senza riferimenti esterni;
  • alcuni nodi (SPV nodes o lightweight nodes) mantengono solo un sottoinsieme della blockchain e verificano transazioni utilizzando un metodo chiamato SPV (simplified payment verification);
  • i nodi di mining competono tra loro per creare nuovi blocchi girando hardware specializzato nella soluzione dell’algoritmo di Proof-of-Work (alcuni sono full node, altri lightweight partecipanti in pool di mining);
  • i wallet degli utenti possono essere parte di un full node, oppure come nei casi di wallet mobile, essere parte di un SPV node;
  • in aggiunta ai principali tipi di nodi inerenti il protocollo Bitcoin, ci sono server e nodi che fanno girare altri protocolli, come i protocolli specializzati delle mining pool e quelli di accesso al client lightweight.

Il network Bitcoin allargato

Il main network Bitcoin, che esegue il protocollo P2P Bitcoin, conta ad ora quasi 10.000 nodi che eseguono varie versioni del client di riferimento bitcoin (Bitcoin Core) e qualche centinaio di nodi che eseguono varie altre implementazioni del protocollo Bitcoin P2P, come ad esempio BitcoinJ, Libbitcoin, e btcd. Una piccola percentuale dei nodi della rete P2P Bitcoin sono anche nodi di mining. Vari business si interfacciano con il network bitcoin eseguendo i client full-node basati sul client di Bitcoin Core, divenendo nodi del network con copie della blockchain, ma senza mining o funzionalità wallet. Questi nodi agiscono come network edge routers, consentendo a vari altri servizi (exchange, wallet, block explorer, merchant payment processing) di essere costruiti sopra il network.

Il network esteso include dunque sia i nodi che eseguono il protocollo Bitcoin, sia i nodi che eseguono protocolli specializzati. Attaccati al main network ci sono un certo numero di pool server e protocol gateways che collegano nodi che eseguono altri protocolli (perlopiù nodi di mining pool e client “leggeri”).

Bitcoin Relay Network

Mentre il network P2P soddisfa le esigenze generali di un’ampia varietà di tipologie di nodi, palesa una latenza troppo elevata per le esigenze dei nodi di mining, che necessitano di minimizzare il tempo tra la propagazione di un blocco vincitore e l’inizio del prossimo round di competizione. Un Bitcoin Relay Network è un network che tenta di minimizzare tale latenza, e consiste di dozzine di nodi specializzati hostati su infrastruttura Amazon Web Service che servono a connettere la maggioranza dei miner e mining pool. L’originale (2015, Matt Corallo) è stato sostituito nel 2016 (Matt Corallo) con Fast Internet Bitcoin Relay Engine (FIBRE), un UDP-based relay network che inoltra blocchi all’interno di un network di nodi.

Network Discovery

Quando si avvia un nodo, deve scoprire altri nodi per partecipare al network e connettersi almeno ad uno di essi (la geografia è irrilevante), scelto in maniera casuale. Per connettersi ad un nodo conosciuto, i nodi stabiliscono una connessione TCP (normalmente su porta 8333). Dopo aver stabilito la connessione i nodi iniziano con una “stretta di mano” trasmettendosi un version message contenente informazioni di base, quali:

  • nVersion – la versione del protocollo P2P Bitcoin del client (es: 70002)
  • nLocalServices – una lista dei servizi locali supportati dal nodo, attualmente solo NODE_NETWORK
  • nTime – l’ora
  • addrYou – l’indirizzo IP del nodo remoto come visto da questo nodo
  • addrMe – l’indirizzo IP del nodo locale, come scoperto dal nodo locale
  • subver – mostra il tipo di software che gira sul nodo (es: /Satoshi:0.9.2.1/)
  • BestHeight – l’altezza del blocco sulla blockchain del nodo

Il version message è sempre il primo messaggio inviato da un pari ad un altro. Un peer locale che lo riceve considera la nVersion riportata per capire se il peer remoto è compatibile. Se sì, il peer locale riconosce il version message e stabilisce una connessione inviando un verack.

Per trovare i pari, il primo metodo è interrogare DNS che usano un numero di “DNS seeds” che sono DNS che forniscono una lista statica di indirizzi IP di nodi Bitcoin. Alcuni di questi seeds forniscono una lista statica di indirizzi IP di nodi Bitcoin stabili in ascolto. Alcuni di questi sono implementazioni custom di BIND (Berkeley Internet Name Daemon) che ritornano un sottoinsieme casuale da una lista di indirizzi bitcoin raccolta da un crawler o un nodo Bitcoin attivo a lungo (long-running). Bitcoin Core contiene i nomi di 5 differenti seed. La diversità della proprietà e la diversità della implementazione di differenti seed DNS offre un buon livello di affidabilità per il processo di avviamento iniziale. In alternativa, un nodo in fase di avviamento che non conosce nulla della rete deve avere l’indirizzo IP di almeno un nodo bitcoin, dopo di che può stabilire ulteriori connessioni. Una volta stabilite una o più connessioni, il nuovo nodo manda un messaggio addr contenente il suo indirizzo IP ai vicini, che inoltreranno il messaggio ai loro vicini, assicurando che il nuovo nodo divenga noto e ben connesso. In aggiunta, il nuovo nodo può inviare getaddr ai loro vicini, chiedendo di ritornargli una lista di indirizzi IP di altri pari. In questo modo, un nodo può trovare pari a cui connettersi ed avvisare della propria esistenza nella rete per essere trovato da altri nodi. Un nodo deve connettersi a differenti pari per stabilire differenti percorsi nella rete: quest’ultimi non sono affidabili – i nodi vanno e vengono – dunque i nodi devono continuare a scoprire nuovi nodi man mano che perdono vecchie connessioni e man mano che aiutano altri nodi ad avviarsi. Basta una connessione per l’avviamento, ed è anche inutile e dispendioso di risorse di rete connettersi a più di una manciata di nodi. Dopo l’avviamento, un nodo ricorda le recenti connessioni andate a buon fine, così se viene riavviato ristabilisce agilmente le connessioni coi precedenti pari (se nessuno rispondesse alla richiesta di connessione, il nodo usa il seed per avviarsi nuovamente).

Full node

Nei primi anni di Bitcoin, tutti i nodi erano completi e attualmente il client Bitcoin Core è un nodo blockchain completo. I nodi completi mantengono una completa e aggiornata della blockchain con tutte le transazioni, che si formano indipendentemente e sono verificate, partendo con il primo blocco (genesis block) e costruendo l’ultimo blocco noto nella rete. Un full node può autonomamente e autorevolmente verificare ogni transazione senza ricorrere o affidarsi a qualsiasi altro nodo o fonte di informazioni. Un full node si basa sulla rete per ricevere aggiornamenti sui nuovi blocchi di operazioni, che poi verifica e incorpora nella propria copia locale della blockchain.

Exchanging inventory

La prima cosa che un nodo completo farà quando si collegherà ai pari è provare a costruire la blockchain completa. Se è un nodo nuovo e non ha alcuna blockchain, conosce solo un blocco (genesis block), che è incorporato nel client. A partire dal blocco n. 0, il nuovo nodo dovrà scaricare centinaia di migliaia di blocchi per sincronizzarsi con la rete e ristabilire l’intera blockchain. Il processo di sincronizzazione blockchain inizia con il version message, poiché contiene BestHeight, “l’altezza” attuale della blockchain. Il peer che ha la blockchain più lunga ha più blocchi dell’altro nodo e può identificare di quali blocchi l’altro nodo ha bisogno per “recuperare”: identificherà i primi 500 blocchi per condividere e trasmettere i loro hash usando un messaggio di inv (inventario). Il nodo mancante di questi blocchi li recupererà, inviando una serie di messaggi getdata che richiedono i dati di blocco completi e identificando i blocchi richiesti utilizzando gli hash dal messaggio inv (questo processo di comparazione della blockchain locale con i peer e il recupero di eventuali blocchi mancanti avviene ogni volta che un nodo va offline per qualsiasi periodo di tempo e inizia inviando getblocks).

Alessio Salvetti
Alessio Salvetti

Co-founder di Bcademy e board member (VP), Alessio è partner e board member di Impact Hub Trentino, uno dei 102 nodi del network mondiale. Dopo un'esperienza come docente di filosofia, abbandona l’insegnamento per coordinare un team di ricerca sui temi della connessione tra neuroscienze ed economia, prima di dedicarsi alla vera e propria creazione d’impresa. Business developer e consulente per numerose startup, bitcoiner per passione ed esperto di modeling e lean startup, è co-founder di Inbitcoin e responsabile per l’erogazione dei prodotti di Bcademy (CPO).

Utilizziamo i cookie per essere sicuri che tu possa avere la migliore esperienza sul nostro sito. Se continui ad utilizzare questo sito noi assumiamo che tu ne sia felice.