Thundroid: El Perfecto Nodo Bitcoin Lightning

El Bitcoin es una moneda digital nativa de la era de Internet. Podría decirse que otra moneda internacional, pero sin un país de origen, de modo que desafía las fronteras, las políticas comerciales y la inflación arbitraria. En el documento técnico de 2008 (https://bitcoin.org/bitcoin.pdf) Satoshi Nakamoto la describe como "... una versión electrónica de dinero puramente de igual a igual [que] permitiría realizar pagos on line directamente desde una parte a otra sin pasar por una institución financiera ".

Ser de igual a igual significa que Bitcoin no depende de un intermediario, como un banco, y puede transferirse como un activo al portador, como el dinero físico, sin pedirle permiso a nadie. No necesita almacenarse físicamente ya que está protegido por una clave criptográfica, de modo que puede transferirse en minutos a cualquier persona en cualquier parte del mundo. Un componente clave de este sistema financiero de código abierto gratuito es el blockchain, un libro de contabilidad que realiza un seguimiento de quién posee bitcoin y cuánto posee. Éste es almacenado como una copia idéntica por todos los usuarios que deciden ejecutar un nodo completo Bitcoin. Puedes aprender más en bitcoin.org.

El Bitcoin es un experimento económico de una magnitud épica, y su éxito no es seguro en absoluto. En cualquier caso, Bitcoin como nueva tecnología es un esfuerzo increíblemente interesante, especialmente debido a su naturaleza interdisciplinaria y la baja barrera para su acceso. El Bitcoin como moneda sólida, escasa y no inflacionaria que desafía el dinero como uno de los últimos auténticos monopolios de los estados nacionales, podría tener un gran impacto en los principios económicos y en la sociedad en general.

De momento, Bitcoin es más bien un depótico de valor y realmente no está hecho para hacer pequeñas transacciones diarias. Los verdaderos blockchains descentralizados son un recurso escaso y no pueden escalarse para dar cabida a todas las transacciones globales. Si lo piensas bien, no puede ser muy adecuado almacenar todas compras de un café de manera redundante en todo el mundo para toda la eternidad. Sería como obligar a que todo el mundo se descargara el correo electrónico de toda la gente. Estas limitaciones podrían motivar la creación de una mejor tecnología en lo que respecta a los blockchains de Bitcoin que permitiera escalarse exponencialmente, en lugar de simplemente hacerse más grandes de forma lineal.

Aquí es donde entra en acción la denominada "Lightning Network". Como una de múltiples y novedosas extensiones del blockchain, promete dar cabida a transacciones casi ilimitadas, con confirmación instantánea, tarifas mínimas y una mayor privacidad. Suena a algo demasiado bueno para ser verdad, pero esta tecnología está muy explotada, comprometida con los valores del código abierto de cypherpunk y aprovecha los sólidos fundamentos del Bitcoin. Pincha aquí para saber más.

Para preservar la naturaleza descentralizada de este sistema monetario, es importante que todo el mundo tenga al menos la posibilidad de ejecutar su propio nodo Bitcoin, preferiblemente con un hardware de bajo coste como el ODROID.

NOTA: Ten en cuenta que, si bien el Bitcoin ha sido puesto a prueba durante casi una década, Lightning Network aún está en fase beta y su desarrollo continúa siendo muy elevado. Esta guía también te permite configurar tu nodo Bitcoin sin tener en cuenta la parte Lightning. Lee con atención la sección "Mejores prácticas financieras" antes de comprometer tu noto al Bitcoin real.

Objetivo

Esta guía te permitirá ser tu propio banco. El objetivo es configurar un nodo Bitcoin y Lightning que:

  • Permita validar totalmente un Nodo Bitcoin completo y no requiera confiar en un tercero.
  • Sea fiable tenerlo activo las 24 horas del día, los 7 días de la semana
  • Forme parte de y apoye la descentralización de la red Lightning mediante el enrutamiento de pagos
  • Se pueda usar para enviar y recibir pagos personales usando la interfaz de línea de comando.

El servidor está configurado sin interfaz gráfica de usuario y se gestiona de forma remota utilizando la línea de comandos Secure Shell (SSH). También puede funcionar como un backend de Bitcoin personal para la billetera de escritorio Electrum.

Destinatarios

Aunque esta guía se esfuerza por proporcionar instrucciones simples y evidentes, el objetivo también es hacerlo todo por nuestra cuenta, sin atajos que impliquen confiar en un tercero. Esto ha hecho que esta guía se vuelva un tanto técnica, pero he tratado de hacerla lo más sencilla posible para que logres entender lo básico sobre el cómo y el por qué.

Advertencia

Todos los componentes de la red Lightning están aún en desarrollo y aquí manejamos dinero real. Esta guía sigue un enfoque conservador: primero configura y pruebalo todo en TestNet Bitcoin, luego, una vez que estés lo suficientemente seguro como para poner dinero real en línea, cambia a Mainnet Bitcoin con unos simples cambios.

Preparativos

Tras publicar la "Guía para principiantes sobre Lightning en una Raspberry Pi", empecé a explorar otro hardware ya que la Raspberry Pi tiene algunos inconvenientes, principalmente en el área de rendimiento y la dificultad que presenta a la hora de conectar sistemas de almacenamiento externo, alog que es muy importante a la hora de almacenar el amplio blockchain Bitcoin.

El ODROID-HC2 de Hardkernel (http://www.hardkernel.com/main/products/prdt_info.php) o el HC1 en un formato más pequeño como mini PC basada en Linux, se adapta perfectamente. Comparandolo con un Raspberry Pi, tiene las siguientes ventajas:

  • Precio equiparable al de la Raspberry Pi
  • Más potente (CPU de 8 núcleos, 2 GB de RAM, Ethernet Gigabit)
  • Alojamiento interno con disco duro, conexión directa con SATA3
  • Solo un adaptador de corriente para todo

No cuenta con determinadas características como son la salida HDMI, Wi-Fi integrado o los pines GPIO, pero éstas no son importantes para este proyecto en concreto. El rendimiento es bastante mayor, de modo que parece estar preparado para el futuro ya que estoy seguro que el Bitcoin y Lightning seguirán evolucionando.

Figure 1 - Performance of ODROID-HC2 is identical to XU4 (which is more of a media pc)
Figura 1 - El rendimiento de ODROID-HC2 es idéntico al XU4 (que es más bien un PC multimedia)

Una vez que opté por este hardware, compre el ODROID-HC2 y, después de configurarlo y ejecutarlo durante dos meses, puedo decir que es lo mejor opción para un nodo Bitcoin/Lightning de bajo coste. Como este proyecto también necesita un nombre ñoño, llamaré a mi nodo Thundroid.

Hice un pedido con los siguientes artículos directamente a Hardkernel en Singapur. Hay distribuidores disponibles en todo el mundo, pero desafortunadamente no para Suiza.

También necesitas lo siguiente:

  • Tarjeta Micro SD: 16 GB, incluido un adaptador para tu ordenador habitual
  • Disco duro interno: 500 GB o más, SATA, HDD 3,5 "o HDD/SSD de 2,5"
  • Cable de red RJ45

El montaje es sencillo: simplemente inserta el disco duro y fíjalo con los tornillos incluidos con tu ODROID. Si has comprado la carcasa de plástico, deslícela sobre la estructura de metal.

Instalando el sistema operativo

Utilizamos Ubuntu 16.04.03 LTE (Sistema operativo mínimo, básico) proporcionado por Hardkernel. Descarga la imagen desde la sección de ODROID-XU4 en wiki.odroid.com

Archivo exacto utilizado: https://odroid.in/ubuntu_16.04lts/ubuntu-16.04.3-4.14-minimal-odroid-xu4-20171213.img.xz

Descarga la imagen, guárdala en tu tarjeta MicroSD, colócala en tu Thundroid, conécta éste a tu red a través de un cable y enchufa el adaptador de corriente. El arranque inicial puede durar varios minutos.

Configura tu router de red para que éste asigne una dirección IP estática a tu Thundroid.

Trabajando en tu Thundroid

Anota tus contraseñas

Necesitarás varias contraseñas, me resulta más fácil escribirlas todas al principio, en lugar de buscarlas a lo largo de toda la guía. Deben ser únicas y seguras, con una extensión de al menos de 12 caracteres. No uses espacios en blanco, comillas o caracteres especiales poco comunes

  • Contraseña de usuario
  • Contraseña de Bitcoin RPC
  • Contraseña de la API Lightning
  • Contraseña de semilla Lightning

Guarda una copia de tus contraseñas en un lugar seguro (preferiblemente en un administrador de contraseñas como KeePass o LastPass) y mantén tus notas originales fuera de la vista una vez que el sistema esté funcionando.

La línea de comandos

Todo está configurado desde el prompt de comandos de Linux. A lo largo de toda esta guía utilizaré las siguientes anotaciones:

#: Esto es un comentario, sólo para información $: Esto es un comando de una sola línea para introducir (sin $) y confirmar con la tecla Intro Sin prefijo: Esto el el resultado del comando anterior o algo que se puede copiar/pegar en un archivo.

  • Comandos de autocompletado: cuando introduces comandos, puedes usar el tabulador para completar automáticamente, ej. para comandos, directorios o nombres de archivo.
  • Historial de comandos: presionando las flechas hacia arriba y hacia abajo en el teclado, puede recuperar los comandos introducidos previamente.
  • Usar los privilegios de administrador: nuestros usuarios no tienen privilegios de administrador. Si un comando necesita editar la configuración del sistema, necesitamos usar el comando 'sudo' ("superuser do") como prefijo. En lugar de editar un archivo de sistema con "nano /etc/fstab", usaremos "sudo nano /etc/fstab".
  • Usando el editor de texto Nano: Utilizaremos el editor Nano para crear nuevos archivos de texto o editar los existentes. No es complicado, pero guardar y salir no es muy intuitivo. Para Guardar: presiona “Ctrl-O” (para Salir), confirma el nombre del archivo y presiona “Intro”. Para Salir: presionar “Ctrl-X”

* ** Copiar/Pegar **: si estás utilizando Windows y el cliente SSH PuTTY, puede copiar texto desde el shell seleccionándolo con el ratón (sin necesidad de hacer clic en nada) y pegar cosas en la posición del cursor con un clic derecho en cualquier parte de la ventana SSH.

Conectando a Thundroid

Es hora de conectarse a través de SSH y ponerse a trabajar. Para ello, necesitas un cliente Secure Shell (SSH). Instalar, iniciar y conectar:

  • Windows: recomiendo usar el cliente SSH [KiTTY] (http://kitty.9bis.com). Puedes copiar texto desde el shell seleccionándolo con el ratón (sin necesidad de hacer clic en nada) y pegar cosas con un clic derecho.
  • Mac OS: cliente SSH integrado (http://osxdaily.com/2017/04/28/howto-ssh-client-mac/)
  • Linux: simplemente usa el comando nativo, ej. ssh root@192.168.0.20

Usa los siguientes parámetros de conexión SSH:

  • Host Name: la dirección estática que configuraste en el router, ej. 192.168.0.20
  • Port: 22
  • Username: root
  • Password: odroid

Configuración básica

Ahora estás conectado por línea de comandos a tu propio nodo Bitcoin. En primer lugar, nos ocupamos de la configuración básica. Introduce los siguientes comandos:

# change root password to [password A]
$ passwd

# update the operating system
$ apt update
$ apt upgrade
$ apt dist-upgrade
$ apt install linux-image-xu3
# answer [y], then [no] (do not abort)

# install some additional software
$ apt install htop git curl bash-completion jq

# set time zone & localization
$ dpkg-reconfigure tzdata
$ dpkg-reconfigure locales
Cuando utilices el editor de texto Nano, puedes usar los mismos atajos de teclado para guardar (Ctrl-O, confirmar o cambiar el nombre del archivo, y presiona Intro) y para salir (Ctrl-X).
# change hostname (replace "odroid" with "thundroid" :) in both files
$ nano /etc/hostname
$ nano /etc/hosts

# create user "admin", set [password A] and make it a superuser
$ adduser admin
$ adduser admin sudo

# create user "bitcoin" and set password [password A]
$ sudo adduser bitcoin

Montando el disco duro

El disco duro externo está conectado al sistema de archivos y se puede acceder a él como una carpeta normal. Esto se denomina "montaje". Como una instalación de servidor, el sistema nativo de archivos Linux Ext4 es la mejor opción para el disco duro externo.

NOTA: ¡Todos los datos de este disco duro se borrarán con los siguientes pasos!

# get NAME for hard disk
$ lsblk -o UUID,NAME,FSTYPE,SIZE,LABEL,MODEL

# format hard disk (use [NAME] from above, e.g /dev/sda1)
$ mkfs.ext4 /dev/[NAME]

# get UUID for hard disk, copy into notepad
$ lsblk -o UUID,NAME,FSTYPE,SIZE,LABEL,MODEL

# edit fstab and enter new line (replace UUID) at the end, save & exit
$ nano /etc/fstab
UUID=123456 /mnt/hdd ext4 noexec,defaults 0 0

# create mount point, mount, check and set owner
$ mkdir /mnt/hdd
$ mount -a
$ df /mnt/hdd
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 961300808 600388836 312057600 66% /mnt/hdd

$ chown -R bitcoin:bitcoin /mnt/hdd/

Moviendo el archivo Swap

El uso de un archivo Swap puede degradar muy rápido la tarjeta SD. Por lo tanto, lo moveremos al disco duro externo.

# install necessary software package
$ apt install dphys-swapfile

# change configuration file to use swapfile on external hard disk
$ nano /etc/dphys-swapfile
CONF_SWAPFILE=/mnt/hdd/swapfile

# enable new swap configuration
$ sudo dphys-swapfile setup
$ sudo dphys-swapfile swapon

# reboot, login as "admin" and delete old swapfile
$ restart shutdown -r now
$ sudo rm /var/swap

Fortificando tu Thundroid

Tu Thundroid será visible desde Internet y es por ello que debe estar protegido contra posibles ataques. Un firewall controla el tráfico y cierra posibles agujeros de seguridad. Inicia sesión como "admin" (no usaremos "root" nuevamente).

UFW: Uncomplicated Firewall

El firewall deniega por defecto todos los intentos de conexión por parte de otros usuarios y permite que solo sean utilizados determinados puertos específicos.

ADVERTENCIA: La línea “ufw allow from 192.168.0.0/24 ...W que aparece a continuación asume que la dirección IP de tu Thundroid es algo así como '192.168.0. ???' ', siendo los signos de interrogación cualquier número de 0 al 255. Si tu dirección IP es '12 .34.56.78 ', debe cambiar esta línea por “ufw allow from 12.34.56.0/24 ...”. De lo contrario, te bloquearás a ti mismo para siempre.

# change session to "root"
$ sudo su
$ apt install ufw
$ ufw default deny incoming
$ ufw default allow outgoing

# make sure to use the correct subnet mask (see warning above)
$ ufw allow from 192.168.0.0/24 to any port 22 comment 'allow SSH from local LAN'

$ ufw allow 9735 comment 'allow Lightning'
$ ufw deny 8333 comment 'deny Bitcoin mainnet'
$ ufw allow 18333 comment 'allow Bitcoin testnet'
$ ufw enable
$ systemctl enable ufw
$ ufw status

# exit "root" session back to "admin"
$ exit

Fail2ban

Fail2ban monitoriza los intentos de inicio de sesión por SSH y bloquea a un interlocutor remoto durante 10 minutos tras cinco intentos de sesión fallidos. Esto hace que un ataque de fuerza bruta sea inviable, ya que simplemente llevaría demasiado tiempo.

$ sudo apt install fail2ban

Claves SSH

Una de las mejores opciones para proteger el inicio de sesión por SSH es deshabilitar completamente el inicio de sesión mediante contraseña y requerir un certificado de clave SSH. Solo alguien que posea fisicamente la clave privada puede iniciar sesión.

Configura las claves SSH para el usuario "admin" siguiendo este artículo: Configure “No Password SSH Keys Authentication” with PuTTY on Linux Servers

Ahora debería contar con tres archivos creados. Guárdalos, ya que ahora vamos a desactivar el inicio de sesión por contraseña.

Figure 2 - SSH Keys filelist
Figura 2 - Listado de archivos con las claves SSH

  • Cierra sesión ('Exit') y asegúrate de que puedes iniciar sesión como "admin" con tu clave SSH
  • Edita el archivo de configuración SSH

$ sudo nano /etc/ssh/sshd_config

  • Cambia la configuración "ChallengeResponseAuthentication" y "PasswordAuthentication" a "no" (descomenta la línea eliminando el signo # si fuera necesario), guarda los cambios y salte.

Figure 3 - SSH config
Figura 3 - configuración de SSH
# copy the ssh key to user "root", just in case
$ sudo mkdir /root/.ssh
$ sudo cp /home/admin/.ssh/authorized_keys /root/.ssh/
$ sudo chown -R root:root /root/.ssh/
$ sudo chmod -R 700 /root/.ssh/
$ sudo systemctl restart ssh

# exit and login again with your private key
$ exit
Ahora solo puedes iniciar sesión con "admin" o "root" y tu clave SSH. Como no puedes conectar una pantalla al ODROID, SSH es tu única opción.

RECUERDA: ¡Haz una copia de seguridad de tu clave SSH! ¡No tienes ninguna otra alternativa para iniciar sesión! En el peor de los casos, necesitarás grabar la tarjeta MicroSD y configurar nuevamente el sistema; las cosas importantes seguirán estando en el disco duro.

Aumenta tu límite de archivos abiertos

En caso de que tu Thundroid se inunde con solicitudes de Internet, honestas o maliciosas debido a un ataque DDoS, te encontrará rápidamente con el error "can’t accept connection: too many open files’ ". Esto se debe a un límite con los archivos abiertos (que representan conexiones TCP individuales), el cual tiene un valor demasiado bajo.

Edite los siguientes tres archivos, agrega las líneas adicionales justo antes del comentario final, guarda los cambios y salte.

$ sudo nano /etc/security/limits.conf
* soft nofile 128000
* hard nofile 128000
root soft nofile 128000
root hard nofile 128000
Figure 4 - Edit pam.d/limits.conf.png
Figura 4 - Editando pam.d/limits.conf.png
$ sudo nano /etc/pam.d/common-session
session required pam_limits.so
Figure 5
Figura 5
$ sudo nano /etc/pam.d/common-session-noninteractive
session required pam_limits.so
Figure 6 - Edit pam.d/common-session-noninteractive
Figura 6 - Editando pam.d/common-session-noninteractive

Bitcoin

La base del nodo Lightning es un nodo de Bitcoin completamente seguro (https://bitcoin.org/en/bitcoin-core/). Mantiene una copia completa del blockchain y valida todas las transacciones y bloques. Al hacer todo este trabajo nosotros mismos, no necesitamos que nadie más nos aporte confianza.

Al principio, usaremos TestNet Bitcoin para familiarizarnos con sus operaciones. Esta sincronización es gestionada directamente por Thundroid y no debería tardar más de unas cuantas horas. Simplemente déjalo sincronizar por la noche.

Instalación

Descargaremos el software directamente desde bitcoin.org, verificaremos su firma para asegurarnos de que usaremos una versión oficial y la instalaremos.

Inicia sesión como "admin" y crea una carpeta para la descarga:

$ mkdir /home/admin/download
$ cd /home/admin/download
Descargaremos los últimos binarios de Bitcoin Core y comparamos el archivo con la suma de verificación firmada. Esto lo hacemos simplemente por precaución para asegurarnos de que se trata de una versión oficial y no de una maliciosa que intenta robar nuestro dinero.

Hazte con los últimos enlaces de descarga en bitcoin.org/en/download. Suelen cambiar con cada actualización. Ejecuta los siguientes comandos con los nombres de archivo modificados y verifica el resultado donde se te indique.

# download Bitcoin Core binary
$ wget https://bitcoin.org/bin/bitcoin-core-0.16.0/bitcoin-0.16.0-arm-linux-gnueabihf.tar.gz
$ wget https://bitcoin.org/bin/bitcoin-core-0.16.0/SHA256SUMS.asc
$ wget https://bitcoin.org/laanwj-releases.asc

# check that the reference checksum matches the real checksum
# (ignore the "lines are improperly formatted" warning)
$ sha256sum --check SHA256SUMS.asc --ignore-missing
> bitcoin-0.16.0-arm-linux-gnueabihf.tar.gz: OK

# manually check the fingerprint of the public key
$ gpg --with-fingerprint ./laanwj-releases.asc
> 01EA 5486 DE18 A882 D4C2 6845 90C8 019E 36C2 E964

# import the public key of Wladimir van der Laan, verify the signed checksum file
# and check the fingerprint again in case of malicious keys
$ gpg --import ./laanwj-releases.asc
$ gpg --verify SHA256SUMS.asc
> gpg: Good signature from Wladimir ...
> Primary key fingerprint: 01EA 5486 DE18 A882 D4C2 6845 90C8 019E 36C2 E964
Figure 7 - Commands to check bitcoind signature
Figura 7 - Comandos para verificar la firma bitcoind

Extrae los binarios Bitcoin Core, instálalos y verifica la versión.

$ tar -xvf bitcoin-0.16.0-arm-linux-gnueabihf.tar.gz
$ sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-0.16.0/bin/*
$ bitcoind --version
> Bitcoin Core Daemon version v0.16.0

Prepara el directorio Bitcoin Core

Usamos el demonio Bitcoin, llamado "bitcoind", que se ejecuta en segundo plano sin interfaz de usuario y que almacena todos los datos en el directorio '/home/bitcoin/.bitcoin'. En lugar de crear un directorio como tal, creamos un enlace que apunte a un directorio del disco duro externo.

# change to user "bitcoin"
$ sudo su bitcoin

# add symbolic link that points to the external hard drive
$ mkdir /mnt/hdd/bitcoin
$ ln -s /mnt/hdd/bitcoin /home/bitcoin/.bitcoin

# Navigate to home directory and check the symbolic link (the target must not be red).
$ cd
$ ls -la
El contenido de este directorio estará en realidad en el disco duro externo.

Figure 8 - Verify .bitcoin symlink
Figura 8 - Verificando el enlace simbólico de .bitcoin

Configuración

Necesitamos crear el archivo de configuración para bitcoind. Ábrelo con Nano y pega la siguiente configuración. Guarda y Salte.

$ nano /home/bitcoin/.bitcoin/bitcoin.conf

# Thundroid: bitcoind configuration
# /home/bitcoin/.bitcoin/bitcoin.conf

# remove the following line to enable Bitcoin mainnet
testnet=1

# Bitcoind options
server=1
daemon=1
txindex=1
disablewallet=1

# Connection settings
rpcuser=bitcoin
rpcpassword=PASSWORD_[B]
zmqpubrawblock=tcp://127.0.0.1:29000
zmqpubrawtx=tcp://127.0.0.1:29000

# Optimizations for limited hardware
dbcache=100
maxorphantx=10
maxmempool=50
maxconnections=40
maxuploadtarget=5000
NOTA: Cambia rpcpassword por una contraseña segura, de lo contrario tus fondos podrían ser robados.

Inicio automático de bitcoind

El sistema necesita ejecutar el demonio bitcoin automáticamente en segundo plano, incluso cuando nadie esté conectado. Usamos "systemd", un demonio que controla el proceso de inicio usando los archivos de configuración.

Salte de la sesión de usuario "bitcoin" para volver al usuario "admin"

$ exit
Crea el archivo de configuración con el editor de texto Nano y copia el siguiente párrafo. Guardalo y Salte.
$ sudo nano /etc/systemd/system/bitcoind.service

# Thundroid: systemd unit for bitcoind
# /etc/systemd/system/bitcoind.service

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

[Service]
ExecStart=/usr/local/bin/bitcoind -daemon -conf=/home/bitcoin/.bitcoin/bitcoin.conf -pid=/run/bitcoind/bitcoind.pid
# Creates /run/bitcoind owned by bitcoin
RuntimeDirectory=bitcoind
User=bitcoin
Group=bitcoin
Type=forking
PIDFile=/run/bitcoind/bitcoind.pid
Restart=on-failure

# Hardening measures
####################

# Provide a private /tmp and /var/tmp.
PrivateTmp=true

# Mount /usr, /boot/ and /etc read-only for the process.
ProtectSystem=full

# Disallow the process and all of its children to gain
# new privileges through execve().
NoNewPrivileges=true

# Use a new /dev namespace only populated with API pseudo devices
# such as /dev/null, /dev/zero and /dev/random.
PrivateDevices=true

# Deny the creation of writable and executable memory mappings.
MemoryDenyWriteExecute=true

[Install]
WantedBy=multi-user.target
Habilita el archivo de configuración:
$ sudo systemctl enable bitcoind.service
Copia 'bitcoin.conf' en el directorio de inicio del usuario "admin" para las credenciales RPC:
$ mkdir /home/admin/.bitcoin
$ sudo cp /home/bitcoin/.bitcoin/bitcoin.conf /home/admin/.bitcoin/
Reinicia Thundroid
$ sudo shutdown -r now

Verificación de las operaciones de bitcoind

Después de reiniciar, el bitcoind debería empezar a sincronizar y validar el blockchain de Bitcoin. Espera un poco, vuelve a conectarte a través de SSH e inicie sesión con el usuario "admin". Verifica el estado del demonio Bitcoin, el cual fue iniciado por systemd (salte con 'Ctrl-C').

$ systemctl status bitcoind
Figure 9 - Bitcoind status
Figura 9 - Estado de Bitcoind

Pueder ver el bitcoind en acción monitorizando su registro log (salte con 'Ctrl-C'):

$ sudo tail -f /home/bitcoin/.bitcoin/testnet3/debug.log
Utiliza el cliente Bitcoin Core 'bitcoin-cli' para obtener información sobre el blockchain actual:
$ bitcoin-cli getblockchaininfo
NOTA: Cuando "Bitcoind" se esté iniciando, puede que recibas un mensaje de error "verifying blocks". Es normal, simplemente espere unos minutos.

Entre mucha otra información, aparecerá el "verificationprogress". Una vez que este valor alcance casi 1 (0,999 ...), el blockchain está actualizado y completamente validado.

Lightning Network

Descargaremos e instalaremos el LND (Lightning Network Daemon) desde Lightning Labs http://lightning.engineering/. Visita su repositorio Github (https://github.com/lightningnetwork/lnd/blob/master/README.md) para obtener abundante información sobre su proyecto de código abierto y Lightning en general.

Instalar LND

Ahora viene lo bueno: descarga, verifica e instala los archivos binarios LND.

$ cd /home/admin/download
$ wget https://github.com/lightningnetwork/lnd/releases/download/v0.4.1-beta/lnd-linux-arm-v0.4.1-beta.tar.gz
$ wget https://github.com/lightningnetwork/lnd/releases/download/v0.4.1-beta/manifest-v0.4.1-beta.txt
$ wget https://github.com/lightningnetwork/lnd/releases/download/v0.4.1-beta/manifest-v0.4.1-beta.txt.sig
$ wget https://keybase.io/roasbeef/pgp_keys.asc

$ sha256sum --check manifest-v0.4.1-beta.txt --ignore-missing
> lnd-linux-arm-v0.4-beta.tar.gz: OK

$ gpg ./pgp_keys.asc
> pub 4096R/DD637C21 2017-09-12 Olaoluwa Osuntokun <laolu32@gmail.com>
> sub 4096R/5FA079A1 2017-09-12 [expires: 2021-09-12]
> 65317176B6857F98834EDBE8964EA263DD637C21

$ gpg --import ./pgp_keys.asc
$ gpg --verify manifest-v0.4.1-beta.txt.sig
> gpg: Good signature from "Olaoluwa Osuntokun <laolu32@gmail.com>" [unknown]
> Primary key fingerprint: 6531 7176 B685 7F98 834E DBE8 964E A263 DD63 7C21
Figure 10 - Checksum LND
Figura 10 – Suma de verificación LND
$ tar -xzf lnd-linux-arm-v0.4.1-beta.tar.gz
$ ls -la
$ sudo install -m 0755 -o root -g root -t /usr/local/bin lnd-linux-arm-v0.4.1-beta/*
$ lnd --version
> lnd version 0.4.1-beta commit=

Configurar LND

Ahora que LND esta instalado lo configuraremos, debemos configurarlo para que funcione con Bitcoin Core y se ejecute automáticamente al inicio.

Abre una sesión de usuario "bitcoin":

$ sudo su bitcoin
Crea el directorio de trabajo LND y el enlace simbólico correspondiente:
$ mkdir /mnt/hdd/lnd
$ ln -s /mnt/hdd/lnd /home/bitcoin/.lnd
$ cd
$ ls -la
Figure 11 - Check symlink LND
Figura 11 - Comprobando enlace simbólico LND

Crea el archivo de configuración LND y pega el siguiente contenido (ajústalo a tu alias). Guardalo y Salte.

'$ nano /home/bitcoin/.lnd/lnd.conf'

# Thundroid: lnd configuration
# /home/bitcoin/.lnd/lnd.conf

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=5
alias=YOUR_NAME [LND]
color=#68F442

[Bitcoin]
bitcoin.active=1

# enable either testnet or mainnet
bitcoin.testnet=1
#bitcoin.mainnet=1

bitcoin.node=bitcoind

[autopilot]
autopilot.active=1
autopilot.maxchannels=5
autopilot.allocation=0.6

Información Adicional

Figure 12 - sample-lnd.conf
Figura 12 - sample-lnd.conf

Dentro del repositorio del proyecto LND:

Salte de la sesión de usuario "bitcoin" para volver a "admin"

$ exit
Crea una unidad systemd LND con el siguiente contenido. Guarda y Salte.
$ sudo nano /etc/systemd/system/lnd.service

# Thundroid: systemd unit for lnd
# /etc/systemd/system/lnd.service

[Unit]
Description=LND Lightning Daemon
Wants=bitcoind.service
After=bitcoind.service

[Service]
ExecStart=/usr/local/bin/lnd
PIDFile=/home/bitcoin/.lnd/lnd.pid
User=bitcoin
Group=bitcoin
LimitNOFILE=128000
Type=simple
KillMode=process
TimeoutSec=180
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target
Activa e inicia LND
$ sudo systemctl enable lnd
$ sudo systemctl start lnd
$ systemctl status lnd
Monitoriza el aregistro log de LND en tiempo real (salte con 'Ctrl-C')
$ sudo journalctl -f -u lnd

Configurar la billetera LND

Una vez que LND se inicie, el proceso nos espera para que creemos la billetera Bitcoin integrada. No usa la billetera bitcoind.

Inicia una sesión con el usuario "bitcoin"

$ sudo su bitcoin

Crear la billetera LND

$ lncli create
Si quieres crear una nueva billetera, introduce tu 'password [C]' como contraseña de la billetera, selecciona 'n' en relación a una semilla existente e introduce el 'password [D]' opcional como contraseña de la semilla. Se creará una nueva semilla de cifrado que consta de 24 palabras.

Figure 13 - LND new cipher seed
Figura 13 - Nueva semilla de cifrado LND

Estas 24 palabras, combinadas con tu contraseña ('password [D]' opcional) es todo lo que necesitas para restaurar tu billetera Bitcoin y todos los canales Lighting. El estado actual de tus canales, sin embargo, no pueden crearse de nuevo desde esta semilla, ya que esto aún se encuentra en fase de desarrollo para LND.

NOTA: Esta información debe mantenerse en secreto en todo momento. Anota estas 24 palabras manualmente en un pedazo de papel y guárdalo en un lugar seguro. ¡Este pedazo de papel es todo lo que necestia un atacante para vaciar completamente su billetera! No lo guarde en un ordenador. No tomes una foto con tu teléfono móvil. Esta información nunca debe almacenarse en formato digital en ningún lugar.

Salte de la sesión de usuario "bitcoin"

$ exit

Asignar permisos LND a "admin"

Comprueba si se han creado los archivos de permiso “admin.macaroon” y “readonly.macaroon”. De lo contrario, consulta el problema nº 890 abierto de LND (https://github.com/lightningnetwork/lnd/issues/890).

$ ls -la /home/bitcoin/.lnd/
Figure 14 - Check macaroon
Figura 14 - verificación

Copia los archivos de permiso y el certificado TLS al usuario "admin" para usar "lncli".

$ mkdir /home/admin/.lnd
$ sudo cp /home/bitcoin/.lnd/tls.cert /home/admin/.lnd
$ sudo cp /home/bitcoin/.lnd/admin.macaroon /home/admin/.lnd
$ sudo chown -R admin:admin /home/admin/.lnd/
Asegúrate de que 'lncli' funciona desbloqueando tu billetera (introduce el 'password [C]') y aparecerá cierta información del nodo.
$ sudo systemctl restart lnd
$ lncli unlock
Monitoriza el progreso de arranque de LND hasta que alcance el blockchain testnet (aproximadamente 1,3 millones de bloques en este momento). Esto puede tardar hasta 2 horas. Después, verás pasar una parrafada muy rápido. Salte con 'Ctrl-C'.
$ sudo journalctl -f -u lnd

Conseguir algo de bitcoin testnet

Ahora tu nodo Lightning está listo. Para usarlo en testnet, puedes conseguir un bitcoin testnet gratis desde un faucet.

Genera una nueva dirección Bitcoin para recibir fondos en cadena

$ lncli newaddress np2wkh

'> "address": "2NCoq9q7............dkuca5LzPXnJ9NQ"
Conseguir bitcoin testnet:
<https://testnet.manu.backend.hamburg/faucet>
Comprueba el saldo de tu billetera LND.
$ lncli walletbalance
Monitoriza tu transacción (el faucet muestra el ID de TX) en un explorador de Blockchain:
<https://testnet.smartbit.com.au>

LND  en acción

Tan pronto como tu operación de financiación sea minada y confirmada, LND comenzará a abrir y mantener canales. Esta función se denomina "Autopilot" y está configurada en el archivo "lnd.conf". Si desea mantener tus canales manualmente, puede desactivar el piloto automático.

Recibete a ti mismo una solicitud de pago en StarBlocks (https://starblocks.acinq.co/#/) o Y’alls (https://yalls.org/) y mueve algunas monedas.

Algunos comandos que puedes intentar:

Listar todos los argumentos de la interfaz de línea de comando (cli)

$ lncli
Obtener ayuda de un argumento específico
$ lncli help [ARGUMENT]
Conocer algunas estadísticas generales sobre tu nodo:
$ lncli getinfo
Conéctarse a un nodo compañero (puede encontrar algunos nodos para conectarte aquí: https://1ml.com/)
$ lncli connect [NODE_URI]
Verifica los nodos a los que está conectado actualmente:
$ lncli listpeers
Abrir un canal con un nodo/compañero:
$ lncli openchannel [NODE_PUBKEY] [AMOUNT_IN_SATOSHIS] 0
Ten en cuenta que [NODE_URI] incluye @IP:PORT al final, mientras que [NODE_PUBKEY] no.

Verifica el estado de tus canales pendientes:

$ lncli pendingchannels
Verifica el estado de tus canales activos:
$ lncli listchannels
Antes de pagar una factura, debes descodificarla para verificar si la cantidad y la información que contiene son correctos:
$ lncli decodepayreq [INVOICE]
Paga una factura:
$ lncli payinvoice [INVOICE]
Verifica los pagos que has enviado:
$ lncli listpayments
Crea una factura:
$ lncli addinvoice [AMOUNT_IN_SATOSHIS]
Listar todas las facturas:
$ lncli listinvoices
Para cerrar un canal, necesitsa los dos argumentos siguientes que se pueden determinar con 'listchannels' y que aparecen listados como "channelpoint": 'FUNDING_TXID': 'OUTPUT_INDEX'.
$ lncli listchannels
$ lncli closechannel [FUNDING_TXID] [OUTPUT_INDEX]
Para forzar el cierre de un canal (si tu compañero no está conectado o no coopera), usa
$ lncli closechannel --force [FUNDING_TXID] [OUTPUT_INDEX]
Consulta la referencia de la API Lightning (http://api.lightning.community/) para obtener información adicional

Preparar el mainnet Bitcoin

En la segunda parte de esta guía moveremos el nodo Thundroid Bitcoin & Lightning al mainnet Bitcoin, que usa un blockchain diferente. Al igual que el pequeño blockchain testnet, la blockchain mainnet registra todas las transacciones de Bitcoin y básicamente define quién tiene bitcoins y cuántos tiene. Esta es la información más importante y no debemos confiar en que otra persona nos proporcione esta información. Para configurar nuestro Nodo completo Bitcoin en mainnet, necesitamos:

  • Descargar todo el blockchain (~ 200 GB)
  • Verificar cada transacción de Bitcoin que haya tenido lugar y cada bloque que se haya minado
  • Crear una base de datos índice para todas las transacciones, de modo que podamos consultarla más adelante
  • Calcular todos los saldos de direcciones de bitcoin (llamado el conjunto UTXO)

Consulta "Running a Full Node" (https://bitcoin.org/en/full-node) para obtener información adicional.

Como te puedes imaginar Thundroid no está a la altura de esta gran tarea. La descarga no es el problema, la cuestión está en que procesar inicialmente todo el blockchain llevaría varias semanas debido a las restricciones de recursos. Necesitamos descargar y verificar el blockchain con Bitcoin Core en un ordenador normal y luego transferir los datos al Thundroid. Esto solo se hace una vez. Después, Thundroid puede mantenerse al día con los nuevos bloques.

Para cambiar a mainnet, el blockchain mainnet debería estar listo, de esta manera empezaríamos con esta tarea.

Usando un ordenador normal

Suponemos que utilizaras una ordeandor con Windows para esta tarea, aunque puedes realizarla con la mayoría de sistemas operativos. Necesitas tener aproximadamente 250 GB de espacio libre en disco, internamente o en un disco duro externo. Como la indexación crea un tráfico pesado de lectura/escritura, cuanto más rápido sea tu disco duro, mejor. Una unidad interna o un disco duro externo USB3 será significativamente más rápido que uno disco con conexión USB2.

Descargar y verificar Bitcoin Core

Descarga el instalador Bitcoin Core desde bitcoin.org/download y guárdalo en el directorio que deseas utilizar para descargar el blockchain. Para verificar la autenticidad del programa, calcula su suma de verificación y compárala con las sumas de verificación proporcionadas.

En Windows, antepondré a todos los comandos que necesitamos introducir el signo ">", de modo que con el comando "> cd bitcoin", simplemente introduce "cd bitcoin" y presiona Intro.

Abre el prompt de comandos de Windows ('Win + R', introduce 'cmd', pulsa 'Intro'), navega hasta el directorio bitcoin (en mi caso, está en la unidad 'D:', comprobada con el Explorador de Windows) y crea el nuevo directorio 'bitcoin_mainnet'. Luego calcula la suma de verificación del programa descargado.

> G:
> cd \bitcoin
> mkdir bitcoin_mainnet
> dir
> certutil -hashfile bitcoin-0.16.0-win64-setup.exe sha256
6d93ba3b9c3e34f74ccfaeacc79f968755ba0da1e2d75ce654cf276feb2aa16d
Figure 15 - Windows Command Prompt: verify checksum
(Figura 15 – Prompt de comandos de Windows: comprobando la suma de verificación)

Puedes comparar estas sumas de verificación con las sumas de verificación de referencia en tu Thundroid desde el archivo que hemos descargado anteriormente y que ya ha verificado tu autenticidad. Compara el siguiente resultado con la suma de verificación de tu descarga de Bitcoin Core para Windows.

# on Thundroid, with user "admin"
$ cat /home/admin/download/SHA256SUMS.asc | grep win

7558249b04527d7d0bf2663f9cfe76d6c5f83ae90e513241f94fda6151396a29 bitcoin-0.16.0-win32-setup.exe
60d65d6e57f42164e1c04bb5bb65156d87f0433825a1c1f1f5f6aebf5c8df424 bitcoin-0.16.0-win32.zip
6d93ba3b9c3e34f74ccfaeacc79f968755ba0da1e2d75ce654cf276feb2aa16d bitcoin-0.16.0-win64-setup.exe
42706da1a95b2db8c5808529f73c2063a0dd770f71e0c8506bfa86dc0f3403ef bitcoin-0.16.0-win64.zip

Instalando de Bitcoin Core

Ejecuta el archivo de instalación de Bitcoin Core. Es posible que tengas que hacer clic derecho y elegir "Ejecutar como administrador". Instálalo usando la configuración por defecto. Inicia el programa 'bitcoin-qt.exe' localizado en el directorio "C:\Program Files\Bitcoin". Elije tu nueva carpeta "bitcoin_mainnet" como directorio de datos personalizado.

Figure 16 - Bitcoin Core directory selection
Figura 16 – Seleccionando el directorio de Bitcoin Core

Bitcoin Core abre y empieza a sincronizar inmediatamente el blockchain. Ahora, necesitamos aplicar una configuración adicional muy importante en el archivo "bitcoin.conf". Si no se aplica, todo el blockchain será inútil y necesitará ser revalidado. Usando el menú, abre “Settings”/“Options” y haz clic en el botón “Open Configuration File”. Introduce la siguiente línea:

$ txindex=1
Si tu ordenador tiene mucha memoria, puedes aumentar la caché en memoria de la base de datos añadiendo la siguiente línea (con los megabytes de memoria que se van a usar, ajustándolo a tu ordenador):
$ dbcache=6000
Guarda y cierra el archivo de texto, salte de Bitcoin Core usando “File”/”Exit” y reinicia el programa. El programa empezará a sincronizar nuevamente.

Deja que el blockchain se sincronice, esto le llevará un día o dos.

Antes de pasar a mainnet

En la parte 2 de esta guía, haremos la transición al mainnet Bitcoin. Este será un punto sin retorno. Hasta aquí, puedes empezar de nuevo. Experimenta con testnet bitcoin. Abre y cierra canales en el testnet. Es importante que te sientas seguro a la hora de realizar operaciones con Thundroid, antes de poner dinero real en línea.

Una vez que cambies a mainnet y envies Bitcoin real a tu Thundroid, tienes "entras en el juego".

  • Asegúrate de que tu RaspiBolt está funcionando según lo previsto. Práctica un poco con "bitcoin-cli" y sus opciones. Consulta la documentación de Bitcoin Core RPC (https://bitcoin-rpc.github.io/)
  • Realiza ejecuciones simuladas con "lncli" y sus muchas opciones. Consulta la referencia de la API de Lightning (http://api.lightning.community/)
  • Prueba algunos reinicios (“sudo shutdown -r now”). ¿Todo se inicia bien?

Nos vemos pronto en la parte 2, "El perfecto nodo Bitcoin Lightning️".