GovInWeb3

Ethereum Clients: A Detailed Guide on Options and Features

En el universo de Ethereum, los clientes son herramientas escenciales para interactuar con la blockchain. Estos clientes, que son piezas de software diseñadas para conectarse y operar entre sí, ofrecen una variedad de características y funcionalidades que satisfacen las necesidades de diferentes usuarios y aplicaciones.

En este artículo, exploraremos exhaustivamente los diversos clientes de Ethereum disponibles en el mercado actual, con el objetivo de proporcionar una visión detallada de sus características, opciones y usos prácticos en el contexto del desarrollo de aplicaciones descentralizadas, la validación de transacciones y la participación en la red Ethereum.

¿Qué es un Cliente?

Un cliente es una implementación de Ethereum que verifica los datos con las reglas del protocolo y mantiene la red segura. Un nodo tiene que ejecutar dos clientes: un cliente de consenso y un cliente de ejecución.

Recordemos que es un nodo: Un "nodo" es cualquier instancia del software cliente de Ethereum que está conectada a otras computadoras que también ejecutan el software Ethereum, formando una red.

Los clientes facilitan la validación de transacciones, la ejecución de contratos inteligentes y la comunicación con otros nodos en la red, lo que es fundamental para mantener la integridad y la seguridad de la red Ethereum en su conjunto.

Los diferentes clientes de Ethereum

En la actualidad, existen varios clientes de Ethereum desarrollados por diferentes equipos y organizaciones. Algunos de los clientes más populares incluyen:

Geth

Geth (go-ethereum) es una implementación de Go en Ethereum. Fue una de las implementaciones originales de Ethereum, lo que lo convierte en el cliente más probado y experimentado.

Docs

Geth se controla principalmente mediante la línea de comandos. Se inicia Geth utilizando el comando geth. Se detiene presionando ctrl+c.

Podes configurar Geth utilizando opciones de línea de comandos (también conocidas como flags). Geth también tiene subcomandos, que se pueden utilizar para invocar funcionalidades como la consola o la importación/exportación de la blockchain.

Comandos

Para poder ver la lista de comandos en cualquier momento desde tu propia instancia de Geth ejecutamos:

geth --help

Como la lista de comandos es MUY extensa, vamos a describir un poco la estructura de las opciones que nos deja ejecturar geth:

Primero el uso es el siguiente:

 geth [global options] command [command options] [arguments...]

Tenemos muchisimas opciones, estos son solo algunos reelevantes:

  • account: Gestiona cuentas
  • dumpconfig: Exporta valores de configuración en formato TOML
  • export: Exporta la blockchain a un archivo
  • import: Importa un archivo de blockchain
  • removedb: Elimina la blockchain y las bases de datos de estado
  • snapshot: Conjunto de comandos basados en el snapshot
  • version: Muestra los números de versión
  • wallet: Gestiona las billeteras de precompra de Ethereum

Ademas de estos, geth nos brinda Opciones Globales muy utiles que se estructuran de la siguiente forma:

  • Log Rotate:
    • -log.rotate: Habilita la rotación de archivos de registro.
  • Account:
    • Varias opciones relacionadas con la gestión de cuentas, como desbloqueo seguro, directorio de keystore, configuraciones de seguridad, etc.
  • Aliased (Deprecated):
    • Configuraciones obsoletas que aún se pueden usar, pero se recomienda utilizar alternativas más actualizadas.
  • API and Console:
    • Configuraciones relacionadas con la activación y personalización de la API HTTP-RPC y la consola interactiva.
  • Developer Chain:
    • Opciones para configurar una red de prueba de autoridad de prueba con cuenta de desarrollador prefinanciada y minería habilitada.
  • Ethereum:
    • Configuraciones generales de red, como la cadena de bloques a utilizar, directorio de datos, configuraciones de red, etc.
  • Gas Price Oracle:
    • Configuraciones relacionadas con el oráculo de precios de gas y las recomendaciones de tarifas de transacción.
  • Light Client:
    • Opciones para configurar y gestionar clientes ligeros en la red Ethereum.
  • Logging and Debugging:
    • Configuraciones para el registro y depuración del nodo, como nivel de verbosidad, formato de registro, etc.
  • Metrics and Stats:
    • Opciones para habilitar la recolección de métricas y estadísticas del nodo.
  • Miner:
    • Configuraciones relacionadas con la minería, como dirección de recompensa, límites de gas, etc.
  • Misc:
    • Otras configuraciones diversas, como la visualización de ayuda, impresión de versión, etc.
  • Networking:
    • Configuraciones de red, como nodos de arranque, descubrimiento de pares, límites de conexión, etc.
  • Performance Tuning:
    • Ajustes para optimizar el rendimiento del nodo, como el uso de memoria caché, límites de recursos, etc.
  • State History Management:
    • Configuraciones relacionadas con la gestión del historial de estado de la blockchain.
  • Transaction Pool (Blob):
    • Configuraciones específicas para el pool de transacciones blob.
  • Transaction Pool (EVM):
    • Configuraciones específicas para el pool de transacciones EVM.
  • Virtual Machine:
    • Opciones de depuración y seguimiento para la máquina virtual y contratos inteligentes.

Tools

Tambien dentro del mundo de Geth nos encontramos con varias herramientas que pueden ser de nuestro interes:

Clef

Clef es una herramienta para firmar transacciones y datos de manera segura en un entorno local. Permite gestionar claves de forma independiente a Geth, lo que brinda flexibilidad y seguridad al proceso de firma. Puede utilizarse de manera autónoma o integrarse con Geth, siendo útil para situaciones donde se accede a Ethereum a través de nodos remotos no confiables.

Abigen

Abigen es una herramienta que facilita la interacción con Ethereum utilizando Go. Genera paquetes Go type-safe a partir de definiciones de smart contracts conocidas como ABIs.

Un ABI es un archivo JSON que especifica cómo codificar y decodificar datos enviados y recibidos por un smart contract. Abigen simplifica la implementación e interacción con smart contracts en aplicaciones Go al abstraer la complejidad de la codificación y decodificación de datos.

Nethermind

Este es un cliente de Ethereum desarrollado en C#/.NET, que destaca por su eficiencia y su enfoque en el desarrollo empresarial y la interoperabilidad.

Sedge

Sedge es una herramienta de configuración de nodos con “un solo clic” para validadores y nodos de redes/cadenas de Proof of Stake, escrita completamente en el lenguaje de programación Go. Sedge se encarga de toda la configuración del nodo completo localmente, basándose en el cliente elegido y utilizando scripts docker-compose generados según la configuración deseada, está actualmente disponible solo para Linux, macOS y Windows, para arquitecturas amd64 y arm64.

Una vez que uses sedge cli o sedge generate para generar el archivo docker-compose.yml, podrás manejarlo por tu cuenta. Esta guía te mostrará cómo hacerlo.

Existen varias razones por las que necesitarías gestionar la configuración después de usar Sedge para generar los archivos de configuración. Puede que desees modificar el archivo .env o docker-compose.yml para cambiar la configuración de la instalación, o simplemente copiar estos archivos a otra máquina. Actualmente, Sedge ejecuta el stack de docker compose que fue generado usando sedge run. Puedes usar sedge logs y sedge down en cualquier docker-compose.yml.

Podes señalar hacia una ruta (path) generación diferente utilizando la opción --path . Esto es útil si deseas generar los archivos en un directorio distinto, o si quieres generar múltiples configuraciones.

  • Sedge logs: Ejecutar sedge logs obtendrá los registros de contenedores en ejecución utilizando la CLI de docker compose.

Ejecutar sedge logs obtendrá los registros de contenedores en ejecución utilizando la CLI de docker compose.

 $ sedge logs -h
Initializing configuration
Get running container logs using docker-compose CLI. If no services are provided, the logs of all running services will be displayed.

    By default will run 'docker compose -f <script> logs --follow <service>'

Usage:
  sedge logs [flags] [services]

Flags:
  -h, --help          help for logs
  -p, --path string   docker-compose script path (default "./docker-compose-scripts")
  -t, --tail int      Tail the number of desired logs. If not set, or set to 0, logs are followed.

Global Flags:
      --logLevel string   Set Log Level (default "info")
      
  • Sedge down:

Ejecutar sedge down detendrá y eliminará los contenedores utilizando la CLI de Docker Compose.

 $ sedge down -h
Shutdown sedge running containers using docker compose CLI. Shortcut for 'docker compose -f <script> down'

Usage:
  sedge down [flags]

Flags:
  -h, --help          help for down
  -p, --path string   docker-compose script path (default "./docker-compose-scripts")

Global Flags:
      --logLevel string   Set Log Level (default "info")

Ejemplo:

La ejecución de sedge down cerrará y eliminará todos los contenedores y redes abiertas utilizadas por Sedge.

 $ sedge down
