Warum braucht der Browser so lange, um Blockchain-Daten zu lesen?

Ich habe eine dAPP und verwende Reactjs für das Frontend. Die Anwendung gibt Daten aus einem Smart Contract (dem Kontostand) auf der Homepage zurück. Das Hauptproblem, das mir auffällt, ist, dass es jedes Mal, wenn ich oder andere Benutzer darauf zugreifen, etwa 2-3 Sekunden dauert, bis Daten aus der Blockchain gelesen werden. Bis Daten angezeigt werden, wird der Saldo als „0“ und nicht als echter Wert angezeigt.

Wenn außerdem ein Benutzer mit MetaMask sein Netzwerk ändert (sagen wir von Eth MAINNET zu Rinkeby), werden keine Daten außer 0 angezeigt.

Habt ihr dieses Problem auch und wenn ja, wie geht ihr damit um? Gibt es eine Möglichkeit, die Zeit zu verkürzen, die zum Lesen von Daten aus der Blockchain benötigt wird, oder ist dies eine Einschränkung der Technologie?

Einige müssen Informationen über den allgemeinen Aufbau der dAPP kennen:

  • Ich habe die Datei web3.js, die web3 importiert und den Anbieter entweder über MetaMask oder über Infura einrichtet.
  • Ich habe eine deploy.js, die es mir ermöglicht, den Smart Contract bereitzustellen. Diese Datei stellt eine Verbindung zu rinkeby mit Menemonic und einem von infura bereitgestellten Link her. In der Ausgabe bekomme ich die Schnittstelle und den Bytecode
  • Ich habe eine andere Javascript-Datei, die wie folgt aufgebaut ist:

Listenpunkt

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)

BEARBEITEN: Habe herausgefunden, dass je mehr Operationen ich in ComponentDidMount habe (Abrufen von Guthaben, Adressen usw.), desto länger dauert es

Antworten (3)

Es wird immer langsam sein, wenn Sie einen Live-Knoten für Daten wie den Kontostand kontaktieren.

Mein bevorzugter Weg ist die Verwendung der API von Amberdata , die viel schneller ist. Alles, was Sie brauchen, ist ein API-Schlüssel, dann können Sie:

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

Welche die Daten wie folgt zurückgeben wird:

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

Lassen Sie mich wissen, ob das für Sie funktioniert! 😃

BEARBEITEN:

Es gibt auch ein Node-Wrapper-Paket !

:O Das ist fantastisch. Vielen Dank. Mehr Menschen müssen Amberdata kennenlernen!
Ja, ist es! 🙌

Haben Sie darüber nachgedacht, die Daten zwischenzuspeichern oder an einem Ort wie HTML5-Sitzung/localStorage zu speichern? Dann können Sie versuchen, aus Session/localStorage oder einem anderen Cache zu lesen, den Sie zuerst in Betracht ziehen, und dann auf den aktuellen Kontostand aktualisieren, wenn er verfügbar ist.

Stellen Sie sich einen Microservice vor, der ständig im Hintergrund läuft und die Blockchain etwa jede Minute nach Informationen wie dem Kontostand abfragt, einen aktuellen Wert in einem In-Memory-Cache speichert oder ihn in einer anderen Datenbank ablegt, wenn Sie eine für einen schnelleren Zugriff verwenden.

Ein anderer Ansatz wäre, die Daten vor dem Rendern der Benutzeroberfläche zu haben.

Danke für die Antwort Kumpel. Also das Problem hat jeder...

Wir hatten ein ähnliches Problem, als wir Infura verwendeten. Infura kann ziemlich langsam sein, was sich darauf auswirken kann, wie lange es dauert, bis Sie eine Antwort erhalten. Um dieses Problem zu lösen, sind wir zu Alchemy gewechselt und haben erhebliche Geschwindigkeitssteigerungen erlebt.

Wenn Sie von Mainnet zu Rinkeby wechseln, wird der Vertrag, den die Person abfragt, möglicherweise nicht bereitgestellt. Dies könnte ein Grund dafür sein, dass der angezeigte Wert 0 ist.