Skip to content

Instantly share code, notes, and snippets.

@grunch
Last active October 3, 2020 15:47
Show Gist options
  • Save grunch/01a4817c9cd1bcec10213ccd5aff2bc7 to your computer and use it in GitHub Desktop.
Save grunch/01a4817c9cd1bcec10213ccd5aff2bc7 to your computer and use it in GitHub Desktop.
Guia workshop Lightning Nodes

Guía de instalación de un nodo ligero de Lightning Network utilizando LND neutrino.

1.- Descargar Raspberry pi OS Lite (https://www.raspberrypi.org/downloads/), en esta página están las instrucciones para descargar e instalar la imagen en una micro sd en windows, mac y linux.

2.- Formatear la sd card con Raspberry Pi Imager o con balenaEtcher (https://www.balena.io/etcher/)

NOTA: El símbolo $ se utiliza como prompt y le permite al usuario entrar ordernes al computador, los comandos serán interpretados por bash en Linux, el símbolo # al principio de una línea indica que el texto a continuación es un comentario

3.- Antes de iniciar la raspberry pi con la memoria formateada, debemos insertarla en una computadora y crear dos archivos que nos permitirán conectarnos remotamente. Con el comando touch creamos un archivo vacío y con esto en la partición /boot, con esto habilitamos conexión por ssh en el primer inicio de la sd card recién formateada

    # NOTA: Si la microSD ha sido montada en /media/microSD, el comando 
    # debería ser $ sudo touch /media/microSD/boot/ssh
    $ touch /boot/ssh

4.- Con el comando nano creamos el archivo wpa_supplicant.conf y directamente comenzamos editarlo, en este archivo debemos copiar la configuración del wifi, copia el texto contenido entre INICIO y FIN, y modifca la SSID y contraseña de la wifi a la que te desees conectar.

    $ nano /boot/wpa_supplicant.conf

    ------ INICIO -------
    country=ar
    update_config=1
    ctrl_interface=/var/run/wpa_supplicant

    network={
     ssid="MyNetworkSSID"
     psk="password"
    }
    ------ FIN -------

5.- Luego introducimos la sd card en la Raspberry pi y la conectamos la rpi a la fuente de poder para que inicie el sistema operativo, necesitaremos identificarla en la red, probablemente el protocolo mDNS le asigne este nombre en la red raspberrypi.local, intentemos conectarnos por ssh.

    $ ssh pi@raspberrypi.local

password: raspberry

Si no funciona hay que averiguar la red, averiguemos la dirección IP a la que estamos conectados.

    $ ifconfig

Si por ejemplo, es 192.168.0.0, hacer nmap para encontrar la rpi

    nmap -v 192.168.0.0/24

Suponiendo que encontramos una nueva IP en nuestra red 192.168.0.30

Entrar por ssh.

    $ ssh pi@192.168.0.30

password: raspberry

6.- Configuramos la rpi

    $ sudo raspi-config
  • Seleccionamos la opción (1) y cambiamos el password del usuario pi
  • Seleccionamos la opción (8) para actualizar la herramienta de configuración a la última versión
  • Seleccionamos la opción (4) para seleccionar nuestra zona horaria
  • Seleccionamos la opción (7) y luego Expand filesystem
  • Finish

7.- Actualizamos el SO

    $ sudo apt update && sudo apt upgrade -y
    $ sudo apt install htop git curl bash-completion jq qrencode dphys-swapfile vim --install-recommends -y 

8.- Agregamos el usuario bitcoin

    $ sudo adduser bitcoin

9.- Aseguramos la rpi

    $ sudo apt install ufw
    $ sudo ufw default deny incoming
    $ sudo ufw default allow outgoing
    $ sudo ufw allow 22 comment 'allow SSH from LAN'
    $ sudo ufw allow 9735 comment 'allow Lightning'
    $ sudo ufw allow 10009 comment 'Lightning gRPC'
    $ sudo ufw enable
    $ sudo systemctl enable ufw
    $ sudo ufw status
    $ sudo apt install fail2ban

10.- Instalamos go: si no se está utilizando una raspberry pi descargue go para su arquitectura aquí (https://golang.org/dl/)

    $ wget https://golang.org/dl/go1.15.linux-armv6l.tar.gz
    $ sudo tar -C /usr/local -xzf go1.15.linux-armv6l.tar.gz
    $ echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc
    $ echo "export GOPATH=$HOME/go" >> ~/.bashrc
    $ echo "export PATH=$PATH:$GOPATH/bin" >> ~/.bashrc
    $ source ~/.bashrc
    $ go version # debe mostrar el siguiente mensaje 'go version go1.13.5 linux/arm'

11.- Compilamos y instalamos lnd

    $ git clone https://github.com/lightningnetwork/lnd.git
    $ cd lnd
    $ make
    $ make install tags="autopilotrpc chainrpc experimental invoicesrpc routerrpc signrpc walletrpc watchtowerrpc wtclientrpc"
    $ sudo cp $GOPATH/bin/lnd /usr/local/bin/
    $ sudo cp $GOPATH/bin/lncli /usr/local/bin/
    $ lncli --version
    lncli version 0.11.0-beta commit=v0.11.0-beta-61-g6055b00dbbcedf45cd60f12e57dc5c1a7b97746f

12.- Creamos el archivo de configuración de lnd, esto se debe realizar con el usuario 'bitcoin'

   $ sudo su - bitcoin
   $ mkdir .lnd
   $ nano .lnd/lnd.conf

   ---- INICIO -----
   [Application Options]
   # permite pagos espontáneos
   accept-keysend=1

   # Nombre público del nodo
   alias=TU_ALIAS
   # Color público en hexadecimal
   color=#000000
   debuglevel=info
   maxpendingchannels=5
   listen=localhost
   # gRPC socket
   rpclisten=0.0.0.0:10009

   [Bitcoin]
   bitcoin.active=1
   bitcoin.mainnet=1
   bitcoin.node=neutrino

   [neutrino]
   neutrino.connect=bb2.breez.technology

13.- Para que LND se inicie luego del booteo de la rpi debemos crear el archivo .service en systemd

Si estamos como usuario bitcoin y queremos volver a utilizar el usuario pi solo escribimos 'exit'

    $ exit
    $ sudo nano /etc/systemd/system/lnd.service
    ----- INICIO -----
    [Unit]
    Description=LND Lightning Network Daemon
    After=network.target

    [Service]

    # Service execution
    ###################

    ExecStart=/usr/local/bin/lnd


    # Process management
    ####################

    Type=simple
    Restart=always
    RestartSec=30
    TimeoutSec=240
    LimitNOFILE=128000

    # Directory creation and permissions
    ####################################

    # Run as bitcoin:bitcoin
    User=bitcoin
    Group=bitcoin

    # /run/lightningd
    RuntimeDirectory=lightningd
    RuntimeDirectoryMode=0710

    # 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
    ----- FIN -----

    $ sudo systemctl enable lnd
    $ sudo systemctl start lnd
    $ systemctl status lnd

Podemos ver los logs ejecutando el comando journalctl

    $ sudo journalctl -f -u lnd
  1. Ahora iniciamos lnd

    $ sudo su - bitcoin
    $ lncli create
    
  2. Agregar fondos a nuestro nodo

    $ lncli newaddress p2wkh
    

Enviar btc a la dirección que nos devuelve lnd

Para consultar el balance

    $ lncli walletbalance
    {
        "total_balance": "500000",
        "confirmed_balance": "0",
        "unconfirmed_balance": "500000"
    }

Luego de que haya sido confirmada la tx podemos abrir algun canal

Abrimos una conexión a un nodo:

    $ lncli connect 031015a7839468a3c266d662d5bb21ea4cea24226936e2864a7ca4f2c3939836e0@212.129.58.219:9735

Luego abrimos un canal

    $ lncli openchannel 031015a7839468a3c266d662d5bb21ea4cea24226936e2864a7ca4f2c3939836e0 1000000 0

Chequeamos nuestros fondos

    $ lncli walletbalance
    $ lncli channelbalance

Podemos ver los canales pendientes y los activos

    $ lncli pendingchannels
    $ lncli listchannels

Para pagar una invoice lightning

    $ lncli payinvoice lnbc1p0kkhgwpp5sn9y6xe9hx7swrjj4057..............674vh73nwk6rxg8j8zedztkn3vdzgjafacqmud86h

Para recibir un pago creo una invoice por un monto específico

    $ lncli addinvoice --memo 'mi primer pago en LN' --amt 100

Para ver información sobre mi nodo

    $ lncli getinfo

La lista completa de comandos la podemos ver solo ejecutando lncli

    $ lncli

Finalmente para hacer llamadas a la api de lnd

$ MACAROON_HEADER="Grpc-Metadata-macaroon: $(xxd -ps -u -c 1000 .lnd/data/chain/bitcoin/mainnet/admin.macaroon)"
$ curl -X GET --cacert .lnd/tls.cert --header "$MACAROON_HEADER" https://localhost:8080/v1/getinfo |jq
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment