Ethers.js
Last updated
Was this helpful?
Last updated
Was this helpful?
Ya vimos cómo es posible interactuar con Ethereum utilizando JSON-RPC. Sin embargo, existen librerías que facilitan esta interacción pues permiten incluir llamadas directamente dentro del código de las aplicaciones con instrucciones que utilizan JSON-RPC por detrás.
Una de las librerías más conocidas es ether.js que está escrita en JavaScript. Así como ésta existen otras en JavaScript (Web3.js) y otros lenguajes como Python (Web3py).
En nuestro caso, utilizaremos ether.js pues es la más usada actualmente.
Veamos cómo empezar a utilizar ethers.js. Recuerda que dado que ejecutaremos código JavaScript necesitamos tener instalado node.js y npm (ver prerrequisitos de este módulo).
Ubícate en el repositorio de tu proyecto antes de empezar la instalación.
Instalar ethers.js
:
Asegúrate de que se hayan creado en tu directorio los componentes asociados a la instalación:
Un directorio node_modules/
que contiene todos los módulos instalados, incluida la carpeta ethers
.
Un archivo package-lock.json
que describe las versiones exactas de las dependencias instaladas.
Tu archivo package.json
debería contener ethers
en la sección de dependencias.
Obtén una URL de acceso a Ethereum de un proveedor de servicios de acceso a nodos:
En nuestro caso utilizaremos Alchemy. Utiliza la URL que obtuviste en la sección anterior que tiene la siguiente estructura: “.
Escribir un script para conectarse y hacer llamadas JSON-RPC:
Crea un archivo index.js
en VS Code y añade el siguiente código:
En este primer script obtuvimos el número del último bloque creado en Ethereum.
Detallemos la estructura de este script:
Importamos la librería ethers.js
Definimos que nos conectaremos vía HTTPS con un proveedor de servicio de nodos como Alchemy y especificamos la URL para la conexión.
Creamos un nuevo JsonRpcProvider
utilizando la URL de Alchemy. Un provider o proveedor en ethers.js es un objeto que se conecta a un nodo de Ethereum y permite realizar diversas llamadas a la blockchain, como obtener el número de bloque actual, enviar transacciones, etc.
Definimos una función asíncrona que llamamos getBlockNumber
. Dentro de la función usamos await provider.getBlockNumber()
para obtener el número de bloque actual de la blockchain. La palabra clave await
hace que la función espere a que la promesa se resuelva y devuelve el resultado. Si la llamada tiene éxito, el número de bloque se imprime en la consola. Si hay un error durante la llamada, se captura en el bloque catch
y se imprime un mensaje de error en la consola.
Ejecutamos la función getBlockNumber
<aside> ⚠️ Este script usa la versión 6 de ethers.js. Si utilizas una versión anterior es muy probable que obtengas un error.
</aside>
Ejecutar el Script:
Escribir un script para obtener el saldo de una cuenta:
Ejecuta este código utilizando node.js para obtener el saldo de una cuenta.
<aside> 👨🏻💻 Reto: Utilizando este código, modifica el address para obtener el saldo de la cuenta pública de Vitalik.
</aside>
Cuando tengamos que hacer una llamada a la blockchain que involucre realizar una escritura, será necesario que firmemos las transacciones y para ello se requiere utilizar la clave privada de nuestra wallet. No podemos exponer a la vista de todos nuestra clave privada, o en general cualquier información sensible. ¿Cuál es la solución? Utilizar una combinación de un archivo .env (se lee “dot i-en-vi”) y un archivo gitignore.
Un .env es un archivo de texto que contiene pares clave-valor, donde cada par representa una variable de entorno. Estos archivos se utilizan para configurar aplicaciones de manera que la configuración específica del entorno (por ejemplo, desarrollo, prueba, producción) pueda mantenerse fuera del código fuente y cargarse dinámicamente según sea necesario.
Seguridad: Mantener claves API y otras credenciales fuera del código fuente ayuda a prevenir su exposición accidental.
Flexibilidad: Permite cambiar configuraciones fácilmente sin modificar el código.
Portabilidad: Facilita la configuración del entorno en diferentes máquinas y entornos (desarrollo, pruebas, producción).
Primero, necesitas instalar la biblioteca dotenv
, que carga las variables de entorno desde un archivo .env
en process.env
.
En la raíz de tu proyecto, crea un archivo llamado .env
. Este archivo contendrá tus variables de entorno. Por ejemplo:
En tu archivo principal de JavaScript (por ejemplo, index.js
), carga las variables de entorno usando dotenv
y sentencias del tipo process.env.VARIABLE_NAME
para incorporar los valores de las variables del archivo .env
a tu aplicación.
Puedes utilizar estas variables de entorno en tu aplicación. Por ejemplo, nuestro script para obtener el número de bloque actual utilizando un archivo .env
sería el siguiente:
Asegúrate de añadir tu archivo .env
al archivo .gitignore
para que no se suba a tu repositorio de Git y tus credenciales no se expongan accidentalmente.
Y la estructura de tu repositorio debería ser similar a esta:
Con estos pasos, tu aplicación puede usar variables de entorno definidas en un archivo .env
, manteniendo la configuración flexible y segura.
Ahora veamos cómo debemos hacer para ejecutar una transacción que implica un cambio en la blockchain.
En este ejemplo haremos la transferencia de ETH de una cuenta a otra dentro de la red de Sepolia, para ello necesitamos contar con lo siguiente:
La clave privada de la wallet de origen de los fondos.
La dirección de destino de los fondos.
Incluir los datos de la URL de acceso y clave privada en el fichero .env.
Creación de un proveedor
Obtener el número de bloque actual
Obtener el saldo de una dirección
Obtener información de un bloque
Obtener el historial de transacciones de una dirección
Obtener el precio del gas
Obtener una transacción
Obtener el estado de una transacción
Crear una billetera aleatoria
Cargar una billetera desde una clave privada
Conectar una billetera a un proveedor
Firmar un mensaje
Enviar una transacción
Convertir Ether a Wei
Convertir Wei a Ether
Calcular el hash de un mensaje
Obtener la dirección de un contrato a partir de su bytecode
Conectar a un contrato
Llamar a una función de solo lectura
Enviar una transacción a una función de escritura
Escuchar eventos de un contrato
Una URL de acceso a Sepolia del tipo: (debes obtenerla de forma similar a la de mainnet en un servicio como Alchemy).