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:
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
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 !
¿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.
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.
julian
Foba