Urko Larrañaga Piedra Head of Blockchain

4 pasos para arrancar una Blockchain privada con tus propios nodos

¿Te gustaría seguir profundizando en el desarrollo de Blockchain? A continuación, presentamos una guía sencilla que te permitirá construir tu propia Blockchain privada arrancando los nodos que la crearán paso a paso. A lo largo de este post se mencionan una serie de conceptos técnicos, que puedes consultar en nuestro glosario.

En un post anterior te enseñamos cómo arrancar y testear tu propia blockchain con Ganache. Y en esta ocasión crearemos una Blockchain para la que será necesario poner en marcha un par de nodos de Ethereum conectados entre sí y utilizar "geth", para gestionarlos ¿Quieres saber cómo y qué necesitas?

Requisitos previos

En los pasos que se describen a continuación se pondrán ambos nodos en marcha sobre una máquina Ubuntu. No obstante, este manual es exportable a otro tipo de contextos y en todo aquel que se vaya a arrancar un nodo, se deberá instalar Ethereum. Para ello, bastará con ejecutar los siguientes comandos:

  • # sudo apt-get install software-properties-common

  • # sudo add-apt-repository -y ppa:ethereum/ethereum

  • # sudo apt-get update

  • # sudo apt-get install ethereum

Una vez aplicados, comenzamos con la arquitectura de nuestra cadena de bloques siguiendo 4 pasos fundamentales.

1. Configuración inicial

Para empezar, deberemos crear el bloque génesis o primer bloque de la Blockhcain, que recoge la configuración básica de la cadena. En caso de que estemos intentando unirnos a alguna red de Ethereum ya en marcha, tendríamos que obviar este paso. La Blockchain se comienza a generar a partir de la configuración recogida en un fichero del que destacamos los siguientes parámetros:

  • ChainId: identificador de nuestra cadena.

  • Difficulty: dificultad del minado, en función de lo cual la generación de nuevos bloques requerirá más o menos cómputo.

  • GasLimit: el límite del coste en gas por cada bloque.

  • Alloc: direcciones preconfiguradas al crear la cadena.

    Una configuración base de este fichero inicial podría ser la siguiente, al que nombraremos a modo de ejemplo como “genesis.json”

                
    {
        "config": {
            "chainId": 1907,
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
        },
    
        "difficulty": "40",
        "gasLimit": "2100000",
        "alloc": {}
    }
                
            

Una vez definido el fichero de configuración inicial, crearemos un directorio para cada nodo de nuestra red. Estos directorios son los responsables de almacenar toda la información correspondiente a la cadena de bloques.

Además, en el caso de este primer nodo generaremos una dirección de Ethereum, la cual añadiremos al fichero inicial. De este modo, al arrancar nuestra Blockchain inicializaremos esta dirección. Los comandos que tendríamos que ejecutar son los siguientes:

  • # mkdir node1

  • # geth --datadir node1 account new

  • # mkdir node2

La ejecución de este segundo parámetro nos solicitará que introduzcamos la contraseña para la cuenta de Ethereum que se va a crear. Tras ello, copiaremos la dirección de nuestra cuenta en el fichero “genesis.json”, indicándole su saldo inicial. Bastaría con añadir las siguientes líneas.

        
    "alloc": {
        "ce987dbcb98de9fa61d1e37e204212cfc69e7b00": {
            "balance": "300000"
        },
    }
        
    

2. Arrancar nodos de la Blockchain

Una vez configurado el fichero inicial, procederemos a poner en marcha la cadena de bloques. Para ello, bastará con ejecutar los siguientes comandos: el primero de ellos, instancia el directorio de nuestra cadena; el segundo, nos arrancará nuestro primer nodo.

  • geth --identity node1 init genesis.json --datadir node1

  • geth --datadir node1 --maxpeers 2 --networkid 13 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --port 30301

Una vez arrancado el primer nodo, procederemos con el segundo. Para ello, bastaría con ejecutar los siguientes comandos en una nueva terminal:

  • geth --identity node2 --datadir node2 init genesis.json

  • geth --datadir node2 --maxpeers 2 --networkid 13 --rpc --rpccorsdomain "*" --port 30302 --rpcport 8546

    Entre los parámetros que hemos definido en el arranque de los nodos, destacaríamos los siguientes: por una parte, el número máximo de nodos que pueden pertenecer a la red; por otra parte, el identificador de la red Ethereum.

3. Publicitar nodos

Tras haber arrancado ambos nodos debemos darlos a conocer para que cada uno sepa quién es su “vecino” o “compañero” de red. En este caso, al tratarse de una red con únicamente dos nodos, bastará con acceder a uno de ellos e indicarle la dirección (enode) de su compañero. Los pasos a seguir son:

Accedemos al nodo 1 y obtenemos su dirección. Lo haremos en una nueva terminal prestando atención a la ubicación en la que nos encontramos y siguiendo los siguientes pasos:

  • geth attach /home/user/privatenet/node1/geth.ipc

  • admin.nodeInfo.enode

En otra nueva terminal accedemos al nodo 2 y añadimos el nodo 1 ejecutando:

  • geth attach /home/user/privatenet/node2/geth.ipc

  • admin.addPeer("enode://b7187273d8f3de667eb0e77ac1bc563c005ab117c7c04cdce1d667e2959d5a0fae88636fe63dc36fd37e43fb64f091ae5febe4f69665350641cec7d66bc19510@[::]:30301")

    En todo momento, podemos ver los nodos que conoce cada uno mediante la ejecución del siguiente comando:

  • web3.net.peerCount

4. Minado y testing

Completados los pasos anteriores, sólo quedaría comenzar a minar. Para eso, en el caso del nodo 2, antes de empezar es necesario crear una cuenta, indicando su correspondiente contraseña. Los comandos a ejecutar en el nodo 2 serían:

  • personal.newAccount()

  • miner.start()

    Para comprobar que todo ha salido bien y verificar el correcto funcionamiento de la Blockchain, ejecutaremos un envío de ethers o criptomonedas Ethereum, de la cuenta del nodo 2 a la del nodo 1. Para conocer la dirección de una cuenta en nuestro nodo y su correspondiente saldo ejecutamos los siguientes comandos. Recordar que en cada nodo es posible tener más de un account.

  • eth.accounts[0]

  • eth.getBalance(“direccionDevueltaDeLaEjecucionDelComandoAnterior”)

  • web3.personal.unlockAccount(web3.personal.listAccounts[0],"<password>", 15000)

  • eth.sendTransaction({from: 'fromAddres', to: 'toAddress', value: web3.toWei(1, "ether")})

Conclusión

Construir tu propia Blockchain privada para poner en marcha dos nodos Ethereum conectados entre sí, está al alcance de cualquiera siguiendo esta sencilla guía. Pero si quieres conocer más en profundidad como funciona una Blockchain o tu empresa está pensando en implantar esta tecnología tan disruptiva, en Izertis contamos con consultores especializados en la cadena de bloques que podrán posicionar a tu organización a la vanguardia de tu sector de negocio adoptando las ventajas de este "nuevo internet".