¿Por qué el navegador tarda tanto en leer los datos de la cadena de bloques?

Tengo un dAPP y uso reactjs para la interfaz. La aplicación devuelve datos de un contrato inteligente (el saldo) en la página de inicio. El principal problema que noto es que cada vez que yo o cualquier otro usuario accede a él, los datos tardan entre 2 y 3 segundos en leerse desde la cadena de bloques. Hasta que se muestren los datos, el saldo se muestra como '0' en lugar del valor real.

Además, si un usuario con MetaMask cambia su red (digamos de Eth MAINNET a Rinkeby), no se muestran datos sino 0.

¿También tienes este problema y, en caso afirmativo, cómo lo manejas? ¿Hay alguna forma de mejorar el tiempo que se tarda en leer datos de Blockchain o es una limitación de la tecnología?

Algunos deben conocer información sobre la estructura general de la dAPP:

  • Tengo el archivo web3.js que importa web3 y configura el proveedor a través de MetaMask o Infura.
  • Tengo un deployment.js que me permite implementar el contrato inteligente. Este archivo se conecta a rinkeby con menemonic y un enlace proporcionado por infura. En la salida obtengo la interfaz y el código de bytes.
  • Tengo otro archivo javascript que está estructurado de la siguiente manera:

elemento de la lista

import web3 from './web3'; 

const address = 'the address provided by the deploy file';

const abi = ['the abi provided by the deploy file'];

export default new web3.eth.Contract(abi,address)

EDITAR: descubrí que cuantas más operaciones tengo en ComponentDidMount (obtener saldo, direcciones, etc.), más tiempo lleva

Respuestas (3)

Siempre será lento si se contacta con un nodo en vivo para obtener datos como el saldo de la cuenta.

Mi forma preferida es usar la API de Amberdata , que es mucho más rápida. Todo lo que necesita es una clave API y luego puede:

curl \
    -X GET \
    -H "accept: application/json" \
    -H "x-api-key: <your-api-key>" \
"https://web3api.io/api/v1/addresses/0xb7e3abd75119fe3cfc76015193226b21fc19230b/account-balances/latest"

Que devolverá los datos así:

{
  "status": 200,
  "title": "OK",
  "description": "Successful request",
  "payload": {
    "address": "0x06012c8cf97bead5deae237070f9587f8e7a266d",
    "blockNumber": "7446776",
    "timestamp": 1553638186000,
    "timestampNanoseconds": 0,
    "value": "65103167814228166337",
    "blockchainId": "1c9c969065fcd1cf"
  }
}

¡Déjame saber si eso funciona para ti! 😃

EDITAR:

¡ También hay un paquete contenedor de nodos !

:O Eso es fantástico. Muchas gracias. ¡Más personas deben aprender sobre Amberdata!
¡sí lo es! 🙌

¿Ha considerado almacenar los datos en caché o almacenarlos en algún lugar como HTML5 session/localStorage. Luego, puede intentar leer desde session/localStorage o cualquier caché que considere primero y luego actualizar al saldo actual cuando esté disponible.

Considere un microservicio que se ejecuta constantemente en segundo plano consultando la cadena de bloques cada minuto más o menos para obtener información como el saldo, mantenga un valor actualizado en un caché en memoria o descárguelo en una base de datos diferente si está usando una para un acceso más rápido.

Otro enfoque sería tener los datos antes de representar la interfaz de usuario.

Gracias por la respuesta compañero. Así que este es un problema que todos tienen...

Experimentamos un problema similar cuando usábamos Infura. Infura puede ser bastante lento, lo que puede afectar el tiempo que tarda en recibir una respuesta. Para resolver este problema, cambiamos a Alchemy y experimentamos aumentos de velocidad significativos.

Si está cambiando de Mainnet a Rinkeby, es posible que no se implemente el contrato que la persona está solicitando. Esta podría ser una razón por la cual el valor que se muestra es 0.