Come già visto nell’introduzione dell’episodio 1, in questa serie di articoli vediamo come creare e mantenere attivo un full node di Bitcoin. Oggi andremo ad installare, configurare ed avviare il cuore del nostro nodo, ovvero Bitcoin Core.
Installazione e configurazione
Accediamo al nostro server con l’utente giuseppe e rechiamoci nella directory temporanea (che si svuota ad ogni riavvio):
cd /tmp
Impostiamo una variabile d’ambiente con il numero della versione di Bitcoin Core, digitiamo quindi:
VERSION="29.2"
💡Nota:
Per ottenere l’ultima versione ci basterà collegarci al sito 👉🏻 https://bitcoincore.org/en/download/ e verificare il numero.
A questo punto andiamo ad installare il file binario con le rispettive firme:
wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/bitcoin-$VERSION-aarch64-linux-gnu.tar.gz
wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/SHA256SUMS.asc
Verifichiamo che il checksum di riferimento nel file SHA256SUMS, corrisponda al checksum che abbiamo calcolato noi:
sha256sum --ignore-missing --check SHA256SUMS

Adesso andiamo a controllare le firme, le versioni di Bitcoin Core sono firmate da più individui, ognuno usando la propria chiave. Per verificare la validità di queste firme, è necessario prima importare le chiavi pubbliche corrispondenti nel database delle chiavi GPG:
curl -s "https://api.github.com/repositories/355107265/contents/builder-keys" | grep download_url | grep -oE "https://[a-zA-Z0-9./-]+" | while read url; do curl -s "$url" | gpg --import; done
Riceveremo a video una serie di stringhe di firme valide come queste:

Verifichiamo che il file checksums sia firmato crittograficamente dalle chiavi di firma del rilascio:
gpg --verify SHA256SUMS.asc
Riceveremo a video una serie di stringhe di firme valide come queste, dobbiamo verificare che alcune firme mostrino il seguente testo gpg: Good signature from...:

Una volta effettuati i controlli, dobbiamo estraiamo i file binari di Bitcoin Core:
tar -xvf bitcoin-$VERSION-aarch64-linux-gnu.tar.gz
Adesso passiamo all’installazione:
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-$VERSION/bin/*
Verifichiamo che l’installazione sia avvenuta con successo attraverso il comando bitcoin-cli, quindi da terminale digitiamo:
bitcoin-cli --version

Passiamo adesso alla creazione di un utente ed un gruppo (in questo tutorial verranno chiamati “bitcoin”). L’utente non avrà una password e nessun privilegio a differenza dell’utente “giuseppe” che ha i privilegi di root., l’unico modo che avremo per poter accedere all’ utente “bitcoin” sarà attraverso “giuseppe”:
sudo adduser --gecos "" --disabled-password bitcoin
Aggiungiamo l’utente “giuseppe” al gruppo “bitcoin”:
sudo adduser giuseppe bitcoin
Consentiamo adesso, l’utente “bitcoin” ad utilizzare la porta di controllo e configurare Tor direttamente aggiungendolo al gruppo debian-tor:
sudo adduser bitcoin debian-tor
Creiamo la cartella bitcoin sotto “/data” creata in precedenza, Bitcoin Core utilizza per impostazione predefinita la cartella “.bitcoin” nella directory /home dell’utente.
Per poter creare la cartella bitcoin (assicuriamoci di essere l’utente “giuseppe”) e digitiamo:
mkdir /data/bitcoin
Assegniamo come proprietario della directory l’utente “bitcoin”:
sudo chown bitcoin:bitcoin /data/bitcoin
Adesso effettuiamo il login nell’utente “bitcoin”:
sudo su - bitcoin
Creiamo un link simbolico “.bitcoin” che punti a quella directory:
ln -s /data/bitcoin /home/bitcoin/.bitcoin
Verifichiamo che sia stato creato correttamente il link simbolico:
ls -la .bitcoin

Con l’utente “bitcoin” rechiamoci nella directory “.bitcoin” per iniziare a generare le password, che ci serviranno successivamente per il collegamento ai vari wallet:
cd .bitcoin
Scarichamo il programma RPCAuth da github:
wget https://raw.githubusercontent.com/bitcoin/bitcoin/master/share/rpcauth/rpcauth.py
Adesso lanciamo lo script con il comando python3 ed aggiungiamo un nome utente (nel caso di questa guida sarà bitcoin):
python3 rpcauth.py bitcoin

Copiamo l’output ed andiamo a creare un file per memorizzarlo:
nano rpc.pw
Inseriamo all’interno la risposta precedentemente copiata e successivamente salviamo con CTRL + X e confermiamo con Y.
Adesso rendiamo accessibile il file solo all’utente “bitcoin”:
chmod 400 rpc.pw
Ora, andiamo a crere il file di configurazione bitcoind:
nano /home/bitcoin/.bitcoin/bitcoin.conf
Incolliamo il seguente contenuto:
# Demone di Bitcoin
server=1
txindex=1
# Commento personalizzato (opzionale)
uacomment=giuxfila-nodo
# Consentiamo la creazione di wallet legacy
deprecatedrpc=create_bdb
# Rete
listen=1
listenonion=1
proxy=127.0.0.1:9050
bind=127.0.0.1=onion
i2psam=127.0.0.1:7656
onlynet=onion
onlynet=i2p
onlynet=ipv4
onlynet=ipv6
# Connessione
rpcauth=<Inseriamo qui la stringa salvata su rpc.pw>
rpccookieperms=group
# Ottimizzazioni per ARM
maxconnections=40
maxuploadtarget=5000
# Ottimizzazioni per il sync iniziale:
# consigliato: dbcache=1/2 x RAM disponibile, ad esempio: 4GB RAM -> dbcache=2048)
dbcache=2048
blocksonly=1
Salviamo il file con CTRL + X e confermiamo con Y.
Adesso impostiamo le autorizzazioni di lettura solo per l’utente “bitcoin” ed i membri del gruppo “bitcoin”:
chmod 640 /home/bitcoin/.bitcoin/bitcoin.conf
Usciamo dall’utente “bitcoin”:
exit
Per poter eseguire automaticamente il demone di bitcoin in background, dobbiamo creare un servizio con systemd:
sudo nano /etc/systemd/system/bitcoind.service
Incolliamo il seguente contenuto:
[Unit]
Description=Bitcoin daemon
After=network.target
[Service]
ExecStart=/usr/local/bin/bitcoind -daemon \
-pid=/run/bitcoind/bitcoind.pid \
-conf=/home/bitcoin/.bitcoin/bitcoin.conf \
-datadir=/home/bitcoin/.bitcoin \
-startupnotify="systemd-notify --ready"
Type=forking
PIDFile=/run/bitcoind/bitcoind.pid
Restart=on-failure
TimeoutSec=300
RestartSec=30
User=bitcoin
UMask=0027
RuntimeDirectory=bitcoind
RuntimeDirectoryMode=0710
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
PrivateDevices=true
MemoryDenyWriteExecute=true
[Install]
WantedBy=multi-user.target
Salviamo il file con CTRL + X e confermiamo con Y. Adesso abilitiamo l’avvio automatico (in caso di reboot o shutdown del sistema):
sudo systemctl enable bitcoind.service
Avviamo adesso il servizio, con il comando systemct:
sudo systemctl start bitcoind.service
Da questo momento il è in esecuzione ed impiegherà qualche giorno prima che sarà completamente sincronizzato. Per controllare lo stato del nodo e della sincronizzazione ci basterà interrogare il servizio con il comando:
journalctl -fu bitcoind

Attendiamo qualche minuto affinché il nodo inizi a sincronizzare ed iniziamo ad annotare il nostro indirizzo .onion per eventuali collegamenti esterni.
Accediamo con l’utente “bitcoin”:
sudo su - bitcoin
Digitiamo sul terminale il seguente comando:
bitcoin-cli getnetworkinfo | grep address.*onion && bitcoin-cli getnetworkinfo | grep address.*i2p
Riceveremo l’indirizzo in formato .onion

Verifichiamo la corretta abilitazione delle reti I2P e Tor:
bitcoin-cli -netinfo

Ed assicuriamoci che bitcoind sia in ascolto sulle porte RPC e P2P predefinite, quindi con l’utente “giuseppe” digitiamo:
sudo ss -tulpn | grep bitcoind

Sincronizzazione iniziale
Se tutto funziona senza intoppi, il nostro nodo inizierà a sincronizzare i blocchi. Per verificare l’avanzamento ci basterà collegarci sul nostro terminale con l’utente “giuseppe” e digitare:
sudo tail -f /data/bitcoin/debug.log

Bitcoin Core sincronizzato
Una volta terminata la sincronizzazione iniziale di Bitcoin Core, in media 10-15 giorni, ci ritroveremo questa schermata:

A questo punto possiamo ridurre le dimensioni della cache del database precedentemente aumentate. Rechiamoci (con l’utente “bitcoin”) nella cartella principale “.bitcoin” e modifichiamo il file di configurazione bicoin.conf:
nano .bitcoin/bitcoin.conf
Aggiungiamo un commento (ovvero il simbolo del cancelletto #) così come di seguito:

Usciamo dall’utente “bitcoin”:
exit
E rendiamo effettive le modifiche riavviando il demone di bitcoin:
sudo systemctl restart bitcoind
Verifichiamo che tutto funzioni con il comando:
journalctl -fu bitcoind
Update di Bitcoin Core
Verifichiamo sempre l’ultima versione presente di Bitcoin Core (https://bitcoincore.org/en/download/).
Stoppiamo momentaneamente il servizio bitcoind, dal terminale con l’utente “giuseppe” digitiamo:
sudo systemctl stop bitcoind.service
Adesso, accediamo nella directory temporanea /tmp:
cd /tmp
Impostiamo una nuova variabile d’ambiente con la versione:
VERSION=29.2
Scarichiamo il file binario, checksum e firma:
wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/bitcoin-$VERSION-x86_64-linux-gnu.tar.gz
wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/SHA256SUMS.asc
Verifichiamo che il checksum di riferimento nel file SHA256SUMS, corrisponda al checksum calcolato da noi:
sha256sum --ignore-missing --check SHA256SUMS

Come già visto in fase di installazione andiamo a controllare le firme,
curl -s "https://api.github.com/repositories/355107265/contents/builder-keys" | grep download_url | grep -oE "https://[a-zA-Z0-9./-]+" | while read url; do curl -s "$url" | gpg --import; done
Ri-verifichiamo che il file checksums sia firmato crittograficamente dalle chiavi di firma del rilascio.
gpg --verify SHA256SUMS.asc
Riceveremo a video una serie di stringhe di firme valide come queste, dobbiamo verificare che alcune firme mostrino il seguente testo gpg: Good signature from...:

Effettuati i controlli, dobbiamo estrarre il file binario di Bitcoin Core aggiornato:
tar -xvf bitcoin-$VERSION-aarch64-linux-gnu.tar.gz
Adesso passiamo all’installazione::
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-$VERSION/bin/*
Verifichiamo che l’installazione sia avvenuta con successo attraverso il comando bitcoin-cli:
bitcoin-cli --version

Perfetto, il nostro Bitcoin Core è stato correttamente aggiornato, possiamo avviare nuovamente il servizio:
sudo systemctl start bitcoind.service
