Officine Bitcoin

Lezioni online Bitcoin-only

This project is maintained by valerio-vaccaro

Officine Bitcoin Lección Bitcoin-only Este proyecto es mantenido por valerio-vaccaro

🌍 Traducciones

🇨🇳 中文 🇬🇧 English 🇪🇸 Español 🇵🇹 Português 🇷🇺 Русский 🇫🇷 Français 🇩🇪 Deutsch 🇮🇹 Italiano 🇭🇺 Magyar 🏳️ Milanés 🏳️ Veneto

Fullnode y hardware para un nodo

Tener un nodo Bitcoin es fundamental porque permite, con la máxima privacidad:

Selección del hardware

Reutiliza un ordenador viejo

Un ordenador viejo puede reciclarse como nodo. En caso de usar un portátil, se recomienda retirar la batería, ya que mantenerla siempre cargando podría suponer un riesgo. La gran ventaja es el coste cero, o limitado solo al disco de mayor capacidad.

Raspberry pi y otras placas

Raspberry pi es una placa ARM muy utilizada para crear sistemas IoT y nodos. Sin embargo, su coste excesivo y la necesidad de un disco por USB hacen que no sea la mejor elección posible en términos de rendimiento y estabilidad.

Odroid-M1 es una placa ARM potente y con una ranura interna para añadir almacenamiento adicional.

Thin client

Con un presupuesto muy reducido, 30-100 euros, es posible comprar un Thin Client usado, en ebay, que combina bajo consumo con prestaciones suficientes para ejecutar el nodo.

Como ejemplos de Thin Client se han probado los siguientes modelos:

Selección del software

Instalar la menor cantidad posible de software en un nodo limita los posibles ataques y hace que el sistema sea más sencillo de mantener.

En línea se encuentran soluciones preempaquetadas, como Umbrel, Mynode y otras, que ocultan los controles de seguridad y añaden software y scripts, por ejemplo docker, difíciles de controlar. En estas lecciones pondremos la atención en crear un nodo a mano, es decir, instalando manualmente todo el software necesario.

Paso 0 - El sistema operativo

La primera elección que hay que hacer es el sistema operativo. El consejo es utilizar Linux en una versión LTS, es decir, con soporte garantizado durante un número suficientemente largo de años. Mi elección personal es Debian 12.

El sistema operativo elegido debe instalarse en el ordenador y todos los paquetes deben actualizarse. La actualización será algo que nos acompañará durante toda la vida del nodo.

También se recomienda instalar tor, y/o otra VPN si es necesaria, y ssh, para permitir el mantenimiento remoto del nodo.

Por último, un SAI podría salvar el nodo de caídas bruscas de corriente, evitando dejar bitcoin y el resto del software en un estado inconsistente.

Paso 1 - Instalamos Bitcoin

Descargamos core, los hashes y las firmas.

wget https://bitcoincore.org/bin/bitcoin-core-28.1/bitcoin-28.1-x86_64-linux-gnu.tar.gz
wget https://bitcoincore.org/bin/bitcoin-core-28.1/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-28.1/SHA256SUMS.asc

Si se utiliza una board con arquitectura arm, el paquete deberá cambiarse a bitcoin-28.1-aarch64-linux-gnu.tar.gz, es decir, el mismo paquete pero compilado para la arquitectura arm de 64 bits, aarch64, que es precisamente la utilizada por odroid.

En este punto podemos comprobar que uno de los hashes en SHA256SUMS corresponde al archivo descargado.

sha256sum --ignore-missing --check SHA256SUMS

El resultado nos indica que se ha encontrado una coincidencia para el archivo descargado.

bitcoin-28.1-x86_64-linux-gnu.tar.gz: OK

Ahora verificamos las firmas del archivo SHA256SUMS. Antes, si es necesario, obtenemos las claves y las importamos.

git clone https://github.com/bitcoin-core/guix.sigs
gpg --import guix.sigs/builder-keys/*

Y finalmente verificamos las firmas.

gpg --verify SHA256SUMS.asc

Si vemos muchas veces el texto gpg: Good signature from ..., significa que hemos encontrado firmas válidas.

Procedemos a descomprimir e instalar.

tar xzvf bitcoin-28.1-x86_64-linux-gnu.tar.gz 
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-28.1/bin/*

Y ya está: ahora tenemos bitcoind, bitcoin-cli y las demás utilidades listas para ejecutarse.

Por ahora ejecutamos bitcoind y veremos algo de log. Bitcoin empieza a sincronizarse y ahora habrá un directorio con la blockchain y todas las configuraciones en ~/.bitcoin/.

Desde otra terminal podemos comprobar el funcionamiento de bitcoind ejecutando el comando tail -f ~/.bitcoin/debug.log.

Paso 1b - Configuramos Bitcoin

Como ya hemos visto anteriormente, el directorio en el que Bitcoin Core guarda las configuraciones y la blockchain en Linux es ~/.bitcoin/. Si se quisiera cambiar la ubicación de guardado, se pueden usar distintos enfoques:

Bitcoin Core soporta tres tipos distintos de redes a las que conectarse:

Otro comando útil es daemon, que, si está configurado, no mantiene el log de Bitcoin Core unido a la consola actual. Para ver el funcionamiento siempre será posible usar el comando tail -f ~/.bitcoin/debug.log.

Todas las configuraciones pueden lanzarse desde la línea de comandos o mediante el archivo ~/.bitcoin/bitcoin.conf. Un archivo compatible con un setup doméstico, es decir, en el que quiero mantener el consumo de recursos al mínimo, podría ser el siguiente. archivo de configuración

daemon=1  
blocksonly=1  
maxconnections=20  
maxuploadtarget=500  
txindex=1  
blockfilterindex=1

rpcallowip=0.0.0.0/0
rpcallowip=0.0.0.0/0
rpcuser=username
rpcpassword=password

Donde:

La lista completa de funcionalidades se puede encontrar en https://jlopp.github.io/bitcoin-core-config-generator

También se puede hacer todo con un único comando de terminal.

cat >bitcoin.conf <<EOL
daemon=1  
blocksonly=1  
maxconnections=20  
maxuploadtarget=500  
txindex=1  
blockfilterindex=1

rpcallowip=0.0.0.0/0
rpcbind=0.0.0.0
rpcuser=username
rpcpassword=password
EOL

Si se dispone de otro nodo ya sincronizado, se puede usar la opción connect para conectarse SOLO Y EXCLUSIVAMENTE a ese nodo. Si ese nodo está en la red local, se gana tiempo y ancho de banda con esta configuración sencilla.

Desde la release 26, core soporta cifrado de las comunicaciones entre nodos con la opción v2transport.

Todas las configuraciones mostradas son relativas a clearnet; las configuraciones para tor serán objeto de otra lección.

Paso 1c - Lanzamos Bitcoin

Lanzamos Bitcoin creando un archivo de arranque para systemd.

sudo  sh -c "cat > /etc/systemd/system/bitcoind.service <<EOL
[Unit]
Description=Bitcoin daemon
After=network.target

[Service]
User=bitcoin
Group=bitcoin
Type=forking
PIDFile=/home/bitcoin/.bitcoin/bitcoind.pid
ExecStart=/usr/local/bin/bitcoind -pid=/home/bitcoin/.bitcoin/bitcoind.pid
KillMode=process
Restart=always
TimeoutSec=120
RestartSec=30

[Install]
WantedBy=multi-user.target
EOL"

Atención: en este caso estamos utilizando el usuario bitcoin para iniciar el software.

Podemos registrar el script creado y lanzarlo.

sudo systemctl enable bitcoind
sudo systemctl start bitcoind

Cada vez que se quiera comprobar el estado del software se puede usar el siguiente comando.

systemctl status bitcoind

Paso 2 - Instalamos Electrs

Instalamos Electrs, que es un servidor electrum basado en Rust; el primer paso es, por tanto, instalar ese lenguaje.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Instalamos también clang y el paquete build-essential.

apt update
apt install clang cmake build-essential -y

Descargamos la última versión, actualmente la 0.10.5, desde Github.

VERSION="0.10.5"
git clone --branch v$VERSION https://github.com/romanz/electrs.git
cd electrs

Importamos la clave del desarrollador de Electrs y verificamos la firma de los commit de Github.

curl https://romanzey.de/pgp.txt | gpg --import
git verify-tag v$VERSION

Si la firma es correcta podemos pasar a la compilación …

cargo build --locked --release

y luego a la instalación.

sudo install -m 0755 -o root -g root -t /usr/local/bin ./target/release/electrs

Paso 2b - Configuramos Electrs

Para configurar Electrs creamos el archivo config.toml con el siguiente contenido.

# bitcoin core configuration
auth = "username:password"
daemon_rpc_addr = "127.0.0.1:8332"
daemon_p2p_addr = "127.0.0.1:8333"

# electrs configuration
db_dir = ".electrum"
network = "bitcoin"
electrum_rpc_addr = "127.0.0.1:50001"
log_filters = "INFO"

También se puede hacer todo con un único comando de terminal.

cat >config.toml <<EOL
# bitcoin core configuration
auth = "username:password"
daemon_rpc_addr = "127.0.0.1:8332"
daemon_p2p_addr = "127.0.0.1:8333"

# electrs configuration
db_dir = ".electrum"
network = "bitcoin"
electrum_rpc_addr = "127.0.0.1:50001"
log_filters = "INFO"
EOL

Podemos lanzar Elects con el comando

electrs --conf config.toml

y esperar a que electrs termine de indexar todos los bloques.

Paso 2c - Lanzamos Electrs

Como con Bitcoin, podemos lanzar el software creando un script para systemd.

sudo  sh -c "cat > /etc/systemd/system/electrs.service <<EOL
[Unit]
Description=Electrs daemon
After=bitcoind.target

[Service]
User=bitcoin
Group=bitcoin
Type=forking
ExecStart=/usr/local/bin/electrs --conf /home/bitcoin/electrs_config.toml
KillMode=process
Restart=always
TimeoutSec=120
RestartSec=30

[Install]
WantedBy=multi-user.target
EOL"

Atención: en este caso estamos utilizando el usuario bitcoin para iniciar el software.

Podemos registrar el script creado y lanzarlo.

sudo systemctl enable electrs
sudo systemctl start electrs

Cada vez que se quiera comprobar el estado del software se puede usar el siguiente comando.

systemctl status electrs

Paso 3 - Instalamos CLN

Por completar

Paso 3b - Configuramos CLN

Por completar

Paso 4 - Instalamos Mempool.space

Instalamos mariadb.

sudo apt-get install mariadb-server mariadb-client

Y creamos db y usuario.

sudo mysql -e "drop database mempool;"
sudo mysql -e "create database mempool;"
sudo mysql -e "grant all privileges on mempool.* to 'mempool'@'%' identified by 'mempool';"
sudo mysql -e "flush privileges;"

Clonamos el código

git clone https://github.com/mempool/mempool
cd mempool
latestrelease=$(curl -s https://api.github.com/repos/mempool/mempool/releases/latest|grep tag_name|head -1|cut -d '"' -f4)
git checkout $latestrelease

Asegurémonos de usar node 20.x y la última versión de npm.

sudo npm i -g npm
sudo npm i -g node@20

Procedemos a compilar y probar el backend

cd backend
npm install --no-install-links # npm@9.4.2 and later can omit the --no-install-links
npm run build

cp mempool-config.sample.json mempool-config.json
npm run start

Comprobar atentamente las configuraciones de mempool-config.json.

Pasamos al frontend.

cd ..

cd frontend
npm install
npm run serve:local-prod

Paso 4b - Configuramos Mempool

La configuración del backend se encuentra en el archivo mempool-config.json.

Paso 4c - Lanzamos Mempool

Podemos lanzar Mempool con pm2, que debe instalarse.

sudo npm i -g pm2
pm2 startup 

Lanzamos el backend.

cd ..
cd backend 
pm2 start "npm run start"

Luego lanzamos el frontend.

cd ..
cd frontend
pm2 start "npm run serve:local-prod"

Guardamos todo.

pm2 save

Bitcoin con conexión solo mediante tor

Empezamos instalando tor.

sudo apt install tor

y configuramos el archivo de configuración de tor para crear un nuevo hidden service exportando el puerto 8333 del nodo.

cat > /etc/tor/torrc <<EOL
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 8333 127.0.0.1:8333
EOL

Podemos reiniciar tor para aplicar los cambios. Esto nos permite exportar el puerto 8333 de nuestro nodo, pero no limitar el acceso al nodo solo y exclusivamente mediante tor.

sudo systemctl restart tor

y obtener la dirección onion del nodo.

cat /var/lib/tor/hidden_service/hostname

Hecho esto, podemos limitar el acceso al nodo solo y exclusivamente mediante tor modificando la configuración de bitcoin.conf de este modo:

proxy=127.0.0.1:9050
listen=1
bind=127.0.0.1:8333=onion
externalip=tor_url.onion
onlynet=onion

Donde tor_url.onion es la dirección onion del nodo obtenida anteriormente.

Al reiniciar el nodo podemos verificar que el nodo es accesible solo y exclusivamente mediante tor.

sudo systemctl restart bitcoind

bitcoin-cli getnetworkinfo

Aquí deberíamos ver que el nodo es accesible solo y exclusivamente mediante tor, es decir, que solo la red onion está reachable.

Además, todos nuestros peer estarán identificados por direcciones onion.

bitcoin-cli getpeerinfo

Atención: tor es extremadamente lento; tenedlo en cuenta cuando queráis sincronizar el nodo desde cero.

Testnet

Una red útil para practicar es testnet, que difiere de mainnet en que:

Muchos wallet, green, electrum, specter, sparrow y otros, soportan testnet y pueden usarse para:

Algunas herramientas útiles, autopromoción, para testnet:

Hay muchas otras herramientas y sitios web que soportan testnet, además de los block explorer más importantes.

Bitcoin-cli

Bitcoin-cli es la utilidad de línea de comandos para interactuar con Bitcoin Core.

Los comandos tienen el formato:

bitcoin-cli [options] <command> [params]

y siempre se puede usar help para obtener la lista de comandos o información sobre un comando específico.

Comandos informativos sobre la blockchain

Comandos de control

Comandos para el mining

Comandos para la red

Gestión de Rawtransactions

Utilidades

Wallet

Un curso completo sobre el uso de Bitcoin desde la línea de comandos se puede encontrar en Learning-Bitcoin-from-the-Command-Line.

Programa

La instalación del nodo está dividida en varias lecciones; aquí hay una lista de las ya impartidas:

Fecha Notas
240108-2100 Selección del hardware
240115-2200 Instalación de core y verificación de firmas
240122-2200 Configuración mínima