Mappa della rete Bitcoin
Una "mappa" per aiutarti a navigare attraverso l'ampia varietà di nodi, software e partecipanti alla rete Bitcoin.
Traduzione dall’originale di Glozia Zhao - pubblicato il 13 lug 2020
Una "mappa" per aiutarti a navigare attraverso l'ampia varietà di nodi, software e partecipanti alla rete Bitcoin.
La rete Bitcoin è spesso descritta come peer-to-peer (P2P), distribuita o decentralizzata. O qualcosa di simile che suggerisca una variazione nei tipi di vertici e spigoli:
Ma cos'è un nodo e cosa fa? È un server o può essere un client... o entrambi? Data la miriade di software Bitcoin, cosa "conta" come nodo? Come interagiscono tra loro tutti i partecipanti a Bitcoin: utenti, minatori, nodi, portafogli?
Questo articolo disegna una mappa della rete Bitcoin che chiarisce queste definizioni e racchiude parte della complessità. Inizieremo classificando i diversi tipi di nodi in base alla loro funzionalità di server/client e descrivendo le connessioni P2P che si formano tra loro. Invece di fornire statistiche sull'intera rete, questo articolo è principalmente interessato a enumerare le diverse possibilità presenti nella rete.
La risposta breve
In primo luogo, i vertici sono i nodi della rete P2P e gli spigoli sono le loro connessioni P2P. Esistono diversi tipi di nodi che possono essere classificati in base alla loro capacità di servire altri peer e client; i nodi possono agire come server, client o entrambi in qualsiasi momento.
Nodo = un partecipante sulla rete P2P che implementa il protocollo P2P Bitcoin. Un nodo non è necessario per eseguire alcun software specifico fintanto che segue questo protocollo.
Connessione P2P = una connessione di rete stabilita direttamente tra due nodi che comunicano utilizzando il protocollo Bitcoin P2P. Spesso usiamo "peer" per riferirci ad altri nodi con cui un nodo ha una connessione P2P.
Tipi di nodi
In senso lato, i nodi rientrano in una delle quattro categorie in base alla quantità di stato che mantengono e ai servizi che possono fornire.
Full Node (Fully Validating Node) = un nodo in grado di convalidare transazioni e blocchi. Invece di cercare ogni volta nel database dei blocchi, i nodi completi mantengono un certo stato, ad esempio un insieme di UTXO (unspent transaction output o "coins").
Pertanto, i nodi Bitcoin non hanno necessariamente bisogno di una copia completa della blockchain per poterla convalidare, purché mantengano alcuni metadati dei blocchi e un set UTXO aggiornato. I Pruning Nodes attuano esattamente questo comportamento: scaricano ed elaborano i blocchi per costruire i database necessari alla convalida, quindi scartano i vecchi blocchi per risparmiare spazio su disco. Poiché dispongono di tutte le informazioni e possono convalidare tutti i nuovi blocchi e le transazioni, sono nodi completi.
Archive Node = un nodo che possiede una copia dell'intera storia della blockchain. Questi nodi sono in grado di convalidare le transazioni e i blocchi in entrata, nonché di interrogare i dati dei blocchi e delle transazioni da qualsiasi punto della storia, compresi quelli che non sono più rilevanti per la convalida (da qui il nome "archivio"). È fondamentale che esistano nodi di archivio, poiché i nuovi nodi devono recuperare l'intera cronologia per diventare nodi completi. Possono farlo solo scaricando la cronologia, un blocco alla volta, dai nodi di archivio.
Mining Node = un nodo che produce nuovi blocchi. Ciò comporta il mantenimento di un mempool delle transazioni non confermate, la convalida delle nuove transazioni e la risoluzione del puzzle hash della Proof-of-Work (cioè la ricerca del nonce) per costruire un blocco. I nodi minerari spesso utilizzano hardware aggiuntivo che li assiste nella risoluzione del puzzle hash (ad esempio ASIC) o partecipano a pool di mining. Tecnicamente, esistono anche nodi non completi che si uniscono a un pool di mining, si connettono a un nodo completo che gestisce il pool e aiutano a risolvere il PoW su un blocco senza effettuare alcuna convalida (quindi esistono nodi di mining ma non completi).
Light Client = termine generico per indicare un nodo che non conserva lo stato completo necessario per la convalida completa e si affida ad altri nodi completi per farlo. Un client leggero può conservare una quantità limitata di dati per verificare le proprie transazioni, ma non convalidare completamente tutti i blocchi. All'interno di Bitcoin Core, il termine "light client" è spesso usato come sinonimo di nodi SPV (Simplified Payment Verification) e non deve essere confuso con i nodi Pruning. In alcuni contesti, questi non sono chiamati "nodi" perché non fanno la maggior parte delle cose che fanno i nodi [completi].
Ecco un'illustrazione di come queste categorie si sovrappongono:
Altri concetti per i nodi
I nodi possono avere anche altre caratteristiche che influiscono sulla loro partecipazione alla rete, ma che non si escludono a vicenda o in nessuna delle quattro categorie precedenti. Data la natura decentralizzata e l'attenzione all'accessibilità dell'ecosistema Bitcoin, finché un nodo implementa il protocollo P2P e rispetta le regole del consenso, i dettagli dell'implementazione e la decisione di adottare caratteristiche sono a discrezione dell'operatore del nodo.
Initial Block Download (IBD): uno stato temporaneo in cui il nodo non ha ancora raggiunto l'altezza del blocco corrente e sta scaricando la blockchain. Un nodo completo che segnala di conservare una copia completa della cronologia della blockchain può essere ancora in IBD e quindi essere limitato nei servizi che può fornire (cioè non sarà in grado di fornire informazioni sulle transazioni che non ha ancora visto). L'RPC getblockchaininfo restituisce se un nodo è in IBD.
Block Only Mode: una modalità non temporanea in cui il nodo completo convalida solo i blocchi e le transazioni in essi contenute. Non convalida alcuna transazione non confermata (a parte la propria), non mantiene un mempool e chiede ai suoi pari di non trasmettergli le transazioni.
Bitcoin Core: che esegue il software open-source originariamente scritto da Satoshi Nakamoto e attualmente mantenuto da vari collaboratori, reperibile su bitcoincore.org o alla fonte. Sappiamo che Bitcoin Core non è l'unico software esistente nella rete P2P Bitcoin; alcuni nodi eseguono patch personalizzate che implementano comportamenti specifici e alcuni potrebbero utilizzare versioni precedenti di Bitcoin Core che non comprendono i nuovi messaggi di protocollo introdotti. È importante essere consapevoli di quali nuove funzionalità richiedono la piena cooperazione della rete, non aspettarsi che i nodi si comportino in modo corretto o onesto e tenere conto del fatto che gli operatori dei nodi sono esitanti o lenti ad aggiornare il loro software.
Dannoso: qualsiasi tipo di comportamento che danneggi intenzionalmente la rete (esclusi bug, complicazioni di rete o altri comportamenti non intenzionali). Bitcoin presuppone un ambiente altamente avverso che include la possibilità di attacchi Denial of Service, attacchi sybil/eclipse volti a raddoppiare le spese, nodi spia che cercano di deanonimizzare gli indirizzi, ecc.
Nodo come Server
Abbiamo visto che ogni singolo nodo dipende dai suoi pari per inviare le informazioni di cui ha bisogno. Inoltre, i nodi servono tipicamente un certo numero di utenti e di software client attraverso interfacce non-P2P, come RPC, HTTP/REST e un'interfaccia grafica.
Alcuni esempi di client non nodo che possono utilizzare un nodo come server:
Utenti che eseguono un nodo per inviare e ricevere bitcoin.
Portafogli che gestiscono chiavi, creano transazioni e forse mantengono uno stato UTXO associato a tali chiavi, ma non hanno una copia della blockchain e si affidano a un nodo per ottenere informazioni aggiornate.
Servizi e applicazioni software rivolti agli utenti come gli esploratori di blocchi, gli scambi e i commercianti che interrogano i nodi completi per ottenere informazioni e visualizzarle su una pagina web o un'applicazione.
Sviluppatori creare nodi in modalità regtest per testare la funzionalità o le interfacce stesse.
Software rivolto agli sviluppatori come SDK, API e altre interfacce. Ad esempio, la Bitcoin Core CLI (bitcoin-cli) utilizza l'interfaccia RPC per implementare un'interfaccia a riga di comando.
Sebbene queste connessioni non siano viste dai peer di un nodo sulla rete P2P, costituiscono una parte significativa delle funzionalità di Bitcoin. Gli sviluppatori di Bitcoin Core tengono in grande considerazione questi partecipanti quando sviluppano nuove funzioni o decidono quali funzioni supportare.
Ora che abbiamo capito che il nodo è sia un server che un client, ecco come appare un singolo nodo ad alto livello:
Tipi di connessioni P2P
Le connessioni P2P in Bitcoin "parlano tutte la stessa lingua", in quanto utilizzano tutte il protocollo P2P per comunicare, ma sono diverse nei contenuti delle loro conversazioni. L'implementazione di Bitcoin Core cerca di bilanciare la stabilità (che preferisce connessioni statiche) e l'accessibilità (che incoraggia l'accettazione di connessioni da parte di nuovi nodi) facilitando la scoperta dei peer e gestendo le connessioni con attenzione. Bitcoin Core distingue tre tipi principali di connessioni in base al modo in cui vengono avviate, che spesso informa la natura della relazione peer-to-peer.
In uscita (outbound) = connessione automatica avviata dal proprio nodo attraverso la peer discovery. La scoperta dei nodi comporta l'ottenimento di un elenco di indirizzi IP di nodi consolidati per iniziare, quindi un processo continuo e dinamico di pubblicizzazione del proprio indirizzo e di tentativo di connessione agli indirizzi di cui si viene a conoscenza. A seconda delle esigenze del nodo (ad esempio, in IBD), può dare priorità alle connessioni in grado di fornire servizi specifici (ad esempio, servire blocchi e transazioni precedenti).
In entrata (Inbound) = connessione automatica avviata dal peer (per il peer, questa connessione è in uscita). Per motivi di sicurezza, il traffico in entrata è disabilitato per impostazione predefinita ed è necessario configurare alcune impostazioni di rete e firewall per abilitarlo.
Manuale = connessione effettuata manualmente (ad esempio tramite CLI o RPC) anziché automaticamente. Si potrebbe creare una connessione manuale perché c'è un nodo particolare gestito da qualcuno di cui ci si fida o perché si sta testando il software e si ha bisogno di avere il controllo sulle connessioni.
Altri concetti per le connessioni P2P
Diversità nelle connessioni in uscita (Outbound)
Le connessioni in uscita possono essere suddivise in ulteriori categorie in base alle informazioni ricevute e alla durata della connessione.
Le connessioni in uscita Full-Relay si aspettano di comunicare tutto, compresi i blocchi, le transazioni e gli indirizzi (usati per trovare i peer, simili agli indirizzi IP e da non confondere con gli indirizzi dei portafogli usati nelle transazioni). Le connessioni in uscita Block-Only-Relay si aspettano di ricevere solo blocchi. Non va confusa con la modalità solo blocchi; è del tutto normale che i nodi completi stabiliscano connessioni Block-Only-Relay con 1-2 peer e connessioni Full-Relay con tutti gli altri.
One-Shot e Feelers sono connessioni temporanee in uscita utilizzate per la scoperta dei nodi. Le connessioni One-Shot sono utilizzate per sollecitare un elenco di indirizzi che possono essere utilizzati per trovare nuovi peer. I Feelers sono usati per verificare se un indirizzo corrisponde a un nodo reale.
Differenze individuali
Come abbiamo visto, ogni nodo può fornire servizi diversi e cercare informazioni specifiche dai suoi pari. Ogni connessione inizia con un handshake di versione in cui i nodi inviano informazioni su se stessi (ad esempio, la migliore altezza del blocco) e negoziano di cosa parlare (ad esempio, sono interessati solo ai blocchi). Le connessioni possono anche cambiare attraverso messaggi successivi, come ad esempio un messaggio di filtro sulle commissioni per comunicare che sono interessati a ricevere solo transazioni con una tariffa minima.
Scoraggiamento, disconnessione e divieto
I nodi Bitcoin Core tengono traccia di quali peer si comportano in modo tale da indicare che potrebbero essere malintenzionati o che stanno eseguendo un software malfunzionante. In risposta a tale comportamento, un nodo può scegliere di scoraggiare (contrassegnare il comportamento scorretto e forse disconnettersi a favore di nuovi peer), disconnettere o bandire il peer.
Autorizzazioni e whitelist
I nodi conservano anche un elenco di permessi che ogni peer possiede, come ad esempio particolari servizi che è autorizzato a richiedere o la tolleranza per comportamenti scorretti che normalmente verrebbero penalizzati. I servizi sono negoziati per ogni connessione durante l'handshake di versione. La tolleranza per i comportamenti scorretti è spesso aggiunta manualmente per i client light personalizzati e per i nodi gestiti da persone che si fidano l'una dell'altra. Inoltre, i nodi possono inserire nella whitelist particolari indirizzi IP.
Importanza dell'asimmetria
Si noti che ogni singola connessione è bidirezionale ma asimmetrica: il peer iniziatore può capire che la connessione è un [full-relay] outbound, un block-only-relay, un feeler o un one-shot, ma il peer ricevente vede solo una connessione inbound con alcune regole stabilite. Questo nasconde le informazioni attraverso l'ambiguità sul fatto che il comportamento di un nodo riveli la sua meccanica interna o rifletta semplicemente la natura della connessione.
Ad esempio, se un nodo sa che il suo peer è in modalità blocksonly (cioè rifiuta tutti i messaggi di transazione in entrata), è ovvio che tutte le transazioni inviate da quel peer corrispondono ai suoi indirizzi di portafoglio. Invece, il nodo ricevente vede solo una connessione in entrata con il relay delle transazioni disattivato. Questo potrebbe significare una modalità blocksonly, una connessione block-relay-only o un'idiosincrasia della connessione.
Una vista più dettagliata di un singolo nodo potrebbe apparire come questa (si noti che le direzioni delle frecce indicano solo quale nodo inizia, non che la comunicazione non è bidirezionale):
Mappa "completa"
Ogni nodo ha informazioni limitate sulla rete nel suo complesso. I nodi vedono solo i propri peer e i peer potrebbero mentire sul tipo di nodo che sono. Tutti i peer potrebbero anche essere la stessa persona, nel caso di un attacco di tipo eclipse. Questo è un vantaggio per la privacy e la sicurezza, perché vale anche per gli avversari: avere informazioni limitate rende più difficili gli attacchi mirati. È possibile raccogliere informazioni approssimative sul numero di nodi presenti nella rete creando molte connessioni temporanee, ma queste informazioni sono tutt'altro che complete.
Ad esempio, il fatto che un nodo partecipi o meno a un pool di mining non è immediatamente visibile sulla rete. Con una conoscenza approssimativa di quali nodi fanno parte di pool di mining e osservando quanti blocchi estraggono, alcuni siti web sono in grado di generare analisi sulle proporzioni di potenza di calcolo. Tuttavia, possono essere fuorvianti, poiché è del tutto possibile che gruppi di nodi o addirittura pool di mining multipli siano gestiti da un'unica entità.
Mettendo tutto insieme, possiamo immaginare questa mappa di rete semplificata:
Questa mappa rappresenta varie possibilità invece della dimensione della rete (che è molto grande) o della topologia (che è dinamica e sconosciuta). Si noti che le possibilità includono:
Un nodo completo Bitcoin Core con vari client connessi tramite interfacce non-P2P, ad esempio un utente che ha scaricato il software da bitcoincore.org e utilizza la riga di comando o la GUI per inviare e ricevere monete.
Client leggeri che fanno del loro meglio per connettersi a una serie di nodi completi al fine di servire i propri clienti.
Un nodo completo che serve uno o più client leggeri, magari un singolo appassionato di Bitcoin che gestisce un nodo completo utilizzando un fornitore di servizi cloud e un'applicazione più leggera sul proprio dispositivo personale.
Un nodo completo personalizzato (ad esempio, un gestore di pool) collegato a un gruppo di client leggeri personalizzati (ad esempio, singoli partecipanti a un pool) attraverso la rete P2P e una rete privata.
Conclusione
Spero che questo post abbia contribuito a chiarire cosa si intende quando si parla di "nodo" e di "rete P2P" e a chiarire come tutti i partecipanti alla rete interagiscono tra loro. Spero anche di aver fornito alcuni spunti e "spunti di riflessione" su come Bitcoin Core implementa le connessioni peer-to-peer per proteggere la privacy e consentire la partecipazione di nuovi nodi. Grazie per aver letto! :)
21 milioni di ringraziamenti a John Newbery e Amiti Uttarwar per essere stati molto generosi con il loro tempo aiutandomi a comprendere e documentare queste informazioni.
Come acquistare Bitcoin?
Personalmente, reputo il miglior servizio quello offerto da Relai.
Per acquistare bitcoin risparmiando lo 0,5% in commissioni puoi usare il codice “REL3166”.
Si tratta di un’applicazione sviluppata da un’azienda svizzera che applica una politica di KYC light: a differenza dei grandi exchange non richiede registrazioni o dati personali, tutto ciò che serve per acquistare è il tuo IBAN.
E’ lo strumento ottimale per impostare dei piani di accumulo (DCA).
Per ridurre al massimo le commissioni di acquisto, ti consiglio di:
effettuare acquisti maggiori di 100€ (-0,5%)
impostare un piano di accumulo settimanale o mensile (-0,5%)
applicare il codice invito REL3166 (-0,5%)
Una delle migliori caratteristiche è il servizio non-custodial. Gli euro bonificati a Relai vengono convertiti automaticamente in bitcoin e trasferiti su un wallet di cui sei solo tu ad avere il controllo. I grossi exchange, al contrario, non forniscono le chiavi private ai clienti. In più Relai non vende centinaia di inutili criptovalute, ma solo bitcoin.
Cosa ci guadagno? Quello che fanno guadagnare i referral code. In questo caso se acquisti usando il codice “REL3166” risparmi lo 0,5% sulle commissioni e io ricevo (in bitcoin) lo 0,5% dell’importo che hai deciso di investire.
Per ulteriori informazioni, o per effettuare il primo acquisto, premi sul pulsante sottostante e ti verrà mostrata una dettagliata guida in italiano.
NOTA - Questo NON è un messaggio pubblicitario. Relai è un servizio che utilizzo personalmente e che reputo tra i migliori sul mercato in termini di affidabilità, sicurezza e facilità d’uso. Lo consiglio spesso ad amici e parenti.