Ethers.js
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.
Hacer llamadas JSON-RPC usando ether.js
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 carpetaethers
.Un archivo
package-lock.json
que describe las versiones exactas de las dependencias instaladas.Tu archivo
package.json
debería contenerethers
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: “https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_PROJECT_ID”.
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 usamosawait provider.getBlockNumber()
para obtener el número de bloque actual de la blockchain. La palabra claveawait
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 bloquecatch
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>
El archivo .env
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.
¿Por qué utilizar un archivo .env?
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).
Pasos para utilizar un archivo .env en un programa JavaScript
1. Instalar dotenv
Primero, necesitas instalar la biblioteca dotenv
, que carga las variables de entorno desde un archivo .env
en process.env
.
2. Crear un archivo .env
En la raíz de tu proyecto, crea un archivo llamado .env
. Este archivo contendrá tus variables de entorno. Por ejemplo:
3. Cargar variables de entorno en tu aplicación
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.
4. Utilizar las variables de entorno en tu código
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:
5. Usar un archivo .gitignore
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.
Hacer una llamada de escritura en Sepolia
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:
Una URL de acceso a Sepolia del tipo: https://eth-sepolia.g.alchemy.com/v2/TU_ACCESO (debes obtenerla de forma similar a la de mainnet en un servicio como Alchemy).
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.
Llamadas más usadas en ethers.js
Proveedores (providers)
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
Wallets
Crear una billetera aleatoria
Cargar una billetera desde una clave privada
Conectar una billetera a un proveedor
Firmar un mensaje
Enviar una transacción
Utilidades
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
Contratos
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
Last updated