Instala tu nodo Bitcoin con Lightning Network y gestiona tu propio Banco

Instala tu nodo Bitcoin con Lightning Network y gestiona tu propio Banco

La motivación para instalar mi propio nodo es tener soberanía monetaria y ser un individuo soberano. La motivación para crear esta guía surge porque muchos bitcoiners quieren tener su propio nodo y no todos tienen el conocimiento técnico para saber cual es la mejor ruta para seguir dentro del infinito mar de posibilidades que se pueden escoger.

Estos son las reflexiones, decisiones y paso a paso que seguí desde que decidí tener mi propio nodo de Bitcoin con Lightning Network.

Algunos de los tutoriales pueden ser retadores para personas no técnicas. Sin embargo si eres un usuario no tan técnico pero con muchos deseos de aprender entonces este tutorial es para ti.

Cada decisión que tomé desde el hardware a usar y que software instalar la sustento con argumentos e intento ser lo más explícito posible. Sin más preámbulo pongamos toda la carne en el asador.

Un nodo de Bitcoin puede usar las siguientes redes:

  • Mainnet: Es la red principal donde están los bitcoins reales (peso de la blockchain 460 GB aproximadamente en el momento de hacer esta guía).
  • Testnet: Es una red parecida a mainnet pero para hacer pruebas.(peso de la blockchain menos de 50 GB)
  • Regtest: Es una red local en la cual puedes crear varios nodos en la misma máquina.

La recomendación es usar la red de testnet para aprender y no arriesgar satoshis reales.

Si vas a instalar un nodo de testnet sólo para probar y quieres hacerlo en el PC que usas habitualmente sólo debes asegurarte que tengas más de 50 GB de espacio disponible.

Cuando quieras usar un nodo en producción o sea en mainnet, lo más aconsejable es destinar una CPU para tal efecto y tener un disco adicional debido al peso actual de la cadena de bloques.

Este artículo se va a centrar en todas las decisiones que tomé para poner un nodo personal en producción, desde el hardware , hasta el tipo de implementación y el tipo de instalación.

Tener en cuenta que cuando me refiero a nodo personal es porque un nodo también puede instalarse con el objetivo de ser enrutador o para brindar algún tipo de servicio y en esos casos hay que tener otro tipo de consideraciones y configuraciones.

Requisitos

Hardware

Los requisitos para instalar un nodo de Bitcoin son particularmente bajos, el recurso más costoso para almacenar la cadena de bloques de la red de mainnet sería el disco duro ya que actualmente pesa 460 GB aproximadamente. Si el nodo se va usar para pruebas en red de testnet solo es necesario tener 50 GB de espacio en disco.

A continuación se detallan cuáles serían los requisitos mínimos para instalar un nodo:

  • CPU con procesador corei3 o similares en adelante. También puede ser una raspberry pi 4.
  • Memoria: Mínimo 4 GB
  • Disco duro de 1 Tera SSD

Buscando un buen costo beneficio me decanté por una CPU de segunda mano con las siguientes características:

  • CPU con procesador Corei3 o similares en adelante.
  • Memoria Ram: 8 GB
  • Disco duro HDD Sata III de 500 GB para el sistema operativo
  • Disco duro de 1 Tera SSD para la blockchain

¿Por qué no usé una raspberry?

En el momento en que deseaba montar el nodo era año de pandemia y las raspberry pi estaban más costosas que comprar una CPU con las características enunciadas arriba. Además una CPU con las características mínimas puede dar mejor estabilidad especialmente porque la microsd de la raspberry a veces se daña.

Software

  • Sistema operativo: El sistema operativo a usar será Linux. ¿Porque Linux? Porque siempre me ha gustado la filosofía que hay detrás del software libre, a nivel de servidores es el sistema operativo más usado y cuando deseas profundizar en desarrollo de protocolos como Bitcoin, es necesario aprender a usar la terminal de comandos.
  • Distribución: Aunque hay varias distribuciones de Bitcoin voy a usar Debian. ¿Porqué Debian? Es una distribución muy estable en la que he tenido diferentes servicios sin ningún tipo de problema. Algo importante a destacar es que todos los pasos serán aplicables a cualquier distribución basada en Debian como Ubuntu o similares.

Instalación de nodo Bitcoin

Usaremos la implementación de Bitcoin Core que es la que inició el mismísimo Satoshi y que implementa el protocolo en su totalidad.

La instalación con un archivo binario es más fácil, pero en el tutorial que te voy a compartir se va a descargar el software del repositorio y lo vamos a compilar.

¿Por qué compilar?

Es mejor compilar para mejorar el desempeño, ya que las instrucciones del programa fuente son totalmente adaptadas a la arquitectura de nuestro procesador.

A continuación te voy a dejar el tutorial: Tutorial cómo instalar Bitcoin Core

Instalación de nodo lightning

Usaremos la implementación Core Lightning. Tener en cuenta que antes se llamaba c-lightning porque está escrita en C, pero dado que se están empezando a escribir módulos en Rust se le cambió el nombre por algo más genérico.

¿Por que Core Lightning?

En este momento la cuota de mercado de Core Lightning es de 6% frente a un 92% de LND (aproxidamente) Esta gran brecha se ha dado porque LND ha desarrolló mas pronto herramientas y documentación para que los developers pudieran construir aplicaciones de forma muy sencilla y en este aspecto LND le tomó ventaja.

Sin embargo Core lightning tiene 4 características que me gustan y son:

  • Es ligero: Consume pocos recursos de la CPU.
  • Es modular: Cada funcionalidad está implementada como un módulo.
  • Es extensible mediante plugins: Se pueden construir en lenguajes como C,Python o Rust.
  • Acceso a comandos JSON-RPC nativos: Usando el plugin Commando y mediante sockets.

A continuación te voy a dejar el tutorial: Tutorial Cómo instalar Core Lightning

Si logras instalar tu nodo de Bitcoin con Lightning Network usando esta guía, testea el nodo invitándome un café y déjame un mensaje que te salga del corazón 🙂 Sats para un café

Como Instalar un nodo completo de Bitcoin Core en Linux Debian 11/Ubuntu con Tor (edición 2022)

Hay cuatro formas de instalar un nodo de Bitcoin, voy a enumerarlas empezando de la más fácil a la más difícil:

1.Con software plug & play como Umbrel, RaspiBlitz o similares. Estos programas tienen instaladores para raspberry pi y también pueden correr en pcs con sistema linux.
En el caso de Umbrel instala un contenedor docker con Bitcoin Core y la implementación LND de Lightning network por defecto usando Tor. Lo cual le da facilidad a usuarios no técnicos de correr un nodo de forma muy simple y con privacidad por defecto.

2.Instalar a partir de contenedores docker.

3.Instalación a partir de binarios ya compilados.En bitcoin.org hay instaladores binarios para varios sistemas operativos, es cuestión de descargarlos y seguir las instrucciones.

4.Bajar el código fuente, compilarlo e instalar.

En este tutorial vamos a desarrollar el punto 4, que puede ser retador para personas no técnicas. Si eres un usuario técnico o no tan técnico pero con muchos deseos de aprender entonces este tutorial es para ti.

Para sacarle el jugo a este tutorial debes haber instalado previamente una versión de Linux basada en Debian como Ubuntu, en mi caso lo hice en Debian 11 Bullseye y también debes haber creado otro usuario además del root. Ahora sí manos a la obra.

La instalación la hice en un Debian 11 Bullseye, pero dado que Ubuntu está basado en Debian, la instalación debe ser igual para las últimas versiones de Ubuntu.

Si tienes una instalación desde cero debes tener dos usuarios en el sistema el root y otro usuario cualquiera que será el usuario en el cual haremos toda la instalación para no trabajar con el usuario root por cuestiones de seguridad.

El usuario que vamos a usar en este tutorial se llama admon y está agregado al grupo sudo para que pueda ejecutar comandos sudo.

Para chequear si el usuario está agregado al grupo sudo ejecuta este comando cambiando admon por tu usuario

$groups admon

En caso de que el resultado anterior no se encuentre el grupo sudo agrégalo con el siguiente comando

$sudo usermod -a -G sudo admon

Instalar programas, librerías y dependencias

Programas que necesitamos

Vamos a instalar estos dos programas que los necesitaremos más adelante:

$sudo apt-get install git curl

Instalar Tor

Vamos a usar Tor, no sólo por la privacidad, sino porque de esa forma no
tenemos que hacer ninguna redirección de puertos en el router que tengamos y tampoco usar servicios dns dinámico para que se refresque nuestra ip en
caso de que sea fija, que es el caso más típico en caso de instalaciones de internet domésticas.

Ahora instalaremos Tor y lo dejaremos listo para cuando lo necesitemos más adelante.

Ejecutamos el siguiente comando para saber el nombre de la distribución linux que estamos usando

$lsb_release -c

Ahora vamos a crear el siguiente archivo

$sudo nano /etc/apt/sources.list.d/tor_repo.list

Edita donde dice bullseye por lo que te haya aparecido a ti y copias allí
las siguiente líneas para poder bajar los repositorios en donde se aloja el código fuente

