Почему браузер так долго считывает данные блокчейна?

У меня есть dAPP, и я использую reactjs для внешнего интерфейса. Приложение возвращает данные смарт-контракта (баланс) на главной странице. Основная проблема, которую я заметил, заключается в том, что каждый раз , когда я или любые другие пользователи обращаются к нему, для чтения данных из блокчейна требуется около 2-3 секунд. Пока данные не отображаются, баланс отображается как «0», а не как реальное значение.

Кроме того, если пользователь с MetaMask меняет свою сеть (скажем, с Eth MAINNET на Rinkeby), данные не отображаются, кроме 0.

У вас тоже есть такая проблема и если да, то как вы с ней справляетесь? Есть ли способ сократить время, необходимое для чтения данных из блокчейна, или это ограничение технологии?

Некоторые должны знать информацию об общей структуре dAPP:

  • У меня есть файл web3.js, который импортирует web3 и настраивает провайдера либо через MetaMask, либо через Infura.
  • У меня есть deploy.js, который позволяет мне развернуть смарт-контракт. Этот файл подключается к rinkeby с помощью menemonic и ссылки, предоставленной infura. На выходе получаю интерфейс и байткод
  • У меня есть еще один файл javascript, который структурирован следующим образом:

Пункт списка

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)

РЕДАКТИРОВАТЬ: Выяснил, что чем больше у меня операций в ComponentDidMount (извлечение баланса, адресов и т. д.), тем больше времени требуется

Ответы (3)

Это всегда будет медленно, если вы обратитесь к действующему узлу за данными, такими как баланс счета.

Я предпочитаю использовать API Amberdata , который намного быстрее. Все, что вам нужно, это ключ API, после чего вы можете:

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

Который вернет данные так:

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

Дайте мне знать, если это работает для вас! 😃

РЕДАКТИРОВАТЬ:

Существует также пакет-оболочка узла !

:O Это фантастика. Большое спасибо. Больше людей должны узнать об Amberdata!
Да, так и есть! 🙌

Рассматривали ли вы кеширование данных или их сохранение где-то, например, в сеансе HTML5/localStorage. Затем вы можете попытаться прочитать из сеанса/localStorage или любого другого кеша, который вы рассматриваете в первую очередь, а затем обновить текущий баланс, когда он будет доступен.

Рассмотрим микросервис, который постоянно работает в фоновом режиме и каждую минуту или около того опрашивает блокчейн для получения такой информации, как баланс, сохраняет актуальное значение в кэше в памяти или выгружает его в другую базу данных, если вы используете ее для более быстрого доступа.

Другой подход заключается в том, чтобы получить данные до рендеринга пользовательского интерфейса.

Спасибо за ответ, приятель. Так что это проблема у всех...

У нас возникла похожая проблема, когда мы использовали Infura. Infura может быть довольно медленным, что может повлиять на то, сколько времени вам потребуется, чтобы получить ответ. Чтобы решить эту проблему, мы переключились на алхимию и значительно увеличили скорость.

Если вы переходите с Mainnet на Rinkeby, контракт, который запрашивает пользователь, может не быть развернут. Это может быть причиной того, что отображаемое значение равно 0.