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