Cómo montar un nodo de Bitcoin en Raspberry Pi paso a paso

Por Acaleus Nakamoto|24/09/2022 | 734 | 1

Portada Como montar un nodo Bitcoin

Un nodo de Bitcoin es un ordenador o dispositivo que está corriendo un software que le permite validar completamente las transacciones y bloques de la blockchain de Bitcoin en función de las reglas de consenso para evitar la inclusión de transacciones no legítimas. Los nodos son uno de los pilares básicos que mantienen la seguridad e integridad de la cadena de bloques.

Pero un nodo de Bitcoin no solo aporta beneficios a la red sino también al usuario que lo ejecuta, que, gracias a él, obtiene total independencia de terceros para poder acceder a la blockchain y propagar sus transacciones además mejorar considerablemente su seguridad y privacidad.

Índice de contenido

Requisitos iniciales para montar un nodo de Bitcoin

Para poder montar Bitcoin Core en una Raspberry Pi vamos a necesitar lo siguiente:

  • Raspberry Pi 3 o 4. Recomendado: Raspberry Pi 4 (4GB).
  • Carcasa para Raspberry Pi (Opcional pero recomendado).
  • Tarjeta MicroSD de 16 a 32 GB. Recomendado: 32 GB.
  • Disco duro HDD o SDD de mínimo 1 TB. Recomendado: SSD de 2 TB.
  • Adaptador de corriente Raspberry Pi oficial (Opcional).

Recomendamos la versión de Raspberry Pi 4 ya que es la más potente y ha sido la utilizada para preparar esta guía. También recomiendo un disco duro SSD de al menos 2 TB. Los discos SSD son más rápidos y a la larga darán menos problemas y 2 TB para garantizar el espacio en un futuro, pero si quieres ahorrar algo de dinero con un HDD de 1 TB también va a funcionar. La tarjeta MicroSD si recomiendo que sea de 32 GB para ir instalando las actualizaciones y no quedarnos sin espacio.

Preparando la Raspberry Pi

En esta sección voy a explicar desde como instalar el sistema operativo en la Raspberry Pi hasta toda la configuración necesaria para dejar la Raspberry Pi lista para ejecutar un nodo de Bitcoin.

Instalando el sistema operativo

Para instalar el sistema operativo nos vamos a apoyar en Raspberry Pi Imager, una herramienta muy simple y útil creada por Raspberry Foundation y disponible para Windows, Linux y MacOS. Podemos descargarla directamente desde la página web de Raspberry. La instalación no tiene mucho misterio ya que es como cualquier otra aplicación.

Una vez instalada la ejecutamos y veremos que hay dos opciones para configurar: Operating System y Storage. En Operating System vamos a escoger Other general-purpose OS > Ubuntu > Ubutnu Server 22.04.1 LTS. Cuando he escrito esta guía la última versión es la 22.04.1, si cuando vayas a seguir esta guía existe una versión más actual no dudes en usarla. Pero recuerda que debe la versión server y de 64-bit.

La otra opción es la de Storage y aquí debemos indicar la tarjeta MicroSD donde instalaremos el sistema. Para ello debemos tener previamente la tarjeta conectada a nuestro ordenador. Es importante tener en cuenta que este proceso va a borrar toda la información que tenga la tarjeta, por lo que si tenemos datos que queramos mantener debemos hacer una copia antes de iniciar el proceso.

Una vez seleccionadas las dos opciones la pantalla nos quedaría así:

Raspberry Pi Imager configurado

Ya solo nos quedaría pulsar el botón de «Write» y esperar a que el proceso acabe.

Configuración de red

En este punto vamos a configurar la red de nuestra Raspberry Pi para que nuestro nodo tenga una dirección IP estática y esta no cambie con el tiempo. Si estás siguiendo la guía con una Raspberry Pi 4 tienes la opción de configurarlo por WiFi o por cable. Si estás con una Raspberry Pi solo podrás configurarlo por cable.

Ambas configuraciones se harán modificando el fichero «network-config» que se encuentra en la raíz de la tarjeta MicroSD. Editamos el fichero con el block de notas o el editor de texto que prefiramos.

Configuración WiFi (solo Raspberry Pi 4)

Veremos en el fichero una sección que empieza por «wifis» y que tiene todas las líneas comentadas con el carácter «#».  Debemos cambiar toda esta parte para que quede de la siguiente manera:

wifis:
   wlan0:
     dhcp4: false
     addresses: [192.168.1.55/24]
     gateway4: 192.168.1.1
     nameservers:
        addresses: [192.168.1.1, 8.8.8.8, 8.8.4.4]
     optional: true
     access-points:
        "Nombre Wifi":
            password: "MiPassword123"

En esta configuración hemos escogido la dirección IP 192.168.1.55 para nuestro nodo. Antes de escoger esta dirección debemos comprobar que no esté siendo utilizada por ningún otro dispositivo en nuestra red. En caso de ser utilizada deberemos escoger otra dirección 192.168.1.XX que esté libre. También hemos configurado la propia puerta de enlace como nameservers y como secundarios los DNS de Google. Si conoces cuales son los nameservers de tu ISP puedes configurarlos directamente en vez de los que vienen en la configuración.

Configuración por cable

ethernets:
  eth0:
    addresses:
      - 192.168.1.55/24
    gateway4: 192.168.1.1
    nameservers:
      addresses: [192.168.1.1, 8.8.8.8, 8.8.4.4]
    optional: true

Al igual que con la configuración del WiFi, si hemos escogido configurar el acceso a la red por cable deberemos asegurarnos que la IP escogida, en este caso 192.168.1.55, esté libre y no esté siendo usada por otro dispositivo. De igual manera si conocemos los nameservers de nuestra ISP podemos configurarlos también en vez de los nameservers públicos de Google.

