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.
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:
Wie Sie sagten, installieren/deinstallieren Sie Metamask, um den Kontoverlauf neu zu initialisieren
Sie können die Netzwerk-ID in Ganache bei jedem Neustart ändern
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.