Guida all'installazione di un full node con Bitcoin Core: Bitcoin Core (Ep. 2)

Crypto 13 ott 2024

Come giร  spiegato nell'intrudizione dell'episodio 1, (se te lo sei perso vallo a leggere Guida all'installazione di un full node con Bitcoin Core: Operazioni Preliminari (Ep. 1) in questa serie di articoli vediamo come creare e mantenere attivo un full node di Bitcoin. Oggi vedremo come installare, configurare ed avviare il cuore del nostro nodo, ovvero Bitcoin Core.


Accediamo al nostro server con l'utente "giuseppe" e rechiamoci nella directory temporanea (che si svuota ad ogni reboot):

cd /tmp

Impostiamo una variabile d'ambiente con il numero della versione di Bitcoin Core (per verificare l'ultima versione disponibile ci basterร  andare nel repository ufficiale GitHub di Bitcoin Core https://github.com/bitcoin/bitcoin/releases/). Nel caso di questo tutorial l'ultima versione รจ la 27.1, quindi da terminale digitiamo:

VERSION=27.1

Adesso installiamo i file binari con le rispettive firme con i seguenti comandi:

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
ATTENZIONE: le stringhe sono relative all'archittetura AMD64, nel caso tu stia eseguendo la tua installazione su una macchina ARM (come un Raspberry Pi), modifica il campo sotto arch=<ARCHITECTURE> con arm64.

Verifichiamo che il checksum di riferimento nel file SHA256SUMS, corrisponde al checksum calcolato da noi:

sha256sum --ignore-missing --check SHA256SUMS

La risposta che riceveremo a video sarร  la seguente:
"bitcoin-27.1-x86_64-linux-gnu.tar.gz: OK"
A questo punto 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:
gpg: directory '/home/giuseppe/.gnupg' created
gpg: keybox '/home/giuseppe/.gnupg/pubring.kbx' created
gpg: key 188CBB2648416AD5: 6 signatures not checked due to missing keys
gpg: /home/giuseppe/.gnupg/trustdb.gpg: trustdb created
gpg: key 188CBB2648416AD5: public key ".0xB10C
b10c@b10c.me" imported
gpg: Total number processed: 1
gpg: imported: 1
......

Verifichiamo che il file checksums sia firmato crittograficamente dalle chiavi di firma del rilascio.

gpg --verify SHA256SUMS.asc

Dovrร  uscire a video questa risposta:
gpg: Good signature from...
Primary key fingerprint:...

Effettuati i controlli, dobbiamo estrarre i file binari di Bitcoin Core:

tar -xzvf bitcoin-$VERSION-x86_64-linux-gnu.tar.gz

Successivamente, andiamo ad installarli con il seguente comando:

sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-$VERSION/bin/bitcoin-cli bitcoin-$VERSION/bin/bitcoind

Verifichiamo che l'installazione sia avvenuta con successo attraverso il comando bitcoind, quindi da terminale digitiamo:

bitcoind --version

Se tutto รจ stato installato correttamente riceveremo la seguente risposta:

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

Adesso 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") 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" attraverso il comando:

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 con il comando:

ls -la .bitcoin

Riceveremo questa risposta:
lrwxrwxrwx 1 bitcoin bitcoin 13 Oct 10 12:40 .bitcoin -> /data/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

Riceveremo questa risposta:
String to be appended to bitcoin.conf:
rpcauth=bitcoin:00d....
Your password:
xyzpassword

Copiamo e salviamo lโ€™ output in un file, quindi sul terminale:

nano rpc.pw

Inseriamo all'interno la risposta precedentemente scritta e successivamente salviamo con CTRL + X e confermiamo con Y.
Adesso rendiamo accessibile il file all'utente "bitcoin":

chmod 400 rpc.pw

Ora, creiamo il file di configurazione bitcoind. Creiamo il file bitcoin.conf:

nano /home/bitcoin/.bitcoin/bitcoin.conf
# Bitcoin daemon
server=1
txindex=1

# Aggiunge un commento personalizzato
uacomment=giuxfila node

# Disabilita il wallet integrato
disablewallet=1

# Logs aggiuntivi
debug=tor

# Assegnare il permesso di lettura del file cookie agli utenti del gruppo Bitcoin
startupnotify=chmod g+r /home/bitcoin/.bitcoin/.cookie

# Disabilitiamo debug.log
nodebuglogfile=1

# Evitare di assumere che un blocco e i suoi antenati siano validi,
# e potenzialmente saltare la verifica dello script.
# Lo imposteremo a 0, per verificare tutto.
assumevalid=0

# Abilita tutti i filtri compatti
blockfilterindex=1

# Servire i filtri a blocchi compatti ai peer per BIP 157
peerblockfilters=1

# Mantenere l'indice coinstats usato dalla RPC gettxoutsetinfo
coinstatsindex=1

# Network
listen=1

## P2P bind
bind=127.0.0.1

## Proxify clearnet outbound connections using Tor SOCKS5 proxy
proxy=127.0.0.1:9050

# Connessioni, qui aggiungiamo la linea prima creata e salvata sul file rpc.pw
rpcauth=<replace with your own auth line generated in the previous step>

# Ottimizzazioni iniziali per il download dei blocchi (impostare la dimensione della dbcache in megabyte). 
# (da 4 a 16384, default: 300) in base alla RAM disponibile del dispositivo,
# consigliato: dbcache=1/2 x RAM disponibile, ad esempio: 4GB RAM -> dbcache=2048)
# Ricordarsi di commentare dopo IBD (Initial Block Download)!
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 bitcoin demon in background, procediamo con la creazione di un servizio attraverso systemd.

sudo nano /etc/systemd/system/bitcoind.service

Inseriamo la seguente configurazione:

[Unit]
Description=Bitcoin Core
Requires=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/bitcoind -pid=/run/bitcoind/bitcoind.pid \
                                  -conf=/home/bitcoin/.bitcoin/bitcoin.conf \
                                  -datadir=/home/bitcoin/.bitcoin
# Process management
####################
Type=exec
NotifyAccess=all
PIDFile=/run/bitcoind/bitcoind.pid

Restart=on-failure
TimeoutStartSec=infinity
TimeoutStopSec=600

# Directory creation and permissions
####################################
User=bitcoin
Group=bitcoin
RuntimeDirectory=bitcoind
RuntimeDirectoryMode=0710
UMask=0027

# Hardening measures
####################
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
PrivateDevices=true
MemoryDenyWriteExecute=true
SystemCallArchitectures=native

[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 enable 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

Riceveremo una risposta simile a questa:

New block-relay-only v1 peer connected: version: 70016, blocks=2948133, peer=68
[..]
Synchronizing blockheaders, height: 4000 (~0.56%)
[..]
UpdateTip: new best=000000000f8d29fcf9ac45e443706c6f21a6e9cfa615f94794b726d3ba8bdc88 height=2948135 version=0x20000000 log2_work=75.951200 tx=215155316 date='2024-09-18T16:25:12Z' progress=1.000000 cache=20.9MiB(142005txo)
[..]

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

Riceveremo l'indirizzo in formato .onion
"address": "indirizzo.onion".

Terminata la Sincronizzazione Iniziale

Una volta terminata la sincronizzazione iniziale di Bitcoin Core, in media 4-5 giorni, 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:

Rendiamo effettive le modifiche riavviando il bitcoin deamon:

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 nella repository ufficiale di Github (https://github.com/bitcoin/bitcoin/releases).
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=28.0

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

RICORDA: le stringhe sono relative all'archittetura AMD64!!

Verifichiamo che il checksum di riferimento nel file SHA256SUMS, corrisponde al checksum calcolato da noi:

sha256sum --ignore-missing --check SHA256SUMS

La risposta che riceveremo a video sarร  la seguente:
"bitcoin-28.0-x86_64-linux-gnu.tar.gz: OK"
Come giร  visto in precedenza 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

Dovrร  uscire a video questa risposta:
gpg: Good signature from...
Primary key fingerprint:...

Effettuati i controlli, dobbiamo estrarre i file binari di Bitcoin Core:

tar -xzvf bitcoin-$VERSION-x86_64-linux-gnu.tar.gz

Successivamente, andiamo ad installarli con il seguente comando:

sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-$VERSION/bin/bitcoin-cli bitcoin-$VERSION/bin/bitcoind

Verifichiamo che l'installazione sia avvenuta con successo attraverso il comando bitcoind, quindi da terminale digitiamo:

bitcoind --version

Perfetto, il nostro Bitcoin Core รจ stato correttamente aggiornato, possiamo avviare nuovamente il servizio:

sudo systemctl start bitcoind.service

Fine Episodio 2


Tag