Conectando con la Raspberry Pi

Si todo ha ido bien, ya podríamos insertar la tarjeta MicroSD en nuestra Raspberry Pi, conectar el disco duro y conectar la fuente de potencia (y el cable de ethernet en caso de configurarla por cable). Tras unos minutos de arranque debería estar lista para conectarnos a ella. Para conectar hay diferentes formas dependiendo del sistema operativo en el que nos encontremos.

En cualquier caso, la primera vez que conectemos tendremos un usuario y contraseña por defecto para conectar. Los datos son:

  • Usuario: ubuntu
  • Password: ubuntu

Importante: La primera vez que conectemos Ubuntu nos va a pedir que cambiemos la contraseña por defecto.

Conectar desde Windows

Para conectar desde Windows yo recomiendo usar la herramienta Putty. La configuración es muy sencilla, simplemente pondremos en «Host name» la dirección IP que configuramos en los pasos anteriores, en puerto colocaremos 22 (el puerto para SSL) y tipo de conexión marcaremos SSL.

Ejemplo de conexión con Putty

Conectar desde Linux y MacOS

Para conectar desde estos sistemas simplemente usaremos el comando SSH:

 ubuntu@bitcoinnode$ ssh ubuntu@192.168.1.55

Configurando el sistema operativo

Ahora que ya tenemos el sistema instalado, conectado a la red y podemos conectarnos sin problemas es hora de hacer algunas últimas configuraciones. Lo primero vamos a darle un nombre de máquina al nodo, para eso vamos a ejecutar el siguiente comando:

 ubuntu@bitcoinnode$ sudo hostnamectl set-hostname bitcoinnode

Ahora vamos a configurar nuestra zona horaria, para eso vamos a ejecutar el siguiente comando:

 ubuntu@bitcoinnode$ timedatectl set-timezone Europe/Madrid

Yo al encontrarme en España lo he configurado con el timezone Europe/Madrid, pero te encuentras en otra parte del mundo aquí te dejo la lista de timezones disponibles.

Actualizando el sistema operativo

Antes de continuar vamos a actualizar nuestro sistema operativo y así evitar problemas más adelante. Para actualizarlo vamos a ejecutar los siguientes dos comandos:

 ubuntu@bitcoinnode$ sudo apt update
 ubuntu@bitcoinnode$ sudo apt upgrade

Una vez termine de actualizarse vamos a instalar una serie de paquetes que nos vendrán muy bien más adelante. Para eso vamos a ejecutar el siguiente comando:

 ubuntu@bitcoinnode$ sudo apt install raspi-config rpi-eeprom git curl bash-completion jq qrencode dphys-swapfile –install-recommends

Con este comando estaremos instalando lo siguiente:

  • raspi-config: Es el gestor de configuración de Raspberry.
  • rpi-eeprom:  Es una actualización de bootloader de Raspberry Pi.
  • git: El cliente para manejar el gestor de repositorios GIT.
  • curl: Es un cliente para trabajar con urls y descargar archivos desde la consola de comandos.
  • bash-completion: Es un paquete que nos facilita trabajar con la consola permitiendo completar los comandos y directorios.
  • jq: Es un procesador de JSON para la línea de comandos.
  • qrencode: Es un paquete para generar y leer códigos QR en Linux.
  • dphys-swapfile: Un paquete muy útil para trabajar con el fichero de swap.

Una vez instalados todos los paquetes, vamos a limpiar la instalación y vamos a reiniciar la Raspberry Pi para que todos los cambios queden aplicados.

 ubuntu@bitcoinnode$ sudo apt –fix-broken install
 ubuntu@bitcoinnode$ sudo apt autoremove
 ubuntu@bitcoinnode$ sudo reboot

Tras unos minutos de reinicio podremos volver a conectar a nuestra Raspberry Pi.

Configuración específica para Raspberry Pi

Aunque esta guía está pensada para Raspberry Pi, puede ser instalada en cualquier otro dispositivo compatible con un Ubuntu Server 64-Bit. Si no estás usando una Raspberry Pi, puedes saltarte este paso.

Vamos a configurar la Raspberry Pi para que use todo el espacio disponible en nuestra tarjeta MicroSD. Para eso vamos a ejecutar el siguiente comando:

 ubuntu@bitcoinnode$ sudo raspiconfig

Entre las opciones que nos presenta, escogeremos «8  Update». Una vez termine de actualizarse, repetiremos el comando anterior y escogeremos la opción «Advanced Options > Expand Filesystem». Una vez finalizado el proceso reiniciaremos la Raspberry Pi con el comando:

 ubuntu@bitcoinnode$ sudo reboot

Creación de usuarios

Durante la guía vamos a trabajar con varios usuarios, los cuáles cada uno tendrá un propósito específico.

Usuario administrador

Aunque el usuario por defecto «ubuntu» ya cumple con esta función, se recomienda no usar ese usuario y crear un usuario específico para la administración. Para ello vamos a ejecutar los siguientes comandos:

 ubuntu@bitcoinnode$ sudo adduser admin –ingroup sudo
 ubuntu@bitcoinnode$ sudo adduser admin sudo

Usuario bitcoin

Cuando instalemos Bitcoin Core, el proceso va a correr en segundo plano bajo el control del usuario «bitcoin» el cuál no tendrá permisos de administrador y no podrá cambiar la configuración del sistema. Esto se hace así por motivos de seguridad.

 ubuntu@bitcoinnode$ sudo adduser bitcoin

Ahora vamos a incluir al usuario «admin» en el grupo «bitcoin» para que pueda ver los ficheros de configuración de Bitcoin Core.

 ubuntu@bitcoinnode$ sudo adduser admin bitcoin

