Guida all'installazione di un full node con Bitcoin Core: Bitcoin Core (Ep. 2)
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