deb http://deb.torproject.org/torproject.org bullseye main`  
deb-src http://deb.torproject.org/torproject.org bullseye main

presiona Ctrl+x , luego presiona ‘s’ y enter para guardar los cambios.

Ahora ejecuta el siguiente comando para bajar la llave GPG del repositorio para poderla instalar:

$curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | sudo apt-key add -

Ejecutamos este comando para actualizar los repositorios que acabamos de añadir:

$sudo apt-get update

E instalamos:

$sudo apt-get install tor deb.torproject.org-keyring

Ahora vamos a ir a la siguiente ruta para editar el archivo de configuración torrc

$cd /etc/tor

Y añadimos las siguientes líneas

SOCKSPort 9050
Log notice stdout
ControlPort 9051
CookieAuthentication 1 
CookieAuthFileGroupReadable 1 

Ahora vamos a añadir el usuario en donde está la instalación de bitcoin al grupo de Tor. Con este comando encontramos el nombre del Tor group.

$grep User /usr/share/tor/tor-service-defaults-torrc

En nuestro caso aparece debian-tor, entonces añadimos el usuario admon a este grupo:

$sudo usermod -a -G debian-tor admon

Deslogueate y logueate de nuevo para que se apliquen las modificaciones o reinicia el pc.

Ahora vamos a configurar Tor para que arranque cada vez que inicie el pc:

$sudo systemctl enable tor

Y para lanzarlo en este momento ejecutamos

$sudo systemctl start tor

Ahora la máquina está corriendo Tor. El tráfico es normal a menos que le especifiques al software de comunicaciones que estés usando que se conecte a través de Tor como lo haremos más adelante con bitcoind & lightningd.

Librerías y dependencias

Ahora necesitamos instalar algunas librerias. Al instalar librerias, a veces se puede enumerar muchas en un solo comando y separarlas con un solo espacio. En este tutorial, los dividí en grupos similares a la documentación de compilación en Github para Debian/Ubuntu

Ejecuta los siguientes comandos para instalar todas las librerías que ayudarán a compilar el código de bitcoind y que también servirán en caso de que quieras usar herramientas para aprender a desarrollar.

$sudo apt-get install build-essential autoconf libtool autotools-dev automake pkg-config bsdmainutils python3 libevent-dev
$sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev
$sudo apt-get install libsqlite3-dev
$sudo apt-get install libminiupnpc-dev
$sudo apt-get install libzmq3-dev
$sudo apt-get install libqrencode-dev

En caso de que quieras usar GUI(interfaz gráfica) para administrar bitcoind debes instalar estas librerías, si solo vas a usar la línea de comando no es necesario.

$sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools

Compilar e instalar bitcoind

Verificamos que estamos en el home del usuario actual:

$cd ~

Y ejecutamos este comando para bajar el código del repositorio de Bitcoin:

$git clone https://github.com/bitcoin/bitcoin.git

Navegamos hasta la carpeta bitcoin que se acaba de crear

$cd bitcoin

Miramos los tags para ver las versiones disponibles con este comando

$git tag

También puedes mirar la versión del último release en esta url:
https://github.com/bitcoin/bitcoin/releases

En este caso vamos a ir a la última versión que es la v23.0 para eso ejecutamos este comando (Si la versión es diferente a la imagen es porque el tutorial ha sido actualizado)

$git checkout v23.0

Instalamos la Berkeley Database
Esta es una base de datos que aún se necesita para poder compilar, posiblemente no se necesite en el futuro.

Instalamos la base de datos Berkeley con este comando:

$./contrib/install_db4.sh `pwd`

Con el siguiente comando exportamos la ruta donde quedó la base de datos en una variable de entorno BDB_PREFIX, esta variable la necesitamos más adelante (recuerda debes reemplazar el usuario admon por tu usuario)

$export BDB_PREFIX='/home/admon/bitcoin/db4'

Empezamos el proceso de compilación

Ejecutamos el siguiente comando para preparar el entorno

$./autogen.sh

El anterior comando creó el script configure. A este script se le puedan pasar varios parámetros para ajustar a la medida de nuestras necesidades.

En este caso sólo le vamos a pasar los parámetros para configurar la base de datos Berkeley que ya instalamos en un paso previo.

$./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_FLAGS="-I${BDB_PREFIX}/include"

Con esta configuración vas a usar GUI (Interfaz gráfica) y requieres las librerías QT. En caso de que no quieras usar la GUI podemos pasarle el parámetro –with-gui=no y quedaría así:

