Glossario / Nodi e software
DNS seed
- Che cos'è un DNS seed?
- Un DNS seed è un nome di dominio che risponde con gli indirizzi IP dei nodi Bitcoin raggiungibili, dando a un nodo appena installato un punto da cui stabilire la sua prima connessione.
Bitcoin non ha un server di directory, quindi il nuovo software deve trovare la rete chiedendo. Bitcoin Core include una breve lista di nomi host di seed scritta nel codice, li risolve una volta, apre otto connessioni in uscita sulla porta 8333 e poi non ne ha più bisogno. Tutto ciò che viene dopo quel primo handshake si impara dai peer stessi.
Come funziona
Dietro ogni nome host di seed c'è un crawler, non un file statico.
L'operatore esegue un software che percorre la rete peer-to-peer, prova a connettersi a ogni indirizzo di cui viene a conoscenza e registra quali hanno risposto di recente. Il nome host si risolve poi in record A e AAAA presi da quel pool, un paio di dozzine di indirizzi per query, con un time to live breve così che le risposte continuino a ruotare. Alcuni seed gestiscono anche il filtro per service bit, così un nodo che ha bisogno di peer che offrono filtri compatti dei blocchi può chiedere un sottodominio che restituisce solo quelli.
I nomi host si trovano nel codice sorgente di Bitcoin Core, in kernel/chainparams.cpp, con una lista separata per ogni rete. La lista della mainnet è mantenuta da persone identificate per nome: seed.bitcoin.sipa.be è gestito da Pieter Wuille, dnsseed.bluematt.me da Matt Corallo, seed.btc.petertodd.net da Peter Todd. Tenere la lista corta e attribuibile è una scelta deliberata, perché l'operatore di un seed sceglie chi incontri.
Al primo avvio il nodo risolve quei nomi, riempie il suo gestore degli indirizzi e apre otto connessioni in uscita a relay completo più due connessioni solo per il relay dei blocchi, che non trasportano il gossip delle transazioni e sono più difficili da notare per un osservatore. Da quel momento raccoglie indirizzi tramite i messaggi getaddr e addr e li memorizza nella cache in peers.dat, così i riavvii successivi saltano del tutto la ricerca. Se tutti i seed sono irraggiungibili, Core ricorre a una lista di indirizzi fissi di nodi compilata nel binario, e puoi aggirare l'intero meccanismo con dnsseed=0 più una voce seednode o addnode che punta a un peer di cui ti fidi già.
Dove lo vedi
L'unica volta in cui la maggior parte delle persone nota un DNS seed è nelle prime righe del log di debug di un nodo.
Avvia bitcoind su una macchina senza peers.dat e il log registra che sta caricando indirizzi dai DNS seed, poi il numero di connessioni sale da zero. Puoi fare la stessa ricerca da terminale con dig, che restituisce lo stesso insieme rotante di indirizzi IP che otterrebbe il tuo nodo.
C'è un costo per la privacy che vale la pena conoscere. La ricerca è una normale query DNS non cifrata, quindi il tuo resolver e il tuo provider internet possono vedere che sulla tua connessione si sta avviando un nodo bitcoin, anche se la query non rivela nulla sul tuo wallet né sul tuo saldo. Se la cosa ti disturba, esegui il nodo tramite Tor oppure imposta dnsseed=0 e fornisci tu stesso il primo peer.
La questione della fiducia è più ristretta di quanto sembri. Un seed ostile non può falsificare un blocco o una transazione, perché il tuo nodo verifica tutto ciò che riceve rispetto alla propria copia delle regole. Quello che potrebbe fare è restituire solo indirizzi che gestisce, isolandoti dalla rete onesta: per questo Core interroga diversi seed, distribuisce le sue connessioni su intervalli di rete diversi e mantiene quei collegamenti solo per il relay dei blocchi come discreto secondo parere.
DNS seed vs frase di recupero
Un DNS seed è un nome host pubblico per trovare peer; una frase di recupero è la sequenza segreta di 12 o 24 parole che dà il controllo dei tuoi bitcoin. Condividono una parola e nulla più. Nulla di un DNS seed è riservato, nulla di esso tocca il tuo wallet, e nessun passo legittimo di configurazione ti chiederà mai di digitare le parole della tua frase di recupero in una schermata di configurazione di rete.