Andoni Rodríguez


Articulos

Criptomandangas.com


Prueba de concepto. Como montar una red privada de Ethereum

Criptomandangas.com es un proyecto que estamos realizando entre unos cuantos compañeros con el unico fin de dar a conocer BlockChain mientras nosotros mismos vamos aprendiendo sobre esta tecnología, el post que a continuación vas a leer fue publicado originalmente aqui. Si te interesa BlockChain y estas pensando en desarrollar sobre ello te recomiendo encarecidamente que te des una vuelta por este blog porque tiene contenido (en castellano) interesante sobre el tema.

Desde hace unos años BlockChain nos está inundando. Las empresas de todo el mundo intentan con mayor o menor acierto implementar esta tecnología en su producto o modelo de negocio.

Aunque la gente normalmente asocia la tecnología BlockChain directamente con las criptodivisas mas famosas, para mí lo interesante de BlockChain se centra en el ecosistema de Smarts Contracts y Dapps que se ha formado alrededor de la red Ethereum

Para que todos tengamos una idea aproximada de lo que es un BlockChain, simplemente voy a hacer copy & paste de la definición de WikiPedia:

A blockchain, is a continuously growing list of records, called blocks, which are linked and secured using cryptography. Each block typically contains a cryptographic hash of the previous block, a timestamp and transaction data. By design, a blockchain is inherently resistant to modification of the data. It is "an open, distributed ledger that can record transactions between two parties efficiently and in a verifiable and permanent way". For use as a distributed ledger, a blockchain is typically managed by a peer-to-peer network collectively adhering to a protocol for validating new blocks. Once recorded, the data in any given block cannot be altered retroactively without the alteration of all subsequent blocks, which requires collusion of the network majority.

Blockchains are secure by design and are an example of a distributed computing system with high Byzantine fault tolerance. Decentralized consensus has therefore been achieved with a blockchain. This makes blockchains potentially suitable for the recording of events, medical records, and other records management activities, such as identity management, transaction processing, documenting provenance, food traceability or voting.

La dosis de humo que existe alrededor de la tecnología BlockChain es mas que notable; ICO's que no tienen un modelo de negocio claro o viable, precios desorbitados de las criptomonedas mas famosas, robos, excepticismo alrededor de la comunidad, desconocimiento en general y un largo numero de etceteras.

Pero la realidad es que BlockChain ha venido para quedarse. La forma de hacer transacciones entre los usuarios, a través de los Smart Contracts, la descentralización de todos los nodos, las Daaps, las ICO's (con una buena idea de negocio), van a posibilitar que en los próximos años veamos un montón de empresas crearse alrededor de BlockChain y de Ethereum. Personalmente creo que esto es algo muy positivo para nuestro sector y que nos va a abrir las puertas a todo un conjunto de posibilidades aún por conocer.

Considero que la mejor manera de acercarme al mundo del BlockChain es montando una red privada de Ethereum, porque creo firmemente que es la metodología sobre la que más se está creciendo en este sector.

En este artículo voy a explicaros como montar vuestra propia red privada de Ethereum, al margen de la MainNet, la finalidad es puramente conocer como se monta una red de Ethereum desde 0 y que seamos capaces de entender como funciona un nodo Geth, como unirlos entre sí y como minar nuestros propios Tokens.

Requisitos

Antes de meternos en faena, tenemos que instalar unas cuantas cosas. Básicamente la idea detrás de una red privada de Ethereum es que sean varios nodos (varias máquinas), con varios mineros. Pero como este caso solo tiene fines de aprendizaje, vamos a usar la misma maquina para todo.

Para montar nuestra red privada de Ethereum necesitamos lo siguiente:

  • Un servidor con Ubuntu 16.04:

Este servidor puede ser lo que v osotros querais, tanto una maquina virtual, un servidor fisico, uno en cloud, lo que sea. Lo importante es que tenga instalado Ubuntu y sea una instalacion mas o menos limpia.

  • Cliente Geth instalado

El ciente de Ethereum que vamos a usar Geth. Geth es la implementacion en Go del protocolo Ethereum. Para instalarlo haremos lo siguiente:

Agregamos el repositorio y updateamos apt:

$ sudo add-apt-repository -y ppa:ethereum/ethereum

$ sudo apt-get update

E instalamos el cliente de Geth:

$ sudo apt-get install ethereum

  • Editor de ficheros

Realmente puede ser el editor de ficheros con el que os encontreis mas comodos, en mi caso en el lado del servidor, siempre uso vim

Creación del Genesis block

La única cosa (o casi) que diferencia a una red privada de Ethereum de un nodo normal perteneciente a la Main Network es la existencia del Block Genesis en el directorio de Ethereum.

Para generar nuestro Genesis Blockharemos lo siguiente:

  • Creamos un directorio para almacenar los ficheros que necesita la red de Ethereum.

