Demostrando la superioridad de Meter frente a Ethereum.

En este artículo vamos a demostrar como Meter es muy superior a Ethereum. En concreto veremos como Meter es capaz de procesar más transacciones por segundo (TPS) y con un tiempo medio de bloque mucho menor. Meter puede procesar miles de transacciones por segundo frente a las 12 de Ethereum.

El tiempo medio de bloque en Ethereum es de unos 12 segundos, frente a los menos de 2 segundos en Meter. Cada 12 segundos Ethereum es capaz de procesar entre 150 y 200 transacciones mientras que Meter es capaz de procesar miles de transacciones por bloque en menos de 2 segundos.

La rapidez que supone tener un bloque en menos de 2 segundos es una ventaja muy importante de cara a la usabilidad en las dApp que desarrollemos. Pongamos el ejemplo donde un usuario inicia una transacción justo al inicio de un nuevo bloque, en la red de Ethereum el usuario tendrá que esperar a que pasen 12 segundos hasta que Metamask recibe la confirmación del bloque. En Meter este tiempo se reduce a menos de 2 segundos, obteniendo una experiencia mucho más rápida para el usuario.

Otro posible problema con Ethereum es que en momentos de gran carga, la transacción del usuario no entre en el primer bloque y tenga que esperar a ser incluido en el siguiente. Cuando la red de Ethereum está congestionada el gas necesario para ejecutar la transacción aumenta considerablemente. En Meter esto no ocurre, siempre se pagará la misma cantidad de gas.

Vamos a demostrar con un pequeño script cómo verificar que Meter es capaz de procesar miles de transacciones por segundo frente a la docena que Ethereum procesa.

Hemos creado y desplegado el siguiente contrato en las testnet de Meter (0x8E450bfb3853bb969d7D795E764e84fe2Ee69977) y Ethereum Groeli (0x50d1bD0c385AfC20022A8E3fbC1dC19e11E8Af32).

pragma solidity ^0.8.0;

contract Tps {
  uint private i;

  function contador() public {
  	i++;
  }

  function getContador() public returns(uint) {
  	return i;
  } 

}

Hemos usado la librería Ethers para conectarnos mediante RPC a ambas redes. Este es el código.

const { ethers } = require("ethers"); // https://docs.ethers.org/v5/api/providers/provider/#Provider--block-methods

const sendData = async (network, addressContract, transacciones) => {

  const provider = new ethers.providers.JsonRpcProvider(
    network
  );

  const abiContract = [
  {
    "inputs": [],
    "name": "contador",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getContador",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
];

  const privateKey = process.env.TESTNET_PRIVATE_KEY;
  const walletSigner = new ethers.Wallet(privateKey, provider);

  let contract;

  accountAddress = await walletSigner.getAddress();
  contract = new ethers.Contract(addressContract, abiContract, walletSigner);

  for(let i = 0; i < transacciones; i++) {
    contract.contador();
    console.log("Transacción " + i + " enviada");
  }
  
}

const addressContract = '0x8E450bfb3853bb969d7D795E764e84fe2Ee69977'; //Meter
//const addressContract = '0x50d1bD0c385AfC20022A8E3fbC1dC19e11E8Af32'; //Goerli

//const network = "http://localhost:8545";
const network = "https://rpctest.meter.io";
//const network = "https://goerli.blockpi.network/v1/rpc/public";
//const network = "https://rpc.meter.io";

const transacciones = 50;

sendData(network, addressContract, transacciones);

Para probar el script necesitaréis exportar la clave privada antes de ejecutar el script.

export TESTNET_PRIVATE_KEY=XXXXXXXXX

Necesitaréis tokens para poder pagar el gas de las transacciones. Podéis conseguir para ambas blockchain en los siguientes enlaces.
https://faucet-warringstakes.meter.io/
https://goerli-faucet.pk910.de/

En la prueba que hagáis para la red de Ethereum tendréis que bajar la constante transacciones a 1 ya que Ethereum es incapaz de procesar tantas transacciones y devolverá el siguiente error.

groeli script error

En cambio, ejecutando el script con 50 transacciones o más en Meter veréis como se procesan sin ningún problema. En nuestras pruebas hemos ejecutado la función sendData 5 veces simultáneamente sin recibir ningún error y viendo como aparecen en el explorador de Meter. Podéis ver un ejemplo de un bloque que ha procesado de golpe las 50 transacciones en https://scan-warringstakes.meter.io/block/27365025

meter scanner

En el explorar de bloques de Ethereum vemos como las transacciones están en estado pendiente.

groeli scanner pending

También podemos observar como el monto total de transacciones por bloque en Ethereum son muy bajas y con unos tiempos de inclusión entre bloques mucho más elevados que en Meter.

groeli scanner

Deja una respuesta

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