Y para finalizar vamos a reiniciar la Raspberry Pi.

 ubuntu@bitcoinnode$ sudo reboot

Importante: Cuando volvamos a conectar, ¡recordad conectar con el usuario «admin»!

 ubuntu@bitcoinnode$ ssh admin@192.168.1.55

Montando el disco duro

En esta sección vamos a formatear el disco duro en el formato Ext4 y lo vamos a montar y configurar para que se automonte cada vez que arrancamos el nodo.

Creando la partición EXT4

Para crear la partición vamos a ejecutar el siguiente comando:

 admin@bitcoinnode$ sudo fdisk /dev/sda

A continuación, tendremos que presionar la tecla «n» para crear una nueva partición. El resto de opciones que nos pregunta las dejaremos por defecto simplemente presionando la tecla Enter en cada una de ellas. Una vez termine la creación, para salir del menú de Fdisk pulsaremos la tecla «q».

Ahora vamos a crear el sistema de archivos en la partición, para eso vamos a ejecutar el comando:

 admin@bitcoinnode$ sudo mkfs.ext4 /dev/sda1

Si todo ha ido correctamente, no habremos recibido ningún mensaje de error y podremos proceder a reiniciar nuestra Raspberry Pi

 admin@bitcoinnode$ sudo reboot

Montando el disco duro externo

Ahora tenemos que montar el disco duro para poder acceder a él desde el sistema de ficheros. Lo primero que vamos a hacer es localizar el UUID de nuestro disco duro, para eso ejecutaremos el comando:

 admin@bitcoinnode$ lsblk -o NAME,MOUNTPOINT,UUID,FSTYPE,SIZE,LABEL,MODEL

Y deberíamos ver algo parecido a esto:

Ejemplo del resultado de ejecutar el comando lsblk

Nos apuntaremos el UUID del disco duro que vamos a utilizar después.

Ahora vamos a editar el fichero fstab para hacer que el disco duro se monte automáticamente cada vez que arranquemos la Raspberry Pi. Para eso vamos a ejecutar el comando:

 admin@bitcoinnode$ sudo nano /etc/fstab

Y simplemente tenemos que añadir al final del archivo una nueva línea con el siguiente contenido:

UUID=XXX-XXX-XXX /mnt/ext ext4 rw,nosuid,dev,noexec,noatime,nodiratime,auto,nouser,async,nofail 0 2

Donde simplemente tendremos que sustituir «XXX-XXX-XXX» por el UUID completo que habíamos copiado en el paso anterior.

Ahora lo siguiente será crear el directorio donde se va a montar el disco duro y que hemos definido previamente en el fichero fstab. Vamos a ejecutar el comando:

 admin@bitcoinnode$ sudo mkdir /mnt/ext

Finalmente vamos a montar todas las unidades:

 admin@bitcoinnode$ sudo mount -a

Y para verificar que esté el disco duro montado correctamente ejecutaremos el siguiente comando:

 admin@bitcoinnode$ df -h /mnt/ext

Y si todo ha ido bien veremos algo parecido a esto (en mi ejemplo, ya tengo la blockchain descargada por lo que los tamaños no serán iguales):

Ejemplo de resultado del comando df - h

Creando el directorio bitcoin

Lo siguiente que tenemos que hacer es crear el directorio «bitcoin» que es donde nuestro Bitcoin Core va a descargar la blockchain. Para eso lo primero tenemos que hacer propietario al usuario «bitcoin» del directorio donde estamos montando el disco duro. Para eso vamos a ejecutar el comando:

 admin@bitcoinnode$ sudo chown -R bitcoin:bitcoin /mnt/ext/

Ahora vamos a cambiarnos al usuario «bitcoin» para seguir ya trabajando con él. Para cambiar de usuario en Linux simplemente tenemos que ejecutar el comando:

 admin@bitcoinnode$ sudo su – bitcoin

Ya desde el usuario Bitcoin vamos a movernos a la carpeta del disco duro y vamos a crear el directorio «bitcoin»:

 admin@bitcoinnode$ sudo cd /mnt/ext
 admin@bitcoinnode$ sudo mkdir bitcoin

Para verificar que el directorio se ha creado correctamente, vamos a probar a escribir un fichero y a borrarlo después. Para eso vamos a ejecutar los comandos:

 admin@bitcoinnode$ touch bitcoin/directorio.test
 admin@bitcoinnode$ rm bitcoin/directorio.test

Si lo hemos creado y eliminado correctamente, ya tenemos el disco duro casi listo para empezar a descargar la blockchain.  Ahora vamos a salir del usuario «bitcoin» para volver al usuario «admin» con el comando:

 admin@bitcoinnode$ exit

Mover el fichero de intercambio

El fichero de intercambio es un fichero de apoyo a la memoria muy importante en Linux pero que si lo dejamos en nuestra tarjeta MicroSD puede dañarla con el tiempo. Por eso vamos a moverlo a nuestro disco duro donde no tendremos ningún problema con el. Para ello vamos a ejecutar el comando:

 admin@bitcoinnode$ sudo nano /etc/dphys-swapfile

Y simplemente tenemos que añadir lo siguiente:

CONF_SWAPFILE=/mnt/ext/swapfile

Y para finalizar vamos a regenerar el fichero en la nueva ruta y vamos a reiniciar la Raspberry Pi para aplicar los cambios:

 admin@bitcoinnode$ sudo dphys-swapfile install
 admin@bitcoinnode$ sudo reboot

Con esto ya hemos acabado con la configuración tanto del sistema operativo como de la Raspberry Pi y nos encontramos listos para empezar a instalar Bitcoin Core.

