Hola a todos!

En esta oportunidad aprenderemos como es que se envían las transacciones a la red Ethereum mediante programación en Javascript, con NodeJS. En la actualidad mucho se habla del plugin Metamask que crea una instancia que conecta tu navegador con la red Ethereum. Esto está muy bien y funciona de maravilla, sin embargo para algunos casos de uso, no es muy conveniente, pues por ejemplo no podemos realizar el envío de transacciones de manera automática, ya que siempre tendremos que confirmar el envío de la transacción en un cuadro de diálogo. Sin más preámbulo, manos a la obra al código!

Requisitos

  1. Nociones básicas sobre programación.
  2. Un editor de archivos o IDE.
  3. NodeJS instalado en tu computador.
  4. Internet.
  5. Curiosidad y ganas de aprender algo nuevo 😀

Al igual que en el anterior tutorial, nos apoyaremos en la librería Ethers.JS, pero esta vez para firmar la transacciones con nuestra clave privada 😉


La librería Ethers.JS está disponible tanto para el navegador como para el servidor, por lo que podemos invocarla con Javascript Vanilla o con Javascript del lado del servidor: NodeJS

Instalando Ethers.js en NodeJS

Si vas a utilizar NodeJS entonces tendrás que abrir una terminal / consola de comandos e instalar la librería Ethers.JS ejecutando la siguiente instrucción:

Si todo va bien, entonces deberíamos ver algo como esto:

Entonces ya estamos listos para poder importar nuestra preciada librería desde NodeJS 😉 . Abrimos nuestro IDE Favorito y creamos un archivo llamado enviar-ether.js

Lo siguiente que haremos será declarar variables que nos servirán para importar la cuenta Ethereum a partir de nuestra clave privada, además de otras dos líneas: una línea con la que importaremos una función interna de la librería llamada utils que nos ayudará a convertir el monto a enviar en un número comprensible para la red. La otra línea nos conectará a un nodo público de Infura o Etherscan para enviar la transacción y recibir el hash de la transacción.

Crearemos una variable Cartera que contendrá la función Wallet de Ethers.js, la cuál nos retornará un objeto con algunos atributos y métodos:

  • [Variable] privateKey: Tu llave privada.
  • [Variable] provider: El nodo que nos provee la conexión
  • [Variable] defaultGasLimit: El máximo de GAS a gastar en la transacción.
  • [Variable] address: Tu llave pública.
  • [Función] sign: Firmar mensaje con clave privada. 

Declararemos una variable para almacenar nuestra llave privada y otra para llamar a la función Cartera y desbloquear la cuenta Ethereum con nuestra llave privada.

Funciones útiles 

Existen un par de funciones que nunca dejaremos de utilizar con esta librería, éstas son:

  • cartera.estimateGas: Recibe como parámetro el “las características” de tu transacción, o sea un objeto que debe tener al menos los siguientes atributos:
    • gasLimit: Máximo de GAS a utilizar en la transacción.
    • to: Llave pública del destinatario del ETH.
    • value: Monto en ETH a enviar.
  • ethers.utils.parseEther: Recibe como parámetro un String con el monto en ETH que deseas enviar y lo convierte en un número comprensible para la red.

A la fecha (10-08-2018) para enviar una transacción normal a la red se requiere un gasLimit de 21,000 unidades de GAS, sin embargo para ejecutar una función de un Smart Contract esto varía, pues no todas las funciones requieren de la misma complejidad lógica, por lo que nos toca utilizar estimateGas para saber cuánto gastaremos antes de meter la pata!

Sabiendo esto, podemos proceder a armar nuestra transacción:

Nota: Nuestro objeto transacción está “queriendo decir” que: Enviaremos 1.0 ETHER a la Llave Pública 0xcf153b1b35f6e5944e94ed6e96cb7b1537008bbd

Enviando la Transacción a la red

Hasta el momento nuestro código debería lucir así:

Solo nos faltan 2 cosas:

  1. Conectar la cartera al proveedor que seleccionamos (Infura/Etherscan) y a que red enviaremos la transacción (Rinkeby, Main Net, Ropsten). Utilizaremos para este ejemplo Rinkeby.
  2. Enviar la transacción y obtener el hash que nos retorna la red.

Conectándonos a Rinkeby

Conectarnos a la red Rinkeby mediante un proveedor por defecto (Infura/Etherscan) es tan sencillo como añadir la siguiente línea:

Luego “le decimos” a nuestra cartera que utilizaremos ese proveedor y red.

Hay algo que hasta este momento no dije, para no complicar las cosas desde el inicio… Y es que nuestra variable cartera también tiene un método “oculto” en su prototipo llamado sendTransaction que recibe como parámetro nuestro objeto transaccion (sin tilde) y nos retornará una promesa con la cuál podremos rescatar tanto la información de la transacción como cualquier posible error que pudo haber ocurrido.

Finalmente enviamos la transacción

Si todo salió de manera correcta, deberíamos poder ver el hash de nuestra transacción

Transacción minada – Comprobante 

Ahora podemos verificar en Etherscan.io que la transacción fue realizada correctamente: 0x85ccadfd60a1b2b5e02848fdbec1097cfc799cb394f76aa0bdc52e2a3d79abac

Comprobante transacción Ethereum – Rinkeby

Código terminado

Tienes dudas? Déjalas en los comentarios 😀

Saludos, Javier Guajardo!