Ejecutando un Nodo Ethereum/RSK

Published on Author lopez

La testnet pública de RSK fue lanzada, y el código principal fue abierto. Si no conoce a RSK, visitar:

http://rsk.co/

Técnicamente, es un fork de Ethereum, de la versión Java, con un 2-way peg contra Bitcoin, y con capacidades de merge-mining. Pueden correr su propio nodo, en solitario, o en su propia red, o pueden ejecutar nodos uniéndose a la testnet pública. Hay instrucciones de como hacerlo en el wiki del proyecto:

https://github.com/rsksmart/rskj/wiki

En este post, quiero describir mi flujo de trabajo para compilar, configurar y ejecutar un nodo, pudiendo así hacer experimentos, probar ideas de implementación distintas (nota: actualmente soy miembro del equipo de desarrollo de RSK, pero esta descripción en este posts, es una descripción personal de lo que uso). Primero, bajarse el código fuente de:

https://github.com/rsksmart/rskj

Actualmente, la versión que se usa en testnet, está en el branch Ginger:

https://github.com/rsksmart/rskj/tree/ginger

También pueden clonarse el repositorio y modificarlo en el suyo propio. Para compilar, se puede usar el IntelliJ Idea Community edition, o usar el comando de línea:

.\gradlew build shadow -x testnet

(usualmente trabajo con Windows; en Linux, Max, cambiar la barra invertida por la barra normal /). Más detalles en:

https://github.com/rsksmart/rskj/wiki/Compile-and-run-a-RSK-node-locally

La opción shadow es para armar un archivo jar que tenga todas las dependencias. La opción –x test permite saltear la ejecución de los tests durante la tarea de build. El comando genera un archivo jar en un subdirectorio. Ejecutar:


cd rskj-core\build\libs
java -Drsk.conf.file=<path> -cp rskj-core-0.2.0-GINGER-all.jar co.rsk.Start

Eso lanza al nodo. ¿Cuál es el archivo de configuración a usar? Más info en:

https://github.com/rsksmart/rskj/wiki/How-to-initialize-RSK-node-configuration-file-settings

Hay un archivo de configuración de ejemplo en:

https://github.com/rsksmart/rskj/blob/master/rskj-core/src/main/resources/config/rsk-sample.conf

Una de las cosas que hay que hacer, es que cada instancia de nodo que queremos lanzar tenga su id de nodo. Para generar el id de nodo y una clave privada asociada, ejecutar primero el comando de línea:


java -cp rskj-core-0.2.0-GINGER-all.jar co.rsk.GenNodeKeyId

Vuelva un JSON en consola. Hay que copiar de los datos que vuelta, la clave privada en el archivo de configuración, y opcionalmente, el id de nodo:


# Private key of the peer
nodeId = 66cf57...
privateKey = 46f850...

Sólo es mandatorio el privateKey para ejecutar el nodo, pero puede copiar el id de nodo para mantener una referencia. La otra línea a definir es el llamado secreto coinbase:


# this string is computed
# to be eventually the address
# that get the miner reward
coinbase.secret = mytreasure

Puede poner una palabra arbitraria.

Para permitir el CORS (Cross-Origin Resource Sharing) para exponer el estado del nodo por JSON RPC (Remote Procedure Call), hay que modificar la propiedad cors:


rpc {
enabled = true # you can disable rpc
port = 4444

cors = "*.rsk.co" # you can put "localhost here"

La capacidad de RPC es solamente usada para consultar al nodo, y enviar transferencias desde un cliente, pero desabilitarla no interfiere con el proceso normal del nodo. ¿Cómo hacemos que el nodo se conecte a la red testnet pública? Hay definidos nodos de bootstrap:


peer {
discovery = {
# if peer discovery is off
# the peer window will show
# only what retrieved by active
# peer [true/false]
enabled = true
# List of the peers to start
# the search of the online peers
# values: [ip:port]
ip.list = [
"bootstrap01.testnet.rsk.co:50505",
"bootstrap02.testnet.rsk.co:50505",
"bootstrap03.testnet.rsk.co:50505",
"bootstrap04.testnet.rsk.co:50505"
]

para usar como puntos de partida en lo que se llama el proceso de descubrimiento de pares, peer discovery. Se puede desabilitar, por ejemplo, si quiere usar el nodo para su propia red, o quiere poner en otro lugar de la configuración (ver más abajo) a qué nodos explícitos quiere conectarse al principio.

Si quiere ejecutar VARIOS nodos locales, debe tener entonces VARIOS archivos de configuración. En estos archivos, ajustar las propiedas siguientes, para que los nodos no se pisen entre sí:

# Peer for server to listen for incoming connections
# 50505 for testnet
listen.port = 50505 # ie to 50506

y también la ya mencionada:


rpc {
enabled = true
port = 4444 # ie to 4445

También, cambiar el directorio de database, donde cada nodo graba los bloques, el estado, etc, sus datos de funcionamiento en archivos. Adicionalmente, pueden poner su propio id de red, para que sus nodos sólo se entiendan entre ellos:


# Network id
networkId = 777 # ie to 42

También puede especificar directamente a qué nodos conectarse. Debe conocer entonces la IP o nombre de máquina, el port del otro nodo, y el id: el otro nodo no aceptará conexiones de quien no conozca su id de nodo:


# Boot node list
# Use to connect to specific nodes
active = [
#{
# ip = 11.22.33.44
# port = 50505
# nodeId = e437a483...
#}
]

En el ejemplo, la propiedad ip está puesta con números, pero puede ponerse el nombre de máquina directamente.

Si quieren que su nodo mine bloques, pueden cambiar estas propiedades a verdadero:


# miner options
miner {
server.enabled = false # change to true
client.enabled = false # change to true

Si sólo cambia la propiedad server.enabled a verdadero, dejando client.enabled en false, podrá minar apoyándose en merge mining con software y hardware de minería, pero esa característica está más allá del alcance de este post.

¿Alguna duda? Siempre pueden visitar, preguntar o comentar en el canal de gitter de RSK Java:

https://gitter.im/rsksmart/rskj

Interesados? RSK busca desarrolladores, ver los tweets:

https://twitter.com/RSKsmart/status/872169805515718657


Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez