Alla fine del capitolo precedente il nodo ha raggiunto l’ultimo blocco e continua ad aggiornarsi. Il wallet, però, non lo sa. Finché nessuno cambia le sue impostazioni, per conoscere saldo, cronologia e conferme continua a interrogare il server scelto da chi ha sviluppato l’applicazione, e a quel server continua a far sapere quali indirizzi ci riguardano e da quale connessione arrivano le domande.
In questo capitolo colleghiamo il wallet alla macchina che abbiamo preparato attraverso un server Electrum ed escludiamo i server esterni. I passaggi schermata per schermata, con esempi su Umbrel e con i wallet più diffusi, stanno nella guida Collegare il wallet al proprio nodo: qui vediamo che cosa si fa e come funziona.
Come il wallet ottiene i dati
Un wallet custodisce le chiavi e costruisce le transazioni, ma non conserva la blockchain: questo è il compito del nodo. Per mostrare un saldo, quindi, deve chiedere a un nodo quali transazioni riguardano i suoi indirizzi, e lo stesso vale per inviare un pagamento.
Bitcoin Core verifica e conserva i blocchi, ma non li tiene ordinati per indirizzo. Per ricostruire lo storico di determinati indirizzi deve ripercorrere la catena a partire da una data e cercare, blocco per blocco, le transazioni che li riguardano: un’operazione che può essere lunga.
Un server Electrum, in appoggio al proprio nodo, risolve il problema con un indice. Legge l’intera blockchain dal nodo e registra input e output di ogni transazione, così sapere quali transazioni riguardano un indirizzo diventa una ricerca immediata, per qualunque indirizzo e per qualunque wallet. Il nodo resta la fonte dei dati e continua a verificare blocchi e transazioni; il server li organizza e li consegna ai wallet attraverso il protocollo Electrum, il linguaggio con cui molti wallet comunicano.
Un server Electrum esterno, per rispondere, viene a conoscere indirizzi e saldi di chi lo interroga; un server sulla nostra macchina tiene queste informazioni in casa.
Un server Electrum personale si installa accanto a Bitcoin Core quando il nodo è già sincronizzato, per esempio con Electrs, e al primo avvio legge dal nodo tutti i blocchi per costruire l’indice: il lavoro richiede ore, e finché non è concluso non è possibile collegare il wallet.
Collegare il wallet al server Electrum
Per collegare il wallet servono prima i dati di connessione del server. Dall’interfaccia del nodo si apre il server Electrum, per esempio l’app Electrs: la sua schermata mostra l’indirizzo da usare nella rete di casa, con la relativa porta, e un indirizzo .onion per quando il wallet è fuori casa. Vanno copiati da lì, perché cambiano da un’installazione all’altra.
Poi si apre il wallet e si cerca nelle impostazioni la voce dedicata alla connessione, che di solito si chiama Server, Rete o Nodo: al posto del server predefinito si inseriscono indirizzo e porta del nostro. In Sparrow si apre File → Settings e si sceglie la scheda Server: lì si seleziona Private Electrum, si inserisce l’indirizzo del nostro al posto di quello pubblico e con il pulsante Test Connection si prova subito il collegamento. In BlueWallet il percorso è Impostazioni → Rete → Server Electrum, e dopo il salvataggio può essere necessario riavviare l’app.
Alcuni wallet, come Electrum, scelgono il server in automatico e si collegano a più server contemporaneamente per ricevere le intestazioni dei blocchi. Finché questa selezione automatica resta attiva, il wallet può continuare a rivolgersi a server pubblici anche dopo aver ricevuto l’indirizzo del nostro. In Electrum si fa clic sull’icona colorata in basso a destra, che apre le informazioni sul server: lì si toglie la spunta dalla casella Auto e si inseriscono indirizzo e porta del nodo, in modo che il wallet parli con un solo server.
La seed phrase in questa operazione non entra. Cambia soltanto la fonte delle risposte: il wallet rilegge la propria cronologia dal nuovo server, e chiavi e indirizzi restano quelli di prima.
Quando il wallet esce di casa
L’indirizzo della rete di casa funziona solo dentro la rete di casa. Per raggiungere il nodo dal telefono quando siamo fuori non serve aprire porte del router verso internet, e l’interfaccia di controllo del nodo non va esposta in chiaro: un errore di configurazione metterebbe a rischio la sicurezza e la riservatezza dei dati.
Le strade sono due. Tor raggiunge il nodo senza aprire nulla ed è semplice da configurare, ma è più lento. Una rete privata fra i propri dispositivi, con programmi come Tailscale, collega il telefono al nodo da qualunque posto: il wallet usa l’indirizzo privato che la rete assegna al nodo, il collegamento è più veloce di Tor e il programma va installato sia sul nodo sia sul telefono.
Un block explorer sul proprio nodo
Collegare il wallet non elimina tutte le richieste a servizi esterni. Chi controlla un pagamento su un block explorer pubblico fa sapere al servizio quale transazione o quale indirizzo gli interessa, e da quale connessione arriva la ricerca: il sito non può rispondere senza ricevere la domanda.
Mempool, il software open source su cui funziona mempool.space, si può installare in un’istanza personale che legge i dati dal nostro nodo. Mostra blocchi, transazioni e mempool come il sito pubblico, ma la ricerca parte e si conclude sulla nostra macchina.
Che cosa resta fuori dal nodo
Con il wallet collegato, saldo, cronologia e conferme arrivano dalla nostra macchina, e le ricerche su indirizzi e transazioni non passano più da servizi esterni. Il nodo controlla che le transazioni rispettino le regole del protocollo, ma non sa se l’indirizzo che abbiamo incollato appartiene al destinatario giusto: un pagamento verso l’indirizzo sbagliato è una transazione valida come qualunque altra.
Il nodo non cambia nemmeno ciò che una transazione scrive sulla blockchain. Quali input vengono spesi insieme, quale output è il resto, quali indirizzi vengono riutilizzati: sono dati pubblici, qualunque server interroghi il wallet. Nel prossimo capitolo, Privacy on-chain in pratica, vediamo come etichette, indirizzi nuovi e coin control permettono di evitare che le nostre transazioni lascino sulla blockchain collegamenti leggibili da chiunque.