Cómo sincronizar un nodo Ethereum sin cometer los errores que cometí

Cuando comencé a desarrollar en la plataforma Ethereum, sincronizar un nodo fue una de las primeras cosas que hice. Sin nadie que me tomara de la mano y sin ningún lugar donde consolidar todos los errores comunes que encontré, perdí semanas sincronizando un nodo. Fue un dolor de cabeza tal que casi me rindo.

No saber la terminología solo lo hizo más difícil.

Entonces, en este artículo, quiero consolidar todos los errores comunes que puede enfrentar y explicar las razones detrás de cada paso al sincronizar un nodo. Con suerte, no tendrás una experiencia tan desagradable como la que tuve yo.

Una introducción rápida

En Ethereum, los desarrolladores crean partes de una aplicación que se ejecuta en la red. Estos se denominan contratos inteligentes . Aunque puede implementarlos manualmente sin sincronizarlos con un nodo Ethereum, a largo plazo es más conveniente que el proceso de desarrollo se sincronice (especialmente cuando queremos usar marcos de desarrollo como Truffle).

Para sincronizar un nodo Ethereum, necesitaremos el siguiente software:

  • Geth: cliente para un nodo Ethereum.
  • Ethereum Wallet: interfaz de usuario para un nodo Ethereum.

Empecemos.

Instalar Geth

Para descargar Geth, vaya aquí para usuarios de Windows. Luego haga clic en el botón "Geth para Windows".

Para los usuarios de MacOS, les recomiendo que descarguen usando homebrew. Puede hacerlo con los siguientes comandos:

brew tap ethereum/ethereumbrew install ethereum

Consulte las instrucciones de Geth para obtener más detalles.

Compruebe que Geth esté instalado correctamente escribiendo geth versionen la terminal (MacOS) o PowerShell (Windows).

Instalar Ethereum Wallet

A la GUI que interactúa con la red la llamamos "billetera". Puede encontrar muchas carteras diferentes para Ethereum con una búsqueda rápida en Google (como Parity, Jaxx y MyEtherWallet). Personalmente, me gusta usar Ethereum Wallet. Tiene una interfaz fácil de usar, y también estoy un poco sesgado porque está desarrollado por Ethereum.

Puede encontrar el instalador aquí.

Nota: prefiero Ethereum Wallet a Mist . Mist es básicamente un navegador que procesa aplicaciones descentralizadas (dApps) y sitios web.

Para el desarrollo de un contrato inteligente, solo necesitaremos Ethereum Wallet.

Mainnet vs Testnet

En Ethereum, hay dos redes principales: mainnet y testnet.

La red principal se utiliza para realizar transacciones con Ether real. El valor del Ether está vinculado a la moneda fiduciaria real a través de intercambios de criptomonedas.

Como desarrolladores, no queremos ejecutar pruebas de aplicaciones con dinero real. Para eso está la red de prueba.

Llamamos testnet Ropsten .

Ejecute Geth y Ethereum Wallet

Cuando desarrolle un contrato inteligente, primero debe sincronizar la red de prueba. Solo necesitaremos sincronizar la red principal cuando estemos listos para implementar.

Necesitará aproximadamente 30 GB de espacio de almacenamiento para sincronizar una red de prueba. Como hay más transacciones en la red principal, necesitará alrededor de 100 GB para sincronizar una red principal.

Nota: algunos dicen que necesita un almacenamiento SSD para una escritura rápida para que la sincronización pueda ponerse al día con el último bloque. Personalmente, encuentro que el almacenamiento en disco duro está bien. Sin embargo, si tuviera la opción, definitivamente usaría almacenamiento SSD.

Para usuarios de Windows

Para facilitar el acceso, le recomiendo que cree una carpeta para almacenar la cadena de bloques. Por ejemplo, "C: \ EthereumTestnet".

Después de crear la carpeta, intente ejecutar el siguiente comando:

geth — testnet — data-dir=”C:\EthereumTestnet” — rpc — rpcapi eth,web3,net,personal

Editar: Parece que algunos argumentos han cambiado. Si encuentra el error "indicador proporcionado pero no definido: -data-dir", intente cambiar el nombre del argumento a - datadir en lugar de a data-dir.

El argumento --testnetespecifica que queremos sincronizarnos con la red Ropsten. Por lo tanto, para sincronizar la red principal, solo necesita eliminar el argumento --testnety cambiar el directorio de datos. Por ejemplo:

geth — data-dir=”C:\EthereumMainnet” — rpc — rpcapi eth,web3,net,personal

El --rpcargumento habilita el servidor HTTP-RPC. Esto nos permite utilizar ciertos servicios, como lo que se indica en --rpcapi eth,web3,net,personal.

Después de ingresar el comando, debería ver algo como esto:

Para no dañar la cadena de bloques, especialmente después de muchas horas de sincronización, NO debe cerrar el símbolo del sistema de forma abrupta. Detenga siempre la sincronización presionando Ctrl + C y espere hasta que Geth cierre el programa por usted.

Sin embargo, es difícil recordar todos los servicios de comando y rpc que necesita. Es por eso que sugiero crear un acceso directo o un archivo por lotes para ayudarlo.

Simplemente cree un archivo usando cualquier editor de texto que tenga y guárdelo como archivo .bat . Por ejemplo, RunGethTestnet.bat (el nombre no es importante). Copie y pegue el comando en el archivo y guárdelo. La próxima vez que necesite ejecutar Geth para Ropsten, simplemente haga doble clic en el archivo.

Después de ejecutar Geth, tenemos que ejecutar Ethereum Wallet. Como queremos que la interfaz localice la ubicación exacta donde sincronizamos nuestros archivos usando Geth, lo ejecutamos desde la consola.

