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):
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
Y copiamos el valor de enode, o identificador peer de este nodo, con el comando admin.nodeInfo
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
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:
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
Todo va funcionando correctamente y se van validando (minando) bloques
Y ya disponemos de una red privada Ehtereum, pueden añadirse más nodos sealer o de cualquier otro tipo y desplegar aplicaciones.
[…] 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 […]
[…] 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 […]
[…] 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 […]
[…] que todo funcione correctamente (NodeJS, Git, gcc…), tal como se describe en post anteriores (Ethereum Blockchain privada, Ethereum: explorando base de datos leveldb), podemos debuggear el código de geth si lo […]