Nodo completo Bitcoin en Raspberry Pi 3

Josema Arenillas
7 min readJan 30, 2018

--

Este how-to va a explicar paso a paso la instalación y configuración de un nodo completo de Bitcoin en una Raspberry Pi 3.

La memoria de la Raspberry Pi 3 no es suficiente para sincronizar la blockchain, he probado diferentes configuraciones de swap pero no he conseguido que la sincronización la realice la Raspberry, a partir de cierta altura de bloque (<> 330000) el proceso se interrumpe por falta de memoria. Para evitar esto hay 2 soluciones:

  • Sincronizar la blockchain en un dispositivo con la potencia necesaria y una vez sincronizado copiar la blockchain a nuestra Raspberry.
  • Descargar la blockchain desde un enlace, no recomiendo este paso ya que requiere confianza en un tercero, no obstante, al arrancar nuestro nodo comprobará los bloques para validar la copia de la blockchain. https://getbitcoinblockchain.com/

¿Qué necesitamos?

Raspbian

Con todos los componentes ya en casa es hora de poner en marcha nuestra raspberry, como sistema operativo utilizaremos Raspbian Stretch Lite, la versión de Raspbian sin entorno gráfico, no lo necesitamos.

Las instrucciones oficiales de Raspberry las podéis consultar aquí → https://www.raspberrypi.org/documentation/installation/installing-images/README.md

Una vez volcada la imagen veremos que en la sd se han creado 2 particiones, una de ellas es FAT, en esta partición debemos crear un fichero que se llame ssh sin extensión, al arrancar la raspberry comprueba la existencia de este fichero y en caso de que exista habilita la conexión SSH.

SI NO LO CREAMOS NO PODREMOS CONECTARNOS POR SSH.

Configuración básica

Una vez instalado y habilitado el acceso ssh, podemos poner en marcha nuestra raspberry, recomiendo conectarla por cable ethernet pero si no es posible se puede configurar nuestra WIFI antes de encender nuestra raspberry:

  • Habrá que crear en la partición boot de nuestra micro sd (donde hemos creado el fichero ssh) un fichero que se llame wpa_supplicant.conf. El contenido del fichero debe ser así:

network={

ssid=”NOMBRE_DE_TU_RED”

psk=”CONTRASEÑA”

}

También podríamos poner ip fija en este punto pero es más sencillo hacerlo vía ssh.

