Ethereum Blockchain privada

Crear una blockchain privada con el cliente Ethereum es sencillo. La propia web describe muy brevemente lo necesario, https://github.com/ethereum/go-ethereum#operating-a-private-network , y pueden encontrarse algunos tutoriales por internet (pero casis siempre usando un mismo cliente y varias instancias, es decir, en modo local).

En este caso se trata de crear una red privada, que en Ethereum usa el protocolo de consenso Clique (Proof of Authotity), definido en el EIP-255, https://eips.ethereum.org/EIPS/eip-225 , usando dos ordenadores distintos (uno de ellos en realidad será una máquina virtual Ubuntu, el otro el sistema anfitrión, Windows)

El software se descarga de la página de Ethereum https://geth.ethereum.org/downloads.

Los pasos básicamente son los siguientes:

  • Crear previamente las cuentas de los nodos validadores (sealer). Es importante tener en cuenta que para que el protocolo clique funcione (es decir, se vayan validando bloques), tienen que estar ejecutándose online al menos la mitad más uno (N/2 + 1) de los nodos validadores que se definen en el bloque génesis. En este caso, con dos nodos validadores (N=2), ambos tienen que estar ejecutándose para que la blockchain vaya funcionando.
  • Con la utilidad puppeth (que proporciona Ethereum en su descarga) crearemos en nodo génesis, usando las cuentas anteriores
  • Lanzaremos un nodo validador en la máquina virtual Ubuntu
  • Lanzaremos el otro nodo validador en el PC anfitrión Windows, especificándole que nos conectaremos como bootnode al nodo de Ubuntu.
  • Ya tendremos la blockchain funcionando, y con consolas ethereum en cada nodo podremos ir creando transacciones, etc.

Crear cuentas de los nodos Sealer

Esto puede hacerse de varias maneras. Una de ellas es lanzando una consola geth, indicándole que no busque nodos peer (en principio, esta consola se conectará a la red mainnet de Ethereum, pero no nos interesa nada de ella)

.\geth.exe --nodiscover console

Y una vez que la consola arranca, creamos las cuentas con el comando personal.newAccount(), nos pedirá un password, que tenemos que recordar, y nos genera un archivo que necesitaremos después (repetimos el comando para la otra cuenta):

Creacción de una cuenta EOA Ethereum

Bloque Génesis

El bloque génesis lo podemos crear fácilmente con la herramienta puppeth, que va pidiendo unos valores, el identificador de la cadena (un número cualquiera), las cuentas Sealer y qué cuenta queremos dotar con monedas Ether inicialmente. Nos pregunta también si deseamos que cree 256 cuentas ( desde 00 a 0ff), es mejor indicarle que no.

Cuando tenemos el nuevo bloque génesis generado hay que editarlo, pues puppeth introduce un nodo en el JSON que hay que eliminar (lo marcado en rojo):

{genesis
  {"config: : ..........
   }
}

En el campo extradata se incluyen las cuentas de los nodos validadores (dos en este caso, marcadas en colores verde y azul), y en el campo alloc los balances iniciales:

 "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000347438f5a3d26e224ca448b05e932566923ece0d598b65946815ae60c68ec34d747bae6d166902870000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
      "598b65946815ae60c68ec34d747bae6d16690287": {
        "balance": "0x300000000000000000000000000000000000000000000000000000000000000"
      }

Lanzar el nodo validador

Con lo anterior ya podemos lanzar los nodos validadores.

Los pasos previos son los siguientes:

  • Crear una carpeta donde se va a almacenar la blockchain (después de todo, cada nodo almacena la blockhain en su propio disco duro, usando una base de datos LevelDB (de google)
  • Dentro de esa carpeta crear una carpeta de nombre keystore, y dentro de esta, copiamos el archivo que se generó al crear la cuenta del nodo en cuestión. Al ejecutar un nodo validador se necesita desbloquear su cuenta, y ésta, tiene que estar almacenada en la carpeta keystore.
  • Inicializar la blockchain con el bloque génesis con el comando (por ejemplo en el nodo ubuntu):
geth init --datadir network_ubuntu network_ubuntu/bloque_genesis.json

Primer Nodo validador (Ubuntu)

Realizados los pasos anteriores simplemente lanzar el cliente geth con los parámetros para indicar que es un nodo validador (–mine), la cuenta Sealer (–unlock), la ip y el puerto para que se conecten a él otros nodos, la carpeta donde tenemos la blockchain y un identificador de la red (que tendrá que ser compartido por el resto de los nodos).

Nos pedirá el password que indicamos cuando creamos la cuenta, para desbloquearla (esto se puede evitar pasándole también un archivo como opción)

geth --datadir network_ubuntu --networkid 888 --port 30304  --nat extip:192.168.1.53 --unlock 0x598b65946815ae60c68ec34d747bae6d16690287 --mine

Ya tenemos el nodo funcionando. Ahora, para permitir que el resto de nodos se conecten a él (bootnode), abrimos en otra consola de comandos windows una consola geth:

geth  attach network_ubuntu/geth.ipc
consola en Ubuntu

Y copiamos el valor de enode, o identificador peer de este nodo, con el comando admin.nodeInfo

enode

Segundo nodo validador (windows)

Antes de nada es aconsejable comprobar la conectividad con el nodo Ubuntu en el puerto que hemos especificado al lanzar geth en él

conectividad a Ubuntu

Repetimos los pasos de crear una carpeta, dentro de ella otra de nombre keystore, y dentro de esta última copiamos el archivo de dirección de la cuenta que va a ser el validador en este otro nodo.

Inicializamos la blockchain con el bloque génesis:

inicialización de la blockchain con el bloque génesis

Y ahora ejecutamos el cliente geth, de manera similar a la anterior, pero indicando el bootnode con el valor del peer de Ubuntu:

.\geth.exe --datadir network_win --networkid 888 --port 30304  --nat extip:192.168.1.151 --unlock 0x347438f5a3d26e224ca448b05e932566923ece0d --mine --bootnodes "enode://beabee96d1b3125c10efa7f5c7d61ec585fd1e9d5ff648c7a34db19881bae9776c0772f7f321e8d2b3858b6ab999e5aadc482593455423394c30ab8fcd9d9929@192.168.1.53:30304?discport=30304" --syncmode full

Para evitar errores con puerto UDP, el valor de discport (que geth podría habernos dado con valor 0, ha de sustituirse por el mismo puerto de nuevo)

Para conectarnos a la consola geth e interactuar con el nodo en Windows, cualquiera de estos dos comandos vale:

.\geth.exe attach \\.\pipe\geth.ipc

.\geth.exe attach

Efectuamos una transacción a otra cuenta (que hemos creado y guardado en la carpeta keystore de Windows), desde la cuenta Sealer de Ubuntu, que es la que iniciamos con fondos en el bloque génesis

cuentas en el nodo Windows, una Sealer, la otra no
transacción desde la consola del nodo Ubuntu

Todo va funcionando correctamente y se van validando (minando) bloques

Blockchain funcionando y validando bloques (la mayoría vacíos en este caso)

Y ya disponemos de una red privada Ehtereum, pueden añadirse más nodos sealer o de cualquier otro tipo y desplegar aplicaciones.

3 Comments

  1. Ethereum y LevelDB: Leer, Modificar y Compilar Geth – Abraza la Web · miércoles, 4 enero, 2023 Reply

    […] la base de datos que se almacena en los nodos (usaré en este post la blockchain privada del post Ethereum Blockchain privada), modificar los datos de un bloque (eliminar las transacciones) y ver cómo podemos modificar el […]

  2. Ethereum: explorando base de datos leveldb – Abraza la Web · sábado, 14 enero, 2023 Reply

    […] privada con el cliente geth, y de las herramientas en go, tomando como base los anteriores posts Ethereum Blockchain privada y Ethereum y LevelDB: Leer, Modificar y Compilar […]

  3. Ethereum: leer LevelDB, Smart Contract y Storage Trie – Abraza la Web · viernes, 20 enero, 2023 Reply

    […] de Ethereum (ver Ethereum: explorando base de datos leveldb, donde se explora el State Trie y Ethereum Blockchain privada, Ethereum y LevelDB: Leer, Modificar y Compilar Geth donde se ve el entorno de una red privada y […]

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.