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:
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
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 !
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.
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.
Julian
foba