$ mkdir -p ethereum-private-network

  • Dentro del directorio 'ethereum-private-network', creamos el fichero JSON que realmente es el Genesis Block (genesisblock.json).

'ethereum-private-network/genesisblock.json' quedaría de esta forma:

{
   "config": {
      "chainId": 1984,
      "homesteadBlock": 0,
      "eip155Block": 0,
      "eip158Block": 0,
      "byzantiumBlock": 0
   },
   "difficulty": "200",
   "gasLimit": "2000000"
}   

En este fichero a nivel técnico, hay bastantes conceptos nuevos y que necesitan ser explicados, vamos a ir viendo los más importantes.

' chainId '

Este es el identificador único de nuestro BlockChain, esto es con lo que vamos a identificar nuestra red privada.

' difficulty '

Este parámetro no es ni más ni menos que la dificultad que se van a encontrar los nodos mineros a la hora de resolver los algoritmos para generar nuevos bloques y ser recompensados.

Es más que conveniente poner un número bajo, para que podamos ver a nuestros mineros genear tokens, 200 es mas que suficiente.

' gasLimit '

El gas es un concepto un tanto difícil de entender dentro de la red Ethereum. Se entiende gas como el valor que va a costar ejecutar las diferentes operaciones en nuestra red privada. El gasLimit hace referencia a la cantidad máxima que puede ser consumida antes de que la transaccción falle por completo.

En nuestro caso el gasLimit lo hemos seteado a 2000000.

Iniciando el primer nodo

Una vez definido y configurado nuestro Genesis Block lo único que hace falta para iniciar la red privada es iniciar el directorio del nodo de la siguiente forma:

$ geth --datadir ./data_dir init ./genesisblock.json

Y finalmente, arrancarlo:

$ geth --datadir ./data_dir --networkid 9988 console 2>> main_node.log

La opción '--networkid' es importante porque es el identificador que van a tener que poner los otros nodos cuando se quieran unir a nuestra red.

Creando cuentas

Algo básico en una red privada de Ethereum son las direcciones de las cuentas donde vamos a guardar nuestros, tokens. Para crearnos una cuenta debemos ejecujtar lo siguiente en la consola de Geth:

> personal.newAccount("tu_clave_super_secreta")

Después vamos a setear esta cuenta como default en nuestra red privada:

> miner.setEtherbase(web3.eth.accounts[0])

Agregando Nodos

Para que una red privada de Ethereum sea merecedora de ser llamada red, obviamente, tiene que tener más de un nodo. En este caso vamos a arrancar un par de nodos mas dentro del mismo servdidor, que es algo que no en una red de verdad no tendría demasiado sentido, pero como el objetivo en este artículo es aprender a construirla no hay problema.

Arrancamos el segundo nodo con el siguiente comando:

$ geth --datadir ./data_dir_1 init ./genesisblock.json && geth --datadir ./peer2DataDir --networkid 9988 --port 30305 console 2>> eth_node_1.log

Arrancamos el tercer nodo con el siguiente comando:

$ geth --datadir ./data_dir_2 init ./genesisblock.json && geth --datadir ./peer2DataDir --networkid 9988 --port 30306 console 2>> eth_node_2.log

Una vez hecho esto, debemos ir as la consola del primer nodo para sacar la información necesaria:

> admin.nodeInfo.enode

La salida deberia ser algo parecido a esto:

'enode://dcd6834abnds11ggaffdas6d9dcb14eeb1d1b7575b0653fa1025ad1b7722c6tregerdt652d0449f0966e97931bdf037edadas55 42086e7b9ee15@[::]:30303'

Para agregar este primer nodo al segundo y al tercer nodo respectivamente, nos tenemos que conectar a las respectivas consolas de Geth de los nodos y realizar la siguiente operación:

> admin.addPeer("enode://dcd6834abnds11ggaffdas6d9dcb14eeb1d1b7575b0653fa1025ad1b7722c6tregerdt652d0449f0 966e97931bdf037edadas5542086e7b9ee15@[::]:30303")

Mineros

Para realizar la operación de minado basta con conectase a cualquier consola de los nodos y escribir el siguiente comando:

> miner.start()

Y para parar de minar:

> miner.stop()

Podemos comprobar en cualquier momento el balance de nuestra cuenta:

> eth.getBalance(eth.accounts[0])

Conclusiones

Para finalizar el artículo me gustaría hacer hincapié en la relativa facilidad que supone montar una red privada de Ethereum. El potencial que este tipo de redes puede tener en un futuro a corto y medio plazo es asombroso.

Os animo a que intenteis montar vuestras propias redes privadas de Ethereum para que podais comprender de primera mano como funciona una red de estilo, ya que no es difícil y si que es muy interesante.

Un saludo.