Frühere Transaktionen inkonsistent auf Metamask mit Ganache

Ich habe das Trüffel-Framework-Petshop-Tutorial mit Metamask und Ganache abgeschlossen. Die Blokchain (lokal auf Port 7545 gehostet) speichert meine "Haustieradoptionen", die als Ethereum-Transaktionen dargestellt werden. Ich kann die vergangenen Transaktionen entweder in Ganache oder durch Klicken auf das Metamask-Symbol in Chrome anzeigen.

Das Problem tritt auf, wenn ich Ganache schließe und neu starte. In Ganache werden jetzt keine Transaktionen angezeigt, da (nach meinem Verständnis) die Blockchain im Speicher gespeichert ist und nach dem Neustart von Ganache daher leer ist.

Metamask zeigt jedoch immer noch meine vergangenen Transaktionen an, obwohl sie weg sein sollten. Dies führt zu Inkonsistenzen in meiner Tierhandlungs-App. Außerdem funktionieren meine Adoptionen jetzt nicht: Beim Versuch, ein Haustier zu adoptieren, erhalte ich die folgende Fehlermeldung:

Error: the tx doesn't have the correct nonce. account has nonce of: 0 
tx has nonce of: 10

Speichert Metamask die Transaktionen irgendwo, und deshalb werden sie immer noch angezeigt? Wie interagiert Metamask tatsächlich mit der Blockchain?

Bearbeiten: Es stellt sich heraus, dass die einzige Lösung, die ich gefunden habe, darin besteht, Metamask zu entfernen und erneut zu installieren.

Antworten (1)

Das Problem liegt daran, dass Ganache nach jedem Neustart auf der gleichen Netzwerk-ID eine neue Blockchain startet. Während Metamask den Verlauf der Transaktionen speichert und verwendet, um die Nonce (Index jeder Transaktion für ein Konto) zu bestimmen.

Sie haben hier ein paar Lösungen:

  1. Wie Sie sagten, installieren/deinstallieren Sie Metamask, um den Kontoverlauf neu zu initialisieren

  2. Sie können die Netzwerk-ID in Ganache bei jedem Neustart ändern

Geben Sie hier die Bildbeschreibung ein

  1. Die dritte Lösung besteht darin, die Nonce für jede Transaktion selbst bereitzustellen. Dazu können Sie das verwenden web3.eth.getTransactionCount, um Ihnen die richtige Nonce für diese Adresse bereitzustellen.

Beispiel

setTimeout(function() { // Wait for metamask for being injected

    if (typeof web3 !== 'undefined') { // Check if metamask installed

        if(web3.eth.accounts.length > 0) { // Chek if metamask unlocked

            window.web3 = new Web3(web3.currentProvider);

            const from = web3.eth.accounts[0];
            const to   = "0xf17f52151EbEF6C7334FAD080c5704D77216b732";
            const value     = web3.toWei(1, 'ether');

            web3.eth.getTransactionCount(from, function(err, nonce) { // Get the nonce
                if(!err) {

                  const transaction = {
                     "nonce"        : nonce,
                      "to"          : to, 
                      "value"       : value
                    };

                    web3.eth.sendTransaction(transaction, function(err, tx) { // Sent the transacion
                        if(!err)
                           console.log(tx)
                    });
               }

            });
        } 
     }
}, 500);

/ !\ In Lösung 2 und 3 müssen Sie möglicherweise das Netzwerk in Metamask auf ein anderes Netzwerk umstellen und zu localhost zurückkehren, um die Netzwerk-ID oder das Gleichgewicht nach dem Ganache-Neustart korrekt zurückzusetzen.