Una vez arrancada la Raspberry podemos comprobar la ip que tiene asignada de varías maneras, consultar en el router, si tenemos nuestro móvil conectado a la misma red hay aplicaciones que nos pueden dar esa info como FING (https://www.fing.io/), si lo conectamos a un monitor o tv podemos ver el dato en pantalla.

Nos conectamos a nuestra Raspberry (yo utilizo Putty → https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html), el usuario es “pi” y la contraseña “raspberry”.

Cambio de contraseña usuario pi

Podemos crear un usuario nuevo o cambiar la contraseña al usuario pi. Para ello ejecutamos el configurador de raspberry

sudo raspi-config

Nos pedirá la contraseña “raspberry” y accederemos al configurador:

Seleccionamos la primera opción y cambiamos la contraseña por defecto.

Una vez cambiada salimos del configurador, cerramos la sesión y nos volvemos a conectar con nuestra nueva contraseña.

Poner IP fija

Es conveniente poner ip fija a la Raspberry para posteriormente abrir el puerto 8333 hacía el exterior, para ello vamos a editar el fichero dhcpcd.conf.

sudo nano /etc/dhcpcd.conf

Este es un ejemplo del contenido que debe tener: (adaptar ip, gateway y DNS a vuestra configuración)

# Example static IP configuration:

interface eth0

static ip_address=192.168.1.2/24

static routers=192.168.1.1

static domain_name_servers=8.8.4.4 8.8.8.8

Guardamos el fichero, salimos y reiniciamos nuestra Raspberry, nos volveremos a conectar a ella utilizando la IP fija que le hemos dado.

Formatear disco duro externo

Para utilizar nuestro disco duro lo vamos a formatear y crear un sistema de ficheros ext4.

Primero vamos a listar los dispositivos para sacar la información del disco:

lsblk

Esto nos dará información de los dispositivos, capacidades y particiones. Los discos usb actuales vienen por defecto con una partición creada, si en el campo “MOUNTPOINT” aparece alguna ruta, habrá que desmontar el disco antes de formatear con el comando sudo umount “ruta”.

Una vez desmontado lo formateamos:

sudo mkfs.ext4 /dev/sda1

Y esperamos a que finalice el proceso.

Montar disco duro externo

Nuestro disco duro externo va a ser el encargado de almacenar los datos del nodo, la blockchain y configuraremos el swap en él, he probado a tener el swap en la micro sd pero la escritura continua la corrompe en poco tiempo.

Creamos el directorio .bitcoin dentro de nuestra home

mkdir .bitcoin

Ejecutamos el siguiente comando para sacar la información necesaria:

sudo blkid

La salida de este comando nos da varios datos entre los que se encontraremos nuestro disco usb y su PARTUUID que utilizaremos para configurar el montado automático en el arranque.

Apuntamos el PARTUUID y editamos el fichero fstab:

sudo nano /etc/fstab

Añadimos al final del fichero el montaje de nuestro disco duro en el directorio .bitcoin que hemos creado, en el ejemplo asumimos el usuario pi, si hemos creado otro usuario habrá que adaptar las rutas:

PARTUUID=88537bbe-01 /home/pi/.bitcoin ext4 defaults,noatime 0 0

Guardamos el fichero, y reiniciamos nuestra Raspberry. Nos volvemos a conectar y comprobamos que el disco duro está montado en la ruta con el siguiente comando:

df -h

Crear fichero SWAP en nuestro disco duro

Vamos a crear 2Gb de swap, el fichero lo crearemos más grande para que no haya problema. Para ello ejecutamos lo siguiente:

cd .bitcoin

mkdir swap

dd if=/dev/zero of=/home/pi/.bitcoin/swap/swap.file bs=1M count=2148

Esperamos a que finalice el proceso y editamos el fichero que indica la ruta del fichero SWAP para indicarle nuestra nueva ruta:

sudo nano /etc/dphys-swapfile

Buscamos dentro del fichero las siguiente líneas y las modificamos a nuestros valores

# where we want the swapfile to be, this is the default

CONF_SWAPFILE=/home/pi/.bitcoin/swap/swap.file

# set size to absolute value, leaving empty (default) then uses computed value

# you most likely don’t want this, unless you have an special disk situation

CONF_SWAPSIZE=2048

Una vez modificados guardamos el fichero y reiniciamos nuestra Raspberry.

Nos conectamos y comprobamos que se ha asignado el tamaño correctamente:

free -h

Instalación del cliente Bitcoin

Antes de nada vamos a actualizar los paquetes de nuestra raspberry con el siguiente comando:

sudo apt-get update && apt-get upgrade

Cuando finalice el proceso instalaremos los requisitos (están incluídos los necesarios para poner en funcionamiento la pantalla e-ink):

sudo apt-get install build-essential autoconf libssl-dev libboost-dev libboost-chrono-dev libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libboost-test-dev libboost-thread-dev libevent-dev libtool git python-pip imagemagick

Creamos el directorio client donde descargaremos y compilaremos lo necesario para poner en marcha nuestro nodo:

mkdir client

cd client

Descargamos, compilamos e instalamos la base de datos que necesita el cliente Berkeley DB, la versión tiene que ser la 4.8.30:

wget http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz

tar -xzvf db-4.8.30.NC.tar.gz

cd db-4.8.30.NC/build_unix/

../dist/configure — enable-cxx

make

sudo make install

El proceso completo tarda unos 20 minutos. Paciencia.

Cuando finalice pasamos a instalar el cliente Bitcoin:

Lo primero es comprobar la última versión publicada en https://github.com/bitcoin/bitcoin

Entramos en el directorio client que se encuentra en nuestra home y descargamos y compilamos.

cd /home/pi/client

git clone -b 0.16 https://github.com/bitcoin/bitcoin.git

cd bitcoin/

./autogen.sh

./configure CPPFLAGS=”-I/usr/local/BerkeleyDB.4.8/include -O2" LDFLAGS=”-L/usr/local/BerkeleyDB.4.8/lib”

make

sudo make install

Este proceso dura más de hora y media. Paciencia de nuevo.

Una vez finalizado tenemos listo nuestro nodo, si queremos modificar alguna de las configuraciones que vienen por defecto os recomiendo esta página que permite generar un fichero de configuración de manera sencilla → https://jlopp.github.io/bitcoin-core-config-generator/

Ya sea con las opciones por defecto o con un fichero de configuración propio, ya podemos arrancar nuestro nodo con bitcoind & utilizamos la “&” para que el proceso arranque como demonio. Le damos unos minutos y ya podemos comprobar que nos responde por ejemplo con:

bitcoin-cli getblockcount → devuelve el número de bloque en el que está nuestro nodo

bitcoin-cli getconnectioncount → devuelve el número de conexiones de nuestro nodo

Hay una lista de todas las peticiones aquí → https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list

Para que nuestro nodo aporte conexiones a la red es necesario abrir el puerto 8333 al exterior, este paso varía con cada router. Para comprobar que nuestro nodo está correcto y aportando conexiones a la red Bitcoin lo haremos desde https://bitnodes.earn.com/ introduciendo nuestra ip pública.

Si es correcto, ya tenemos nuestro nodo Bitcoin funcionando.

Pantalla e-ink

Para poner en marcha la pantalla e-ink en caso de haberla adquirido necesitamos bajar el driver del fabricante:

wget https://www.waveshare.com/w/upload/1/10/Bcm2835-1.39.tar.gz

tar -xvzf Bcm2835–1.39.tar.gz

cd bcm2835–1.39/

./configure
make
sudo make check
sudo make install

Finalizado esto, instalamos las dependencias

sudo pip install wiringpi

sudo pip install rpi.gpio

sudo apt-get install bc i2c-tools

sudo apt-get install fonts-freefont-ttf

sudo apt-get install python-smbus

sudo apt-get install python-serial

sudo apt-get install python-imaging

sudo apt-get install python-dateutil

sudo pip install pillow

Entramos en el configurador de la Raspberry y en el apartado “Advanced” activamos el I2C

sudo raspi-config

Es decisión de cada uno la información que quiere que aparezca en esta pantalla.

--

--