$./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_FLAGS="-I${BDB_PREFIX}/include" --with-gui=no

Si todo estuvo sobre ruedas se deben haber creado los scripts para compilar bitcoind.
En caso de que no, mira qué librerías faltaron las instalas e intenta de nuevo.

Ahora si compilamos:

$make -j$(nproc)

Si todo esta bien ya se creó el compilado. Ahora lo instalamos:

$sudo make install

Esto debe haber instalado bitcoind en esta ruta /usr/local/bin/bitcoind
al igual que /usr/local/bin/bitcoin-cli y /usr/local/bin/bitcoin-qt en caso de que hayas usado GUI.

Configurar el archivo bitcoin.conf

Cuando se ejecuta bitcoind por primer vez se crea un directorio .bitcoin en el home del usuario que contiene el archivo bitcoin.conf
Como aún no hemos ejecutado bitcoind vamos a crear el directorio:

$mkdir ~/.bitcoin
$cd .bitcoin

Ahora creamos el archivo de configuración bitcoin.conf con cualquier editor de texto, voy a usar nano por simplicidad

$nano bitcoin.conf

Este archivo puede tener parámetros para configurar un nodo completo que baje toda la blockchain o un nodo podado que baje una blockchain parcial para ahorrar espacio.

Está fuera del alcance de este tutorial explicar sobre la conveniencia de instalar un nodo podado, así que usaremos una configuración para instalar un nodo completo.

Lo más recomendable es que la blockchain no la almacenes en el mismo disco donde tienes instalado el sistema operativo. La sugerencia es destinar para ello un disco SSD de 1 Tera. Si tomas este camino, ten en cuenta que debes montar el disco con fstab.

Introduce esta línea en el archivo de texto que estás creando:

assumevalid=0
txindex=1

En caso de que hayas montado un disco para almacenar la blockchain, debes añadir una línea para indicar la ruta en donde montaste el disco. Voy a suponer que la ruta es /home/admon/BTC_Blockchain, entonces la línea quedaría así:

datadir=/home/admon/BTC_Blockchain

Antes de ejecutar bitcoind en segundo plano, ten en cuenta que se empezará a bajar toda blockchain que al momento de crear este tutorial está en 400 Gigas aproximadamente. Eso demora varios días dependiendo de la conexión a internet.
Para que esta descarga sea más rápida la blockchain se bajará por la clearnet ya que no hemos configurado Tor aún.

Ejecutar bitcoind y descargar la blockchain usando clearnet

Ahora ejecuta bitcoind como un demonio para que se ejecute en segundo plano y empiece a bajar la blockchain:

$bitcoind -daemon

Para chequear el progreso usar este comando:

$bitcoin-cli getblockchaininfo

El parametro verificationprogress te indicará el porcentaje del progreso, cuando llegue a 0.99 ya ha descargado la blockchain completa.

Configurar bitcoind para que use exclusivamente Tor y cargue al iniciar el sistema.

Cuando haya bajado la blockchain podemos modificar la configuración para que bitcoind se comunique con los otros nodos exclusivamente a través de Tor y así tener más privacidad.

El archivo quedaría así:

assumevalid=0
txindex=1
debug=tor
onlynet=onion
proxy=127.0.0.1:9050
bind=127.0.0.1
dnsseed=0
dns=0
addnode=kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion
addnode=bnx4povtqynvwnui5oqm5xcxqvat3j7yzgn6mqciuyszqawhuayvyaid.onion:8333
addnode=wyg7twmf7t3pfvfpdcfd64wvjj2pkccuui7ew34ovnqung5f623b4yyd.onion
addnode=glm52zywiqrcxuwswvgjsxr5pfeggil7uci4z5tbpvb4rjyu5hwjhtid.onion
addnode=xspiicyddsdmzxsffzw6z4f22wi2iwyyufkjcaj2qr7cznxymtft5nid.onion
addnode=nqb5q6d4nhp54ziahhm2oxopqwyyulg7nrqwrcmfvwhj7y7xasaeg7ad.onion
addnode=vp4qo7u74cpckygkfoeu4vle2yqmxh7zuxqvtkazp4nbvjnxl2s3e6id.onion
addnode=ew7x2hv76f7w7irfyektnbhd42eut27ttbfgggu7lbpxsyrlfvsujuqd.onion
addnode=qxkgr5u4rmwme5jticjuuqrecw5vfc5thcqdxvbffwbqgqkdin7s7vid.onion

Presiona Ctrl+x , luego presiona ‘s’ y enter para guardar los cambios.

Expliquemos un poco estos parámetros:

debug=tor agrega logs que tengan que ver con tor
onlynet=onion le indica a Bitcoin Core que las conexiones salientes sean sobre Tor
proxy=127.0.0.1:9050 le indica a Bitcoin core como comunicarse mediante Tor

bind: 127.0.0.1 restringirá las conexiones entrantes de Bitcoin Core desde otros nodos para que solo se realicen a través de Tor. Si nunca has ejecutado un nodo antes, otros peers no intentarán conectarse con tu nodo porque no saben que existe, pero aún podrían hacerlo.

dnsseed=0 and dns=0 Evita que Bitcoin Core intente conectarse a las “semillas” de DNS predeterminadas que se encuentran el siguiente archivo del repositorio de bitcoin:
https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L116
A pesar de las restricciones entrantes/salientes que establecimos anteriormente, sin estas dos configuraciones, nuestro nodo aún intentará conectarse a estos hosts.

¿Por qué queremos evitar que se conecte a esas semillas?

Dado que a finales del año 2021 se dejó de tener soporte para la versión 2 de Tor, entonces varias personas tuvieron problemas obteniendo conexiones entrantes de nodos con la version 3 de Tor cuando hicieron la actualización.

Por eso vamos a agregar semillas manualmente para conectarnos.
Con addnode se añaden las semillas, que son otros peers que se van a conectar a nuestro nodo. Y dado que estamos ejecutando el nodo sólo sobre Tor, debemos agregar las direcciones onion de otros peers en lugar de las direcciones IP. Una vez que nos conectamos a ellos, nos envían más a los que podemos conectarnos.

Eventualmente, nuestro nodo creará una larga lista de nodos y ya no necesitará los nodos semilla, por eso más adelante los quitaremos.

La lista de nodos la extraje de este hilo de reddit donde un usuario tuvo problemas porque con la versión 3 de Tor y no obtenía conexiones entrantes de otros nodos de modo que varias personas le compartieron sus direcciones onion.

https://www.reddit.com/r/Bitcoin/comments/kzhhgk/bitcoin_core_0210_tor_v3/

Hay dos parámetros llamados rpcuser y rpcpassword que si no se usan como en este caso, Bitcoin core por defecto genera un archivo .cookie para autenticarse.  En caso de que ingreses estos  parámetros  debes especificarlos más tarde en la configuración del nodo de lightnind para que este se comunique por el protocolo RPC con bitcoind.

Terminada la explicación del archivo de configuración procedemos a detender bitcoind:

$sudo bitcoin-cli stop

Ahora los arrancamos de nuevo:

$sudo bitcoind -daemon

Si ejecutamos el comando

$bitcoin-cli getnetworkinfo

Podemos observar que estamos conectados mediante Tor, connections_in aún está en cero porque tarda un poco en ir obteniendo conexión de otros nodos.

Si no hacemos nada más, cada vez que se reinicie el PC hay que ejecutar este comando para que bitcoind se ejecute. Por eso lo que debemos hacer es crear un servicio para que se ejecute automáticamente al iniciar el pc.

Para lograrlo vamos a la siguiente ruta:

$cd /etc/systemd/system

Y ejecutamos este comando para obtener el archivo de configuración directamente desde el repositorio de bitcoin
$sudo wget https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/init/bitcoind.service

Ahora tenemos que modificar las rutas donde esta la blockchain de bitcoin y comentar tres parámetros, por eso abrimos el archivo:

$sudo nano bitcoind.service

Y editamos las rutas en el parámetro ExecStart, en mi caso con el usuario admon queda así:

ExecStart=/usr/local/bin/bitcoind -daemon \
                            -pid=/run/bitcoind/bitcoind.pid \
                            -conf=/home/admon/.bitcoin/bitcoin.conf \
                            -datadir=/home/admon/.bitcoin

Y comentamos con # las siguientes tres líneas que están más abajo:

#PermissionsStartOnly=true
#ExecStartPre=/bin/chgrp bitcoin /etc/bitcoin

#ProtectHome=true

Presiona Ctrl+x , luego presiona ‘s’ y enter para guardar los cambios.

Ejecutamos este comando para que inicie el servicio cuando se reinicie el equipo:

$sudo systemctl enable bitcoind.service

Y con este comando lo ejecutamos:

$sudo systemctl start bitcoind.service

Para mirar el estado del servicio ejecutamos:

$sudo systemctl status bitcoind.service

Si deseamos detenerlo usamos:

$sudo systemctl stop bitcoind.service

Si has llegado hasta aquí felicitaciones, ahora tienes instalado un nodo de Bitcoin instalado que te proveerá privacidad y ayudará a la descentralización de la red.