2022-00-00 00:00:00 -- [INFO] [Logger Init] Log level: info
2022-00-00 00:00:00 -- [INFO] You are running the latest version of sedge. Version:  v1.3.2
[sudo] password for maceo:
[+] Running 7/7
 ⠿ Container execution-client                            Removed                                                                 93.8s
 ⠿ Container validator-client                            Removed                                                                  0.0s
 ⠿ Container consensus-client                            Removed                                                                  3.8s
 ⠿ Container validator-import-client                     Removed                                                                  0.0s
 ⠿ Network docker-compose-scripts_default                Removed                                                                  0.2s
 ⠿ Network sedge_network                                 Removed                                                                  0.1s

Prender el setup

Una vez generado el archivo docker-compose, puedes modificar tanto las variables de entorno en el archivo .env como el docker-compose.yml bajo el directorio sedge-data.

Después de eso, puedes ejecutar el siguiente comando para iniciar la configuración desde el directorio sedge-data:

docker compose up -d

Apagar el setup

Para detener la configuración, puedes ejecutar el siguiente comando desde el directorio sedge-data:

O bien, puedes ejecutar el siguiente comando desde cualquier directorio, asumiendo que tienes la ruta al directorio sedge-data (llamémoslo <path>):

 docker compose -f <path> down 

Verificar los registros del contenedor

El compose stack está compuesto por varios contenedores de Docker en ejecución.

La configuración para un nodo completo de Ethereum que Sedge aplica consiste en un contenedor para cada nodo (nodo de ejecución, nodo de consenso y nodo validador). Puedes ejecutar el siguiente comando para verificar los registros de un contenedor/nodo específico desde el directorio sedge-data:

 docker compose logs <node> 

Reemplace <node> con el tipo de nodo, por ejemplo: ejecución, consenso, validador

O bien, puedes ejecutar el siguiente comando desde cualquier directorio, asumiendo que tienes la ruta al directorio sedge-data (llamémoslo <path>):

docker compose -f <path> logs <node>

Para salir del comando docker compose logs presiona ctrl+c o control+c

(Otros comandos: Acá )

Erigon

Erigon es una implementación eficiente y optimizada de Ethereum, diseñada para ser más rápida y modular.

Utiliza tecnologías avanzadas como la sincronización escalonada y el almacenamiento de estado eficiente. Es un archieve node por defecto y ha sido reescrito completamente para enfocarse en velocidad y ahorro de almacenamiento.

Puede completar la sincronización de un archive node en menos de tres días y con menos de 2 TB de almacenamiento.

Opciones

Docs

En cuanto a lo que podemos hacer con Erigon es similar a los demás clientes, la forma de acceder a los mandos es utilizando la flag ./build/bin/erigon --help donde el uso de estos comandos es el siguiente:

erigon [command] [flags]

Con 5 comandos principales:

  • init : Inicializa y arranca un nuevo bloque génesis
  • import : Importa un archivo de cadena de bloques
  • snapshots : Gestiona instantáneas (particiones de datos históricos)
  • support : Conecta una instancia de Erigon a un sistema de diagnóstico para soporte
  • help, h: Muestra una lista de comandos o ayuda para un comando

Como las flags son un monton, aca dejamos algunas reelevantes:

    • --datadir value: Especifica el directorio de datos para las bases de datos.
    • --ethash.dagdir value: Establece el directorio para almacenar los DAGs de minería ethash.
    • --internalcl: Activa el consenso interno.
    • --txpool.disable: Deshabilita la funcionalidad interna de txpool y el productor de bloques.
    • --prune value: Configura qué datos antiguos eliminar de la base de datos.
    • --http: Habilita el servidor JSON-RPC HTTP.
    • --http.port value: Especifica el puerto en el que el servidor HTTP-RPC escucha las solicitudes.
    • --ws: Habilita el servidor WS-RPC.
    • --graphql: Habilita el endpoint de GraphQL.
    • --db.pagesize value: Establece el tamaño de página para la base de datos.

Otterscan

Otterscan es un explorador de bloques de Ethereum diseñado para ser ejecutado localmente junto con Erigon.

Basado completamente en código fuente abierto (open source code), es extremadamente rápido y totalmente privado, ya que funciona en tu máquina local. La interfaz de usuario es intencionalmente muy similar, pero con muchas mejoras, al explorador de bloques de Ethereum más popular para facilitar la ubicación de la información.

Para instalar Otterscan, sigue las instrucciones en el repositorio oficial de Github: Docs

Conclusión

La elección del cliente de Ethereum dependerá en gran medida de las necesidades y objetivos específicos de cada usuario o proyecto. Es recomendable evaluar las características y capacidades de cada cliente para seleccionar la opción más adecuada según los requisitos de rendimiento, seguridad, facilidad de uso y funcionalidades específicas requeridas. Pero lo mas importante de todo es PROBAR estos clientes y ver que es lo ideal para nosotros.