Similar a Geth, también guardé un archivo por lotes con un comando de ejemplo, como el que se muestra a continuación:

Tenga en cuenta que su comando puede verse un poco diferente al mío, ya que podría almacenar su aplicación en un directorio diferente.

Alternativamente, puede agregar la aplicación a su ruta.

El argumento --node-datadir="C:\EthereumTestnet"indica dónde almacené mis datos de cadena, que es exactamente el mismo que especifiqué para Geth.

Para usuarios de Mac

Es un poco más simple para MacOS, porque los datos de la cadena se descargan automáticamente a la biblioteca y no se nos ocultan. Por lo tanto, no necesitaremos especificar el directorio de datos.

No obstante, recomiendo crear un archivo de script para facilitar la ejecución de Geth y Ethereum Wallet.

Nota: Geth debe ejecutarse antes que Ethereum Wallet .

La ejecución de Ethereum Wallet solo iniciará automáticamente el proceso de sincronización, ya que ejecutará automáticamente un cliente Geth en segundo plano. Esto es fácil de usar, pero no habilita los servicios RPC que queremos usar. Por lo tanto, queremos asegurarnos de que RPC esté habilitado en nuestra ejecución de Geth y Ethereum Wallet.

Algunas notas

  1. El proceso de sincronización es muy largo y puede tardar de 2 a 3 días. Tenga paciencia y considere dejar su computadora encendida durante la noche.
  2. La velocidad de sincronización depende de la velocidad de Internet, el número de compañeros y la velocidad de escritura de su unidad de almacenamiento.
  3. Como los datos se almacenan en bloques y se vinculan entre sí, la corrupción en un bloque puede corromper toda la cadena de datos. Esto potencialmente puede desperdiciar su esfuerzo en días de espera para que el nodo se sincronice. Por lo tanto, es muy importante apagar su Geth correctamente. En ciertos casos, es posible que desee retroceder. Pero aquí es mejor prevenir que curar.
  4. La barra de progreso de su Ethereum Wallet NO es precisa. Depender de él le dará mucha ansiedad y frustración.
  5. Geth se ejecuta en el puerto 30303 para escucha externa.
  6. El puerto predeterminado que se usa para la comunicación interna, por ejemplo, entre su billetera y Geth, es 8545.

Asegúrese de que su puerto al cliente Geth esté abierto

Es muy importante asegurarse de que la conexión con su cliente Geth no sea limitada. Un gran dolor de cabeza que encontré fue dejar que mi firewall limitara la cantidad de conexiones que podía tener a través del cliente Geth.

Puede detectar este problema observando el recuento de compañeros . Si se mantiene constantemente bajo en aproximadamente 1 a 3 pares (durante al menos media hora), es muy probable que su conexión sea limitada. Un rango saludable está por encima de 5 pares.

Usuarios de MacOS

Cuando ejecute Geth, debería haber una notificación para que permita la conexión. Bueno, por supuesto, haz clic en “Permitir.

Para comprobarlo, vaya a Preferencias del sistema> Sistema y privacidad.

En la pestaña Firewall , haga clic en Opciones de Firewall .

Usuarios de Windows

Para abrir su puerto, vaya a Panel de control> Sistema y seguridad> Firewall de Windows defender.

Haga clic en Configuración avanzada . En el panel lateral, haga clic en Reglas de entrada .

Los puertos de entrada que desea abrir son TCP y UDP 30303. Así que creé una regla para TCP 30303 y otra para UDP 30303.

Es posible que también deba abrir sus puertos de salida para TCP 30303.

Tenga en cuenta que cualquier firewall / antivirus de terceros también puede limitar sus conexiones, así que asegúrese de configurarlo en consecuencia.

Apegarse a Geth

Para recuperar más información sobre su nodo, puede adjuntarlo al cliente Geth y ejecutar comandos con él utilizando los servicios RPC.

Aquí hay una manera simple de verificar su estado de sincronización: adjúntese al cliente ingresando el siguiente comando en una terminal / consola separada.

geth attach //127.0.0.1:8545

Nuevamente, es posible que desee almacenarlo en un archivo por lotes / script para su propia conveniencia.

Después de ejecutar el comando, debería ver algo como esto.

Escriba web3.ethy debería ver mucha información. Para recuperar información específica sobre la sincronización, escriba en su web3.eth.syncinglugar.

Como puede ver, la barra de progreso que se encuentra en la parte superior de Ethereum Wallet es simplemente una comparación entre el bloque más alto y el bloque actual . Como el bloque más alto conocido por su computadora podría no ser el bloque más alto real, la barra de progreso podría no reflejar el progreso real.

De hecho, el bloque más alto y los estados conocidos seguirán aumentando a medida que sincroniza sus nodos.

Algunos puntos finales

Como la tecnología está cambiando rápidamente, utilice siempre la versión estable del cliente y la billetera para evitar tener más dolores de cabeza.

Además, tenga en cuenta que siempre hay una solución para cualquiera de los problemas que enfrenta. Cuando enfrente un problema de sincronización, puede intentar buscar soluciones, ya que probablemente no sea el primero en enfrentar el mismo problema.

Y recuerde siempre que no necesita sincronizar un nodo para desarrollar un contrato inteligente. Hacerlo solo ayuda a facilitar su comprensión del entorno, así como su proceso de desarrollo. Por lo tanto, no se castigue por ello si encuentra problemas tan temprano en el proceso de desarrollo.

Para obtener más artículos de este tipo, sígueme o visite mi sitio: la perspectiva de un desarrollador.