Como instalar tu nodo de PulseChain en tu propio ordenador

En este tutorial voy a mostrarte los pasos a seguir para que puedas tener tu nodo de pulsechain totalmente funcionar en tu red local.

Atención, este tutorial no explica como montar un nodo validador, solo se explican los pasos para tener un nodo de pulsechain en tu red local.

Puedes adaptar este tutorial a cualquier blockchain basada en Ethereum, yo he escogido pulsechain ya que a día de hoy es la más descentralizada.

A nivel de sistemas vas a aprender muchas cosas, desde instalar máquinar virtuales a consultar la blockchain en tiempo real.

Para poder seguir este tutorial es necesario que tengas sólidos conocimientos de GNU/Linux, para ello encontrarás en mi web numerosos tutoriales en esta temática, además de que estoy preparando un curso gratuíto de introducción a GNU/Linux.

Para poder mantener el canal me va a ser muy útil que te suscribas a YouTube, le des a me gusta a los vídeos y hagas comentarios.

Tambien puedes hacer donaciones en PLS, PLSX o INC a la dirección 0x8E6baDd5Ea267A9F9a6f17239e45f39Fe2310dF6

Introducción

para empezar aquí tenéis el vídeo donde introduzco el tema del nodo

En este vídeo muestro el equipo que he comprado para montar el nodo: https://amzn.to/3TOoZbJ un Intel NUC, NUC11PAHi7 Desktop Mini-PC, Intel® Core i7-1165G7, 32 GB de RAM, SSD PCIe de 1 TB

Además le he añadido un disco ssd crucial de 1TB, concretamente este https://amzn.to/3Pz9r9m y otro de 256GByte para instalar proxmox.

En total tengo un disco de 256GB donde instalaré proxmox y dos discos duros de 1TByte

Instalación de proxmox

Aquí tenéis el vídeo donde instalo proxmox, que es el sitema operativo que he usado par montar el nodo.

He usado proxmox ya que disponía de dos discos de 1TByte y necesitamos un espacio de más de 1TByte para montar le nodo.

Una posible solución es que compréis un disco de 2TByte y pasar al punto de instalación de debian.

Crear volumen zfs en proxmox

Para crear un volumne zfs en proxmox para crear un espació contiguo de 2TBytes debemos unir los dos discos duros mediante raid0

Para ello nos conectaremos vía ssh a nuestro servidor, con el comando ssh root@la-ip-local

Y ejectuaremos los comandos siguientes:

#vemos el estado de nuestra zpool
zpool status
#creamos un storage de tipos raid 0 Donde /dev/sda y /dev/sdb son los disco que queremos unir, zfsR0 es el nombre del pool
zpool create -f -o ashift=12 zfsR0 /dev/sdb /dev/sdc
zpoll iostat -v
pvesm zfsscan
#creamos el storage para montar posteriormente
zfs create zfsR0/share

Podéis definir una cuota con el comando

zfs set quota=1800G zfsR0/share

si ahora visitamos la web de nuestro servidor proxmox

Si vamos a nuestro nodo y al apartado Disks->ZFS veremos el volumen creado por línea de comandos

Ahora debemos ir a storage y añadir un zfs

Y ya nos aparecerá disponiblre

Aquí tenéis el vídeo paso a paso…

Instalación de debian

Primero hay que descargar la iso de debian 12 que podéis encontrar aquí https://www.debian.org/index.es.html

Después si queréis seguir la instalación en proxmox podéis serguir este vídeo…

Si queréis instalar directamente sobre una máquina con un disco duro de 2TBytes hay que hacer un usb booteable y seguir la misma instalación del vídeo a partir del minuto 7

Instalación de docker

Vamos a montar el nodo usado docker por tanto vamo a tener que instalárlo en nuestra màquina virtual.

Para ello seguiremos el tutorial que hay mi web, concretamente en este enlace

Crear el contenedor para nuestro nodo con docker-compose

Aquí tenéis el vídeo de esta sección

Llegamos ahora al punto principal, que es el de crear el nodo usando docker compose.

Creamos los directorios siguientes

sudo mkdir -p /blockchain/secret

Hacemos que el propietario de este directorio sea nuestro usuario

sudo chown -R guillem:guillem /blockchain

Los clientes EL y CL necesitan comunicarse mediante Engine API y, para ello, es necesario crear una clave de cifrado secreta, denominada JWT Secret. Puede utilizar la herramienta de línea de comando estándar openssl para hacerlo:

openssl rand -hex 32 | tr -d «\n» > /blockchain/secret/jwt.hex

Creamos el directorio de trabajo, en mi caso iré a mi home y crearé el directorio pulse:

cd
mkdir pulse

Dentro de este directorio voy a crear el fichero docker-compose.yml con el siguiente contenido:

services:
  pulsechain_execution:
    image: registry.gitlab.com/pulsechaincom/go-pulse:latest
    tty: true
    ports:
      - "0.0.0.0:8545:8545/tcp"
      - "0.0.0.0:8546:8546/tcp"
      - "0.0.0.0:6060:6060/tcp" # if used with --metrics or --pprof
      - "30303:30303"
    volumes:
      - /blockchain:/blockchain
    restart: unless-stopped
    stop_grace_period: 3m
    #oom_kill_disable: true
    command:
      - --datadir=/blockchain/execution
      - --pulsechain
      - --authrpc.jwtsecret=/blockchain/secret/jwt.hex
      - --authrpc.addr=pulsechain_execution
      - --authrpc.vhosts=pulsechain_execution
      - --http
      - --http.api=eth,net,web3
      - --http.addr=0.0.0.0
      - --http.corsdomain=pulsechain_execution
      - --http.vhosts=pulsechain_execution
      - --ws
      - --ws.api=eth,net,web3
      - --ws.addr=0.0.0.0
      - --metrics
      - --metrics.addr=0.0.0.0 
      - --pprof
      - --pprof.addr=0.0.0.0
  pulsechain_consensus:
     image: registry.gitlab.com/pulsechaincom/lighthouse-pulse
     tty: true
     ports:
       - "9000:9000/tcp"
       - "9000:9000/udp"
       - "0.0.0.0:5052:5052/tcp"
     restart: unless-stopped
     depends_on:
       - pulsechain_execution
     volumes:
       - /blockchain:/blockchain
     command:
       - lighthouse
       - beacon_node
       - --network=pulsechain
       - --datadir=/blockchain/consensus
       - --execution-jwt=/blockchain/secret/jwt.hex
       - --execution-endpoint=http://pulsechain_execution:8551
       - --checkpoint-sync-url=https://checkpoint.pulsechain.com
       - --http
       - --http-address
       - 127.0.0.1

Atención con las tabulaciones sino no os va a funcionar.

Para poder dejar el servidor sincronizando vamos a instalar la aplicación screen con el comando

sudo apt install screen

Ahora ejecutamos screen con el comando

screen

Ahora desde el directorio anterior ejecutamos el comando:

docker compose up

A partir de aqui el nodo se va a sicronizar con la blockchain, este proceso va a durar días, concretamente en mi caso tardó unos 4 días, por eso es necesario usar screen, ahora para salir de screen hace falta la combinación de teclas crtl + A + D

Para recuperar una sesión de screen usar el comando screen -r y mediante el tabulador veréis que sesión recuperar.

Podéis comprovar el estado de sincronización accediendo mediante geth con los siguientes comandos.

para ver los contenedores:

docker container ls

Para ejectuar geth

docker exec -it pulse-pulsechain_execution-1 geth –datadir=/blockchain/execution attach

Nos aparecera la consola de geth

Para ver el estado de sincronización ejecutamos eth.syncing

y podemos observar como va sincronizando el nodo, en este caso vamos por el bloque currentBlock: 1738080 y el bloque más alto es highestBlock: 19962219

Ahora hay que esperar y tener paciencia

Nodo sincronizado

El nodo está sicronizado cuando eth.syncing da como resultado false, como podéis ver en mi nodo:

Obtener información mediante curl

Ejecutad estos comandos desde la debian con el nodo sicronizado

Obtener la versión de geth

curl -H «Content-Type: application/json» -X POST –data ‘{«jsonrpc»:»2.0″,»method»:»web3_clientVersion»,»params»:[],»id»:67}’ 127.0.0.1:8545

obtener el net version

curl -H «Content-Type: application/json» -X POST –data ‘{«jsonrpc»:»2.0″,»method»:»net_version»,»params»:[],»id»:67}’ 127.0.0.1:854

Net_litening, devuelve true si el cliente está escuhando

curl -H «Content-Type: application/json» -X POST –data {«jsonrpc»:»2.0″,»method»:»net_listening»,»params»:[],»id»:67}’ 127.0.0.1:8545

net_peerCount devuelve el número de peers conectados

curl -H «Content-Type: application/json» -X POST –data ‘{«jsonrpc»:»2.0″,»method»:»net_peerCount»,»params»:[],»id»:74}’ 127.0.0.1:8545

gas_price: curl -H «Content-Type: application/json» -X POST –data ‘{«jsonrpc»:»2.0″,»method»:»eth_gasPrice»,»params»:[],»id»:74}’ 127.0.0.1:8545

Obtener el número de bloque curl -H «Content-Type: application/json» -X POST –data ‘{«jsonrpc»:»2.0″,»method»:»eth_blockNumber»,»params»:[],»id»:74}’ 127.0.0.1:8545

Obtener balance de una dirección específica

curl -H «Content-Type: application/json» -X POST –data ‘{«jsonrpc»:»2.0″,»method»:»eth_getBalance»,»params»:[«0x407d73d8a49eeb85d32cf465507dd71d507100c1», «latest»],»id»:1}’ 127.0.0.1:8545

Más ejemplos en esta dirección https://ethereumbuilders.gitbooks.io/guide/content/en/ethereum_json_rpc.html

Configuración del firewall

A continuación vamos a configurar el firewall para evitar ataques y disponer de más seguridad en nuestro nodo

Instalar paquetes

sudo apt-get update
sudo apt-get install ufw
sudo apt-get install net-tools

Deshabilitar firewall

de esta forma no perderemos la conexión mientras configuramos el firewall por ssh

sudo ufw disable

Denegar conexiones entrantes por defecto

sudo ufw default deny incoming

Permitir conexiones salientes por defecto

sudo ufw default allow outgoing
sudo netstat -tuln
sudo ss -tuln

Permitir puertos específicos

Se incluyen los puertos para nuestro nodo local

sudo ufw allow 22/tcp
sudo ufw allow 30303
sudo ufw allow 13000
sudo ufw allow 12000
sudo ufw allow 8545/tcp
sudo ufw allow 8546/tcp

Puertos para nginx

sudo ufw allow 80
sudo ufw allow 443

Habilitar el firewall

sudo ufw enable

Chequear los puertos

sudo ufw status verbose
sudo netstat -tlnp