Seguridad y Privacidad. Protegiendo nuestro nodo de Bitcoin.

En esta sección vamos a hacer algunas configuraciones básicas a nivel de seguridad como instalar un firewall, aumentar el límite de conexiones e instalar Tor para que todos nuestros servicios corran sobre él.

Instalando Uncomplicated Firewall

UFW es un firewall disponible para Linux que recomiendo mucho debido a su extremada simpleza. Para instalarlo tan solo deberemos ejecutar el comando:

 admin@bitcoinnode$ sudo apt install ufw

Una vez instalado vamos a configurarlo y levantarlo con los siguientes comandos:

 admin@bitcoinnode$ sudo ufw default deny incoming
 admin@bitcoinnode$ sudo ufw default allow outgoing
 admin@bitcoinnode$ sudo ufw allow 22 comment ‘allow SSH’
 admin@bitcoinnode$ sudo ufw allow 50002 comment ‘allow Electrum SSL’
 admin@bitcoinnode$ sudo ufw enable
 admin@bitcoinnode$ sudo systemctl enable ufw

Con esto hemos limitado las conexiones al puerto de SSH (22) y al puerto donde habitualmente ejecuta el servicio de Electrum (50002). Si tienes intención de cambiar este puerto por defecto, debes recordar actualizar las directivas del router para que permita la entrada de paquetes por el nuevo puerto.

Si todo ha ido bien durante la configuración, podremos ejecutar el siguiente comando y deberemos ver un resultado similar:

 admin@bitcoinnode$ sudo ufw status

Ejemplo del resultado al consultar la tabla de reglas del Firewall

Aumentar el límite de ficheros abiertos

Cuando se reciben peticiones desde internet, se crea y abre un fichero por cada petición TCP recibida. Si tenemos muchas peticiones y no hemos aumentado el límite de ficheros empezaremos a ver el conocido error: «Can’t accept connection: too many open files».

Para aumentar el límite de ficheros abiertos necesitamos agregar unas líneas en la configuración de seguridad. Para ello ejecutaremos el comando:

 admin@bitcoinnode$ sudo nano /etc/security/limits.conf

Y agregaremos lo siguiente al final del archivo:

*    soft nofile 128000
*    hard nofile 128000
root soft nofile 128000
root hard nofile 128000

Para guardar pulsaremos control + O  y seguidamente pulsamos control + X para salir.

Ahora deberemos modificar dos ficheros más y añadir una línea al final para que esta nueva configuración se cargue en las sesiones:

 admin@bitcoinnode$ sudo nano /etc/pam.d/common-session
session required pam_limits.so
 admin@bitcoinnode$ sudo nano /etc/pam.d/common-session-noninteractive
session required pam_limits.so

Y para terminar que se apliquen todos los cambios vamos a reiniciar la Raspberry Pi:

 admin@bitcoinnode$ sudo reboot

Instalando y configurando Tor

Tor es un proyecto de software gratuito creado por Tor Project que nos permite anonimizar el tráfico de internet enrutándolo por una red de nodos lo que hace extremadamente difícil poder seguir un paquete hasta su origen.

Para poder instalar Tor en nuestro nodo antes debemos añadir sus repositorios a la lista de fuentes del sistema. Para ello ejecutamos el comando:

 admin@bitcoinnode$ sudo nano /etc/apt/sources.list

Y agregamos las siguientes líneas:

deb https://deb.torproject.org/torproject.org impish main
deb-src https://deb.torproject.org/torproject.org impish main

A continuación, tenemos que actualizar la lista de repositorios con el comando:

 admin@bitcoinnode$ sudo apt update

Y ya podemos instalar Tor con el comando:

 admin@bitcoinnode$ sudo apt install tor

Una vez que termine de instalarse debemos verificar que el usuario de fichero «tor-service-defaults-torrc» sea «debian-tor»:

 admin@bitcoinnode$ cat /usr/share/tor/tor-service-defaults-torrc

Ejemplo de comprobación del usuario para Tor

Ahora para que los servicios de Bitcoin Core puedan correr sobre Tor necesitamos incluir al usuario «bitcoin» en el grupo «debian-tor». Para eso vamos a ejecutar el comando:

 admin@bitcoinnode$ sudo adduser bitcoin debian-tor

Si todo ha ido bien podremos comprobar que el usuario «bitcoin» pertenezca al grupo «debian-tor»:

 admin@bitcoinnode$ cat /etc/group | grep debian-tor

Ejemplo de la comprobación de bitcoin pertenezca al grupo debian-tor

Para finalizar solo nos queda configurar Tor, para eso deberemos editar su fichero de configuración con el comando:

 admin@bitcoinnode$ sudo nano /etc/tor/torrc

En este fichero debemos localizar estas dos líneas y descomentarlas eliminando el carácter «#» que viene por delante:

ControlPort 9051
CookieAuthentication 1

Y antes de salir del fichero debemos agregar las siguientes líneas:

CookieAuthFileGroupReadable 1
  
HiddenServiceDir /var/lib/tor/hidden_service_ssh/
HiddenServiceVersion 3
HiddenServicePort 22 127.0.0.1:22

Guardamos los cambios con «control + O» y salimos del fichero con «control + X«. Ahora vamos a reiniciar la Raspberry para que se apliquen todos los cambios:

 admin@bitcoinnode$ sudo reboot

Y ahora si queremos ver nuestra dirección onion para conectar por SSH bajo Tor a nuestro nodo podemos hacerlo con el comando:

 admin@bitcoinnode$ sudo cat /var/lib/tor/hidden_service_ssh/hostname

Ejemplo de consulta de la dirección .onion del nodo de bitcoin

 

Instalando Bitcoin Core

En esta guía vamos a utilizar Bitcoin Core para montar nuestro nodo de Bitcoin. Bitcoin Core es el software que se encargará de descargar y sincronizar toda la blockchain de Bitcoin y validará toda las transacciones existentes y las futuras que llegarán. Es importante tener en cuenta que se van a descargar todas las transacciones desde 2009 y esto, mientras escribo esta guía, supone ya un peso de 428GB.

Descargando e instalando los binarios de Bitcoin Core

Lo primero que vamos a hacer es descargar los binarios de Bitcoin Core para poder instalarlo en nuestro sistema. Hay que tener en cuenta que Bitcoin Core sigue evolucionando y la última versión disponible puede ser superior al de esta guía. Por eso recomiendo siempre revisar en la web oficial cuál es la última versión, y simplemente ajustar los próximos comandos a esta versión.

Lo primero, vamos a acceder a nuestro nodo con el usuario «admin» y vamos a movernos al directorio «tmp» que en Linux este directorio es un directorio especial que se borra tras cada reinicio del sistema.

 admin@bitcoinnode$ cd /tmp

Ahora vamos a descargar en esta carpeta los binarios de Bitcoin Core, para ello vamos a ejecutar el siguiente comando y vamos a esperar a que termine la descarga:

 admin@bitcoinnode$ wget https://bitcoincore.org/bin/bitcoin-core-23.0/bitcoin-23.0-aarch64-linux-gnu.tar.gz

Una vez descargados los binarios, vamos a descomprimirlos a instalarlos con los siguientes dos comandos:

 admin@bitcoinnode$ tar -xvf bitcoin-23.0-aarch64-linux-gnu.tar.gz
 admin@bitcoinnode$ sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-23.0/bin/*

Y para comprobar que Bitcoin Core está instalado correctamente, vamos a pedirle que nos muestre la versión, lo cual nos debería indicar «Bitcoin Core version v23.0.0»:

 admin@bitcoinnode$ bitcoind –version

Configuración de Bitcoin Core

Ahora lo que debemos hacer es preparar el directorio donde se va a descargar toda la información de Bitcoin. Toda esta descarga la realiza el proceso (o demonio) «bitcoind» que tratará de guardar la información en la ruta «/home/bitcoin/.bitcoin». Esta ruta quedaría en nuestra tarjeta microSD y aquí no podemos guardar la blockchain por motivos que ya hemos explicado antes. Lo que vamos a hacer es crear un enlace simbólico para que relacione esa ruta con la carpeta que ya habíamos creado para el propósito de descargar la blockchain de Bitcoin. Para esto, vamos a cambiarnos al usuario «bitcoin»:

 admin@bitcoinnode$ sudo su – bitcoin

Y vamos a ejecutar el siguiente comando para crear el enlace:

 bitcoin@bitcoinnode$ ln -s /mnt/ext/bitcoin /home/bitcoin/.bitcoin

Si todo ha ido bien, ejecutando el siguiente comando deberíamos ver una respuesta como esta:

 bitcoin@bitcoinnode$ ls – la

Ejemplo de un enlace simbólico en el nodo de bitcoin

Ahora vamos a crear el fichero de configuración para Bitcoin Core. Para ello vamos a ejecutar el siguiente comando que creará el fichero:

 bitcoin@bitcoinnode$ nano /mnt/ext/bitcoin/bitcoin.conf

Y en su interior vamos a copiar el siguiente contenido:

# Bitcoin daemon
server=1
txindex=1

# Network
listen=1
listenonion=1
proxy=127.0.0.1:9050
bind=127.0.0.1

# Connections
rpcuser=bitcoinnode
rpcpassword=CHANGE_THIS_PASSWORD
maxconnections=40
maxuploadtarget=5000
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333

# Optimizations
whitelist=download@127.0.0.1
dbcache=2000
blocksonly=1

Importante: No olvide cambiar la contraseña de RPC por una de su elección.

Guradamos los cambios con control + O y salimos con control + X

Ejecutando Bitcoin Core

Ya estamos listos para iniciar Bitcoin Core pero antes vamos a configurar el sistema para que arranque automáticamente el demonio de Bitcoin Core cada vez que reiniciemos la Raspberry pi. Para esto vamos a salir del usuario «bitcoin» para volver al usuario «admin» con el comando:

 bitcoin@bitcoinnode$ exit

Vamos a crear el fichero de configuración para nuestro servicio que será el encargado de iniciar el demonio de Bitcoin Core:

 admin@bitcoinnode$ sudo nano /etc/systemd/system/bitcoind.service

Y en su interior vamos a copiar el siguiente contenido:

# /etc/systemd/system/bitcoind.service

[Unit]
Description=Bitcoin daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/bitcoind -daemon \
                                  -pid=/run/bitcoind/bitcoind.pid \
                                  -conf=/mnt/ext/bitcoin/bitcoin.conf \
                                  -datadir=/mnt/ext/bitcoin

Type=forking
PIDFile=/run/bitcoind/bitcoind.pid
Restart=on-failure
TimeoutSec=300
RestartSec=30
User=bitcoin
Group=bitcoin
RuntimeDirectory=bitcoind
RuntimeDirectoryMode=0710
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
NoNewPrivileges=true
PrivateDevices=true
MemoryDenyWriteExecute=true

[Install]
WantedBy=multi-user.target

De este fichero no necesitamos entender nada, nos vale con saber que el usuario y el grupo con el que vamos a ejecutar el servicio te define con «User» y «Group».

Ahora vamos a habilitar el servicio para quede activo:

 admin@bitcoinnode$ sudo systemctl enable bitcoind.service

Ahora para que el servicio tenga acceso al directorio de datos, vamos a crear otro enlace simbólico que va a permitir leer estos ficheros:

 admin@bitcoinnode$ ln -s /mnt/ext/bitcoin/ /home/admin/.bitcoin

Y ya solo nos queda reiniciar la Raspberry Pi para que se apliquen todos los cambios:

 admin@bitcoinnode$ sudo reboot

Verificando la instalación de Bitcoin Core

Una vez reiniciada la Raspbery y tras unos minutos para que vuelva a iniciarse todo vamos a conectar de nuevo con el usuario «admin» y vamos a verificar que todo ha salido bien. Primero vamos a comprobar que el servicio está activo:

 admin@bitcoinnode$ systemctl status bitcoind.service

Ejemplo del resultado del comando systemctl al consultar el servicio de Bitcoin

Pulsamos «control + C» para salir de ahí, y ahora vamos a usar el cliente de Bitcoin Core para comprobar que está funcionando:

 admin@bitcoinnode$ bitcoin-cli getblockchaininfo

Ejemplo del resultado de usar el comando bitcoin-cli y obtener la información de la blockchain

Si todo ha ido bien recibiremos una respuesta parecida a la que vemos arriba. En mi caso, ya tengo la cadena completamente sincronizada y para saberlo debemos fijarnos en el atributo «verificationprogress». Cuando este atributo tiene un valor cercano a 1 (como se ve en la captura) la blockchain está completamente sincronizada y lista para validar transacciones.

Ahora ya no podemos continuar hasta que la cadena se descargue completamente. Este proceso puede llegar a tardar hasta 1 semana dependiendo de la velocidad de conexión a internet y el tipo de disco duro.

Ajustes tras la sincronización completa

Para acelerar la descarga inicial de la blockchain habíamos configurado la cache de datos con más tamaño, pero una vez descargada esto ya no es necesario y debemos reducirla para liberar memoria que más tarde aprovecharemos mejor. Para ello, tenemos que volver a conectar con el usuario «admin» y vamos a editar el fichero de configuración de Bitcoin Core :

 admin@bitcoinnode$ bitcoin-cli getblockchaininfo

Al final del fichero vamos a ver las siguientes dos líneas que debemos comentar añadiendo el carácter «#» por delante:

#dbcache=2000
#blocksonly=1

Y ahora para que los cambios se apliquen, vamos a reiniciar el servicio

 admin@bitcoinnode$ sudo systemctl restart bitcoind

Ampliando nuestro nodo con Electrum Server y BTC RPC Explorer

Ahora ya tenemos nuestro nodo validando transacciones, pero si queremos ser realmente soberanos sobre nuestro dinero necesitamos instalar dos cosas más. Una de ellas es Electrum Server (a través de Electrs) que será el servicio que nos permitirá conectar nuestras wallets con el nodo. El otro será BTC RPC Explorer, que es una interfaz web que nos permite consultar transacciones, direcciones o bloques en la blockchain de Bitcoin desde nuestro nodo.

Instalando y configurando Electrum Server con Electrs

Instalación de dependencias

Primero vamos a instalar las dependencias que vamos a necesitar para instalar, configurar y correr Electrum Server en nuestro nodo. Lo primero vamos a instalar el paquete del lenguaje de programación Rust. Al igual que con Bitcoin Core, recomiendo revisar cual es la última versión para «aarch64-unknown-linux-gnu» disponible desde su página web y ajustar los comandos a ella:

Accedemos con el usuario «admin», nos desplazamos a la carpeta «tmp» y comenzamos la descarga:

 admin@bitcoinnode$ cd /tmp
 admin@bitcoinnode$ curl https://static.rust-lang.org/dist/rust-1.64.0-aarch64-unknown-linux-gnu.tar.gz -o rust.tar.gz

Ahora para instalarlo, vamos a crear el directorio donde se instalará y procederemos a su instalación ejecutando los siguientes comandos:

 admin@bitcoinnode$ mkdir /home/admin/rust
 admin@bitcoinnode$ tar –strip-components 1 -C /home/admin/rust -xzvf rust.tar.gz
 admin@bitcoinnode$ cd /home/admin/rust
 admin@bitcoinnode$ sudo ./install.sh

Ahora vamos a instalar un compilador de C y C++ y un automatizador de construcción de software:

 admin@bitcoinnode$ sudo apt update
 admin@bitcoinnode$ sudo apt install -y clan cmake

Instalando Electrs

Ahora vamos a descargar e instalar Electrs. Este proceso puede alargarse hasta 30 minutos. Para instalarlo vamos a movernos al directorio que habíamos creado para Rust y vamos a descargar desde el repositorio en Github la última versión de Electrs:

 admin@bitcoinnode$ cd /home/admin/rust
 admin@bitcoinnode$ electrsgit=$(curl -s https://api.github.com/repos/romanz/electrs/tags | jq -r ‘.[0].name’)
 admin@bitcoinnode$ git clone –branch ${electrsgit} https://github.com/romanz/electrs.git

Ahora, vamos a movernos al directorio que se habrá creado para Electrs, y vamos a compilar los binarios:

 admin@bitcoinnode$ cd electrs

 admin@bitcoinnode$ cargo build –locked –release

Y para finalizar la instalación, vamos a copiar todos los binarios ya compilados a la ruta donde quedará instalado finalmente:

 admin@bitcoinnode$ sudo cp ./target/release/electrs /usr/local/bin/

Configuración e Indexación:

Lo primero que vamos a hacer es crear el directorio para los datos de Electrum. Para ello nos cambiamos al usuario «bitcoin» y en el mismo directorio home vamos a ejecutar estos comandos:

 bitcoin@bitcoinnode$ mkdir /mnt/ext/electrs
 bitcoin@bitcoinnode$ ln -s /mnt/ext/electrs /home/bitcoin/.electrs

Ahora vamos a crear el fichero de configuración con el comando:

 bitcoin@bitcoinnode$ nano /mnt/ext/electrs/electrs.conf

Y vamos a copiar el siguiente contenido:

# RPC user / password
auth = "bitcoinnode:RPC_PASSWORD_HERE"

# Bitcoin Core settings
network = "bitcoin"
daemon_dir= "/mnt/ext/bitcoin"
daemon_rpc_addr = "127.0.0.1:8332"
daemon_p2p_addr = "127.0.0.1:8333"

# Electrs settings
electrum_rpc_addr = "127.0.0.1:50001"
db_dir = "/mnt/ext/electrs/db"
index_lookup_limit = 1000
verbose = 2
log_filters = "INFO"
timestamp = true
rust_backtrace = true

Importante: De este fichero solo debemos fijarnos en la propiedad «auth». En esta propiedad estamos indicando el usuario y la password que configuramos para RPC en la sección anterior de Bitcoin Core.

Ahora vamos a crear un servicio para que Electrs se inicie también cada vez que reiniciamos la Raspberry Pi. Para ello volvemos al usuario «admin» y creamos el fichero de configuración para el servicio:

 admin@bitcoinnode$ sudo nano /etc/systemd/system/electrs.service

Y añadimos el siguiente contenido:

# /etc/systemd/system/electrs.service

[Unit]
Description=Electrs daemon
Wants=bitcoind.service
After=bitcoind.service

[Service]
ExecStart=/usr/local/bin/electrs --conf /mnt/ext/electrs/electrs.conf
Type=simple
Restart=always
TimeoutSec=120
RestartSec=30
KillMode=process
User=bitcoin
Group=bitcoin
RuntimeDirectory=electrs
RuntimeDirectoryMode=0710
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
PrivateDevices=true
MemoryDenyWriteExecute=true
WantedBy=multi-user.target

Al igual que con el servicio que creamos para Bitcoin Core, lo único que nos interesa saber es que el servicio va a correr bajo el usuario y grupo «bitcoin». Ahora vamos a habilitar el servicio y vamos a iniciarlo:

 admin@bitcoinnode$ sudo systemctl enable electrs

 admin@bitcoinnode$ sudo systemctl start electrs

Ahora para comprobar que está funcionado correctamente, ejecutamos el siguiente comando y podemos ver cómo ha empezado a indexar:

 admin@bitcoinnode$ sudo journalctl -f -u electrs

Ejemplo de comprobar el estado de Electrs

Protegiendo la comunicación con Electrum Server

Es importante que toda comunicación con nuestro servidor de Electrum sea segura y vaya encriptada bajo SSL/TLS. Además, es importante habilitar Tor para este servicio para tener aún más privacidad.

Para lograr esto vamos a instalar primero NGINX que nos ofrecerá una forma segura de comunicarnos con Electrum sin necesidad de cifrarlo. Para ello vamos a instalarlo con el comando:

 admin@bitcoinnode$ sudo apt install -y nginx

A continuación, vamos a crear un certificado autofirmado de TLS con una valided de 10 años:

 admin@bitcoinnode$ sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt -subj «/CN=localhost» -days 3650

Ahora vamos a borrar la configuración por defecto de NGINX ya que no nos interesa toda la parte del servidor web y queremos configurar un reverse proxy para Electrs. Para ello vamos a renombrar el fichero de configuración original (para guardar una copia en vez de eliminarlo) con el comando:

 admin@bitcoinnode$ sudo sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

Y ahora vamos a crear uno nuevo con el siguiente contenido:

 admin@bitcoinnode$ sudo nano /etc/nginx/nginx.conf
user www-data;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
  worker_connections 768;
}

stream {
  ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
  ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 4h;
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;

  upstream electrs {
    server 127.0.0.1:50001;
  }
  server {
    listen 50002 ssl;
    proxy_pass electrs;
  }
}

Ahora vamos a comprobar que NGINX ha cogido bien la configuración con el comando:

 admin@bitcoinnode$ sudo nginx -t

Ejemplo de comprobar la configuración de NGINX

Si todo ha ido bien como se puede ver en la captura de arriba vamos a reiniciar el servicio:

 admin@bitcoinnode$ sudo systemctl restart nginx

Ahora ya solo nos queda configurar el acceso remoto a nuestro Electrs vía Tor. Para eso, vamos a añadir tres líneas en la sección para servicios ocultos del fichero de configuración de «torrc»:

 admin@bitcoinnode$ sudo nano /etc/tor/torrc
############### This section is just for location-hidden services ###
HiddenServiceDir /var/lib/tor/hidden_service_electrs/
HiddenServiceVersion 3
HiddenServicePort 50002 127.0.0.1:50002

Ahora simplemente reiniciamos Tor, y ya podremos consultar la ruta .onion para conectar con Electrs:

 admin@bitcoinnode$ sudo systemctl restart tor

 admin@bitcoinnode$ sudo cat /var/lib/tor/hidden_service_electrs/hostname

Ejemplo de consultar la ruta .onion de Electrs

 

Instalando y configurando BTC RPC Explorer

Instalación de dependencias

Para poder ejecutar este explorador de boques necesitamos instalar NodeJS en nuestro nodo. Lo primero vamos a tener que elevar nuestros permisos a nivel de «root» y vamos a añadir el repositorio de paquetes de NodeJS. A continuación, salimos de la sesión «root» ya que es un nivel de privilegios que deberíamos usar únicamente para acciones imprescindibles como esta.

 admin@bitcoinnode$ sudo su

 admin@bitcoinnode$ curl -sL https://deb.nodesource.com/setup_14.x | bash –

 admin@bitcoinnode$ exit

Y ya podemos proceder con su instalación:

 admin@bitcoinnode$ sudo apt-get install nodejs

Ahora solo nos queda abrir el puerto necesario en el Firewall que instalamos al comienzo de esta guía:

 admin@bitcoinnode$ sudo ufw allow 3002 comment ‘allow BTC RPC Explorer’

Instalando BTC RPC Explorer

Para esta instalación vamos a crear un usuario nuevo que va a ser el encargado de manejar el explorador de bloques. Esto lo hacemos por motivos de seguridad, así cada servicio va a tener sus propios usuarios y con esto minimizamos los riesgos.

 admin@bitcoinnode$ sudo adduser btcrpcexplorer

Ahora nos cambiamos a este nuevo usuario y vamos a bajarnos los binarios desde su repositorio de Github:

 admin@bitcoinnode$ sudo su – btcrpcexplorer

 btcrpcexplorer@bitcoinnode$ git clone –branch v3.2.0 https://github.com/janoside/btc-rpc-explorer.git

Ahora para instalarlo simplemente nos movemos al nuevo directorio y realizamos la instalación con npm:

 btcrpcexplorer@bitcoinnode$ cd btc-rpc-explorer

 btcrpcexplorer@bitcoinnode$ npm install

Configurando BTC RPC Explorer

BTC RPC Explorer ya viene con una plantilla para su configuración. Vamos a habilitarla y a editarla con los siguientes comandos:

 btcrpcexplorer@bitcoinnode$ cp .env-sample .env

 btcrpcexplorer@bitcoinnode$ nano .env

Lo primero que debemos hacer es indicarle que se conecte Bitcoin Core, para eso debemos buscar las siguientes líneas y descomentarlas quitando el carácter «#» que viene delante:

BTCEXP_BITCOIND_HOST=127.0.0.1
BTCEXP_BITCOIND_PORT=8332
BTCEXP_BITCOIND_USER=bitcoinnode
BTCEXP_BITCOIND_PASS=RPC_PASSWROD_HERE

Es importante añadir la contraseña que configuramos en la sección de Bitcoin Core para las conexiones RPC. Ahora vamos a realizar alguna serie de configuraciones más cómo darle acceso a Electrum para consultar saldos o algunas configuraciones de privacidad. Debemos buscar las siguientes líneas en el documento e ir descomentandolas eliminando el carácter «#»:

BTCEXP_ADDRESS_API=electrum
BTCEXP_ELECTRUM_SERVERS=tcp://127.0.0.1:50001

BTCEXP_BITCOIND_RPC_TIMEOUT=10000

BTCEXP_ELECTRUM_TXINDEX=true
BTCEXP_PRIVACY_MODE=true

BTCEXP_NO_RATES=false

BTCEXP_RPC_ALLOWALL=false

DEBUG=btcexp:app,btcexp:error,www

Guardamos con «control + O» y salimos con «control + X»

Ahora al igual que los otros servicios vamos a hacer que el BTC RPC Explorer se arranque automáticamente con cada reinicio de la Raspberry Pi. Para ello volvemos al usuario «admin» y creamos el fichero para el servicio:

 admin@bitcoinnode$ sudo nano /etc/systemd/system/btcrpcexplorer.service
# /etc/systemd/system/btcrpcexplorer.service

[Unit]
Description=BTC RPC Explorer
After=network.target bitcoind.service
After=electrs.service

[Service]
WorkingDirectory=/home/btcrpcexplorer/btc-rpc-explorer
ExecStart=/usr/bin/npm start
User=btcrpcexplorer
Restart=on-failure
StartLimitIntervalSec=600
StartLimitBurst=2

[Install]
WantedBy=multi-user.target

Ahora simplemente vamos a habilitar el servicio y a activarlo:

 admin@bitcoinnode$ sudo systemctl enable btcrpcexplorer.service

 admin@bitcoinnode$ sudo systemctl start btcrpcexplorer.service

Si todo ha ido bien deberíamos poder acceder desde el navegador a través de la IP de nuestro nodo y el puerto 3002. En el caso del ejemplo de esta guía sería en ‘http://192.168.1.55:3002/’ y veremos una página como esta:

Captura de BTC RPC Explorer en ejecución

Protegiendo la comunicación con BTC RPC Explorer

Y ya para acabar vamos a hacer que nuestro servicio de BTC RPC Explorer se ejecute bajo Tor. Para ello vamos a volver a añadir tres líneas en el fichero de configuración de ‘torrc’ en la sección para los servicios ocultos, tal como hicimos en la parte de Electrs:

 admin@bitcoinnode$ sudo nano /etc/tor/torrc
HiddenServiceDir /var/lib/tor/hidden_service_btcrpcexplorer/
HiddenServiceVersion 3
HiddenServicePort 80 127.0.0.1:3002

Reiniciamos Tor y consultamos la dirección .onion:

 admin@bitcoinnode$ sudo systemctl restart tor

 admin@bitcoinnode$ sudo cat /var/lib/tor/hidden_service_btcrpcexplorer/hostname

Ejemplo de consultar la ruta .onion de BTC RPC Explorer

 

¡Y con esto hemos acabado la instalación y configuración de nuestro nodo de bitcoin completo! Sé que es una guía larga y pueden surgir muchas dudas o problemas por el camino. Para cualquier duda o problema no dudéis en preguntar en los comentarios que estaré encantado de intentar ayudaros.

En un futuro os traeré otra guía para añadir un servidor de Lightning Network a nuestro nodo de Bitcoin.

Comentarios

  • Pingback: Informe V4V – Octubre 2022 – Lunaticoin

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

🔝