Observando transacciones en Meter con Ethers

En este tutorial vamos a utilizar la librería ethers.js para interactuar directamente con la blockchain de Meter. Crearemos un script con el que podremos observar una serie de direcciones y en caso de recibir MTR lo guardaremos en la base de datos level DB y los mostraremos por consola.

Crearemos un proyecto nuevo, seleccionando las opciones por defecto, con el siguiente comando.

npm init

Instalaremos una versión específica de ethers.js ya que la versión más reciente contiene muchos cambios que aún no hemos estudiado.

Si preferís editar a mano la versión de ethers.js lo podéis hacer editando el fichero package.json. Recordad que hay que eliminar la carpeta node_modules.

"ethers": "^5.7.2",
npm install ethers@5.7.2
npm install level

En este tutorial necesitaremos usar direcciones reales en la blockchain de Meter. Con el siguiente script podremos generar de manera sencilla y rápida tantas direcciones como queramos.

const ethers = require('ethers');
const main = () => {
    const wallet = ethers.Wallet.createRandom();
    console.log({
        node_address: wallet.address,
        node_secret: wallet.privateKey,
    });
};
main();

Ejecutamos el script y nos debería devolver algo similar a esto.

node crearDirecciones.js 
{
  node_address: '0x30C33fb80081FC25EbEeBf69B82b7eCb1d0BCfEe',
  node_secret: '0xb993a438ba84c3609fa531fd5a1b4b54cd86fdac083c573ae6c24a4e4201f4cd'
}

Ya solo nos queda crear el script main.js con el cual interactuaremos con el RPC de Meter para leer los bloques y revisar si alguna de las direcciones que estamos observando han recibido fondos.

const { ethers } = require('ethers');
const { Level } = require('level');
const watch = [
  '0x30C33fb80081FC25EbEeBf69B82b7eCb1d0BCfEe',
  '0xb647f1778003f4Aeed9F36E1344E234fA110CE75'
].map(address => ethers.utils.getAddress(address));

const main = async () => {
  const db = new Level('db', { valueEncoding: 'json' });
  const provider = new ethers.providers.JsonRpcProvider('https://rpctest.meter.io/'); 

  provider.on('block', async (newBlockNumber) => {
    const { transactions } = await provider.getBlockWithTransactions(newBlockNumber);
    for (const transaction of transactions) {
      const from = ethers.utils.getAddress(transaction.from);
      const to = ethers.utils.getAddress(transaction.to);

      if (!watch.includes(from) && !watch.includes(to)) {
        continue;
      }

      const value = transaction.value.toString();

      await db.put(`tx-${transaction.hash}`, {
        from,
        to,
        value
      });
      //console.log(`Escaneando nuevo bloque #${newBlockNumber}...`);
      console.info(`Bloque #${newBlockNumber} - guardada tx ${transaction.hash}, de: ${from}, a: ${to}, valor: ${value}`);
    }
  });
};

main();

Ejecutamos el script y enviamos una pequeña cantidad de MTR a ambas direcciones.

node main.js
Bloque #32280358 - guardada tx 0x614e06ce36720ad324eb2079407b0dcb4453cc1818b22c88afa94eadadcaa37c, de: 0x4a179A005DCBE770C6970EE390a43d2284f67527, a: 0x30C33fb80081FC25EbEeBf69B82b7eCb1d0BCfEe, valor: 10000000000000000
Bloque #32280375 - guardada tx 0x993a27b51605e0c2a9753872dcb2fb670a35785052b87cd45e6e89e08676122a, de: 0x4a179A005DCBE770C6970EE390a43d2284f67527, a: 0xb647f1778003f4Aeed9F36E1344E234fA110CE75, valor: 20000000000000000

Como vemos, en menos de dos segundos, el script ha detectado que en los bloques nuevos han entrado transacciones en las dos direcciones que hemos indicado que debe observar.

Este script puede ser útil para muchas aplicaciones como podría ser un exchange, donde notificamos al usuario que han llegado los fondos, pagos en juegos para indicarle al usuario que ha ganado X cantidad de MTR, etc.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *