Se anche tu, come me, segui Ethereum da un punto di vista "tecnico", più che "speculativo", vorrai sicuramente configurare un nodo Ethereum a casa tua, magari per interrogare la blockchain senza bisogno di servizi esterni oppure per studiare la programmazione della EVM (Ethereum Virtual Machine) con Solidity. Ebbene: in questa guida vedremo proprio come attivare un nodo Ethereum sul PC, partendo da zero. Allo scopo, installeremo e configureremo il client Ethereum Besu su Ubuntu, passo per passo
Trattazione aggiornata a fine 2024
Il nodo Ethereum che andremo a configurare nel corso di questa guida è costituito da un programma, chiamato Besu, che implementa il protocollo Ethereum e conserva una copia completa della blockchain sul disco locale, sincronizzandola via via con tutti gli altri client che partecipano alla rete Ethereum.
Configurare un nodo Ethereum: cosa serve
Chiunque può partecipare alla rete Ethereum installando il software necessario sul proprio PC e divenendo così un nodo. Basta disporre dei requisiti e configurare il sistema. In particolare, è necessario:
- un PC, fisso o portatile
- Linux da linea di comando: di seguito riporteremo ogni singolo comando da impartire, ma è comunque indispensabile un minimo di manualità con la linea di comando in ambiente Linux
- collegamento a Internet veloce: una tradizionale ADSL "home" è sufficiente, a patto che abbia una larghezza di banda "decorosa" (almeno 10 megabit in download e 2 megabit in upload). Movimenteremo decine e decine di gigabyte, quindi è fondamentale che la linea non preveda limitazioni al volume di traffico
Per conoscere tutti i dettagli, ti invito a consultare la mia guida allo staking di Ethereum: i requisiti di sistema, infatti, sono gli stessi.
Configurare un nodo Ethereum: quale programma scegliere
Il programma necessario per trasformare il PC in un nodo Ethereum è detto "client Ethereum". Ne esistono molteplici, tutti compatibili fra loro.
Nel corso della presente guida, configureremo Besu: un client Ethereum scritto in Java e rivolto principalmente al pubblico aziendale, ma che funziona davvero molto bene anche in ambito "home"
Besu si differenzia dagli altri client Ethereum per alcune peculiarità, fra le quali spicca una modalità, chiamata "Bonsai", ad altissima efficienza di archiviazione (meno spazio su disco occupato) e l'elevata stabilità.
Configurare un nodo Ethereum: testnet e mainnet
La rete Ethereum "reale", chiamata mainnet, è affiancata da molteplici reti di prova, chiamate testnet. Ogni rete ha le proprie monete (chiamate Ether, con simbolo ETH), con la differenza che solo quelle della mainnet hanno un controvalore economico reale. Le altre reti utilizzano "soldi del Monopoli", senza alcun valore e "spendibili" solo per transazioni di test.
L'altra differenza fondamentale da tenere presente è la dimensione delle rispettive blockchain:
- la blockchain della mainnet si aggira, a settembre 2024, attorno a 1.2 TB (in rapidissima crescita)
- le blockchain delle testnet contengono invece pochi gigabyte
Se desideri attivare un nodo Ethereum devi quindi scegliere subito se partecipare alla mainnet oppure ad una testnet. Raccomando vivamente di prendere dimestichezza dapprima con una testnet, non fosse altro per la quantità significativa di spazio su disco occupata dalla blockchain mainnet e, di conseguenza, dei lunghi tempi necessari per scaricare i dati in locale e diventare operativi.
Configurare un nodo Ethereum con Besu, passo 1: Preparare il sistema
Per iniziare è necessario seguire i seguenti passi che ho dettagliato nella guida allo staking di Ethereum:
- Installare Ubuntu
- Avviare il Terminale
- Aggiornamento completo
- Accesso SSH (opzionale)
- Diventare root
Prima di proseguire, assicurati quindi di essere davanti al Terminale del sistema sul quale installeremo Besu e, lo ripeto!, di avere i privilegi di root
Configurare un nodo Ethereum con Besu, passo 2: Installare Java
Besu è scritto in Java, e richiede l'omonimo kit di sviluppo (JDK). Fortunatamente, installarlo in Ubuntu è molto semplice. Basta impartire:
apt install openjdk-21-jdk -y
Ad installazione terminata, verifichiamo che Java sia disponibile impartendo:
java --version
Dovremmo ottenere una risposta simile alla seguente
Configurare un nodo Ethereum con Besu, passo 3: Installare altri pacchetti
Procediamo installando altri pacchetti di utilità che impiegheremo di seguito:
apt install curl unzip libjemalloc-dev -y
Per i più curiosi: jemalloc è una libreria che ottimizza la gestione della memoria. Se il pacchetto non è stato installato tramite il comando indicato, Besu mostra un messaggio di avviso e consuma molta più RAM di quanto sarebbe indispensabile.
Configurare un nodo Ethereum con Besu, passo 4: Scaricare Besu
Procediamo ora a scaricare Besu. Purtroppo l'URL di download varia ad ogni nuova versione, quindi dobbiamo prelevarlo da questa pagina:
» Vedi: Besu su GitHub
Fai click con il pulsante destro del mouse sul collegamento dal nome simile a besu-24.9.1.zip
e scegli Copia collegamento
Tornati alla linea di comando del PC che trasformeremo in nodo Ethereum, entriamo nella nostra "home":
cd $HOME
Da qui, utilizziamo curl per scaricare il file dall'indirizzo appena copiato. Il comando sarà simile a:
curl -Lo besu.zip https://github.com/.../besu-24.9.1.zip
L'URL deve essere, ovviamente, quello che abbiamo appena copiato da GitHub
Per maggiori informazioni sull'uso di curl:
Configurare un nodo Ethereum con Besu, passo 5: Estrarre Besu dallo zip
A download terminato, ci ritroveremo con il file besu.zip
, che dobbiamo scompattare. Creiamo una cartella temporanea adibita ad ospitare il materiale:
mkdir besu-extract
Procediamo all'estrazione:
unzip -o besu.zip -d besu-extract/
Per la guida completa all'utilizzo del comando unzip con Linux:
Ora possiamo fare pulizia, eliminando lo zip scaricato un attimo fa:
rm -f besu.zip
Configurare un nodo Ethereum con Besu, passo 6: Spostare la cartella di Besu
Elenchiamo ora tutti i file presenti nella cartella temporanea che abbiamo creato poco fa:
ls -la besu-extract/
Dovrebbe essere presente una sola cartella dal nome simile a besu-24.9.1
Prendiamo nota di questo nome e utilizziamo per spostare la cartella in una posizione più consona:
mv besu-extract/besu-24.9.1 /usr/local/besu
Ovviamente, dobbiamo utilizzare il nome che abbiamo letto poco fa al posto di besu-24.9.1
Ultimiamo questa fase eliminando la cartella temporanea:
rm -rf besu-extract
Configurare un nodo Ethereum con Besu, passo 7: Creare l'utente per Besu
Creiamo ora una nuova utenza con privilegi minimi: sarà quella che eseguirà materialmente l'applicazione. Allo scopo, impartiamo i tre comandi seguenti per creare l'utente di nome besu
, la cartella /var/lib/besu
e concedergli pieno accesso alla stessa:
useradd --no-create-home --shell /bin/false besu
mkdir -p /var/lib/besu
chown -R besu:besu /var/lib/besu
chmod u=rwx,g=rx,o= /var/lib/besu -R
I comandi indicati poco fa non mostrano alcun messaggio, se tutto va bene.
Se però vogliamo verificarlo puntualmente, assicuriamoci che la cartella sia stata creata e che abbia il proprietario e i permessi attesi impartendo:
ls -la /var/lib/ | grep besu
Per controllare che l'utente esista, invece:
cat /etc/passwd | grep besu
Configurare un nodo Ethereum con Besu, passo 8: Eseguire Besu come servizio
Per eseguire Besu come servizio ad ogni avvio del PC dobbiamo creare un file di configurazione. Il modo più facile per raggiungere l'obbiettivo è di scaricare quello già pronto:
curl -Lo /etc/systemd/system/besu.service https://turbolab.it/scarica/396
Ispezioniamo poi il suo contenuto:
cat /etc/systemd/system/besu.service
Scarichiamo poi il file testuale con tutti i parametri necessari:
Per la testnet:
curl -Lo /etc/besu.toml https://turbolab.it/scarica/412
Per la mainnet:
curl -Lo /etc/besu.toml https://turbolab.it/scarica/413
Per ispezionare il contenuto del file appena scaricato:
cat /etc/besu.toml
[ nota tecnica: la configurazione qui proposta espone sia il WebSocket (argomento --rpc-ws-enabled=true
), sia il tradizionale endpoint HTTP (--rpc-http-enabled=true
). Può quindi essere utilizzato anche per lo staking con i vari client dedicati ]
Configurare un nodo Ethereum con Besu, passo 9: Eseguire Besu automaticamente all'avvio
Ora che abbiamo preparato il servizio, facciamo in modo che parta automaticamente all'avvio del computer:
systemctl enable besu
Per sincerarcene, riavviamo il sistema:
reboot
Terminato il riavvio, assicuriamoci di ri-acquisire i privilegi di root (sudo -s
), poi visualizziamo lo stato del servizio:
service besu status
La schermata dovrebbe mostrare il messaggio active (running)
Battere Q
sulla tastiera per uscire.
Nel frattempo, la ventola del PC sarà partita con irruenza: digitiamo top
e scopriamo che il responsabile è il processo di nome java
, che utilizza la CPU al 100%. Si tratta in realtà proprio di Besu, che sta scaricando la blockchain dagli altri nodi della rete
È una situazione assolutamente normale mentre il nodo si sincronizza con la rete, e potrebbe durare parecchie ore: non so dire esattamente "quante", perché io ho lasciato il PC a lavorare tutta notte e l'indomani aveva terminato. Questo vale per le testnet: lavorando con la mainnet, invece, saranno necessari parecchi giorni, forse persino una settimana.
Per seguire l'avanzamento di questa fase, battiamo Q
sulla tastiera per uscire da top e impartiamo quanto segue:
journalctl -fu besu.service
Le singole righe riportano un messaggio simile a questo:
EthScheduler-Services-25 (importBlock) | INFO | FastImportBlocksStep | Completed importing chain segment 561601 to 561800, Peers: 1
Fino a quando appaiono nuove righe, va tutto bene: l'operazione sta continuando.
Al termine, premere Ctrl+C
sulla tastiera per uscire.
Configurare un nodo Ethereum con Besu, passo 10: Riavviare Besu quando cambia l'indirizzo IP
Questo passo interessa coloro che si collegano ad Internet tramite un indirizzo IP dinamico, cioè la modalità più diffusa. Chi invece disponesse di un indirizzo IP statico può andare oltre
Besu è attualmente interessato da una limitazione: se l'indirizzo IP pubblico cambia mentre il programma è in esecuzione, il client non funziona più in modo ottimale. Per aggirare il problema, ho preparato uno script che controlla periodicamente l'indirizzo IP pubblico e, in caso sia cambiato, riavvia il servizio automaticamente. Per ottenerlo, impartire questo comando:
curl -sL https://turbolab.it/scarica/360 | sudo bash
Ora lanciare lo script:
bash /usr/local/turbolab.it/ethereum-autostaker/script/ip_watch.sh
Alla prima esecuzione verrà creato automaticamente il file per l'avvio periodico. Da qui in poi, non dovremo più preoccuparci di controllarlo. Se però volessimo dare un'occhiata per verificare il funzionamento, basterà impartire:
tail -n 1000 /var/log/ethereum-autostaker_cron_ip_watch.sh.log
Configurare un nodo Ethereum con Besu, passo 11: Blindare il server con il firewall
Generalmente, ritengo superfluo l'uso del firewall su Linux. Tuttavia, in questa circostanza, faccio un'eccezione. Attiviamo dunque il firewall e apriamo solo le porte strettamente indispensabili.
Chi interagisca con il PC sul quale è in esecuzione Besu via SSH, e non con tastiera, mouse e schermo collegati direttamente, deve innanzitutto lasciar passare il traffico SSH:
ufw allow 22/tcp
Per essere assolutamente chiari: il comando appena segnalato NON è necessario per chi utilizzi la tastiera, il mouse e lo schermo collegati direttamente al PC che esegue Besu.
In ogni caso, invece dobbiamo aprire le porte di Besu:
ufw allow 30303/tcp && ufw allow 30303/udp && ufw --force enable
Visualizziamo la situazione aggiornata con ufw status
Per maggiori informazioni:
Configurare un nodo Ethereum con Besu, passo 12: Aprire le porte sul router
In questo momento, il nostro nodo non sta funzionando in modo ottimale: dobbiamo infatti "aprire" le relative porte sul router. Più precisamente: dobbiamo svolgere il port forwarding dal router verso il PC che ospita il nodo Ethereum. Allo scopo, seguiamo questa guida:
» Leggi: Come aprire le porte sul router/modem: la guida definitiva al port forwarding (inoltro delle porte)
Le specifiche porte da aprire sono le seguenti:
30303 TCP
30303 UDP
Dopo aver svolto la configurazione, verifichiamo esplicitamente che sia andata a buon fine tramite Shields Up!. Il link diretto è il seguente:
» Vedi: test porta 30303
Il servizio deve riportare la dicitura OPEN!
» Leggi anche: Come testare se una porta del router/firewall è aperta? guida al Port scan con Shields Up!
Configurare un nodo Ethereum con Besu, passo 13: Installare un "consensus client"
Arrivati a questo punto, la nostra installazione di Besu è perfettamente funzionante. Ispezionando i log, però, noteremo la presenza di avvisi simili a questo:
Waiting for consensus client, this may be because your consensus client is still syncing
Questo dipende dal fatto che dobbiamo ora affiancare a Besu un secondo programma, chiamato consensus client. Ne esistono molteplici: Lighthouse, Lodestar, Teku, Nimbus, Prysm. In particolare, ho proposto la guida all'installazione di Nimbus nel già ricordato articolo sullo staking di Ethereum.
Addendum: Mantenere aggiornato il sistema
Periodicamente, dovremo aggiornare tutto il sistema. Il comando zzupdate torna sicuramente utile allo scopo, poiché aggiorna il sistema operativo e i pacchetti installati tramite apt.
Besu, invece, deve essere aggiornato manualmente. È importante farlo periodicamente, poiché le nuove versioni includono correzioni di sicurezza, oppure modifiche indispensabili per continuare ad operare in seguito ai frequenti hard fork, ovvero una modifica al protocollo che rende incompatibili i vecchi client.
Per aggiornare Besu dobbiamo innanzitutto arrestare il servizio e cancellare la cartella che ospita l'applicazione:
service besu stop && rm -rf /usr/local/besu
A questo punto, svolgiamo nuovamente i Passi illustrati in precedenza. Nello specifico:
- Scaricare Besu
- Estrarre Besu dallo zip
- Spostare la cartella di Besu
Infine, riavviare il servizio con service besu restart
(o, ancora meglio, riavviare del tutto il PC per verificare che Besu continui ad avviarsi automaticamente al boot).
Conclusioni, fonti e riferimenti
In questa guida abbiamo visto come configurare un nodo Ethereum con Besu. La procedura è sicuramente un po' articolata, ma è una buona occasione per tutti noi smanettoni di provare in prima persona come funziona Ethereum, ed è un componente indispensabile per chi si stia avvicinando al mondo della programmazione su blockchain.
Questo articolo è frutto della mia esperienza diretta con la sola testnet, poiché non dispongo di un SSD abbastanza capiente da ospitare tutta la blockchain della mainnet. Ogni feedback da chiunque abbia attivato Besu su mainnet è dunque particolarmente gradito.