Lezioni online Bitcoin-only
This project is maintained by valerio-vaccaro
Officine Bitcoin Lección Bitcoin-only Este proyecto es mantenido por valerio-vaccaro
🇨🇳 中文 🇬🇧 English 🇪🇸 Español 🇵🇹 Português 🇷🇺 Русский 🇫🇷 Français 🇩🇪 Deutsch 🇮🇹 Italiano 🇭🇺 Magyar 🏳️ Milanés 🏳️ Veneto
Tener un nodo Bitcoin es fundamental porque permite, con la máxima privacidad:
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 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.
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:
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.
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.
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.
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:
ln -s,datadir, indicando el directorio de destino.Bitcoin Core soporta tres tipos distintos de redes a las que conectarse:
mainnet, la red clásica a la que todos estamos acostumbrados y la opción por defecto de core,testnet, una red análoga a mainnet pero cuyos tokens no tienen valor; el mining se realiza igualmente, pero si no hay bloques durante 20 minutos la dificultad cae en picado; suele sufrir reorg importantes,regtest, en esta modalidad se tiene una pequeña blockchain privada que siempre empieza desde cero y en la que se puede minar con dificultad mínima; sirve para pruebas locales.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:
daemon=1blocksonly=1txindex=1maxuploadtarget=500txindex=1blockfilterindex=1rpcallowip=0.0.0.0/0rpcallowip=0.0.0.0/0rpcuser=username, obviamente hay que sustituirlorpcpassword=password, obviamente hay que sustituirlaLa 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.
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
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
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.
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
Por completar
Por completar
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
La configuración del backend se encuentra en el archivo mempool-config.json.
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
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.
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 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.
Un curso completo sobre el uso de Bitcoin desde la línea de comandos se puede encontrar en Learning-Bitcoin-from-the-Command-Line.
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 |