Я завершил учебник по зоомагазину с трюфельным каркасом, используя Metamask и Ganache. Блокчейн (локально размещенный на порту 7545) хранит мои «домашние усыновления», которые представлены в виде транзакций ethereum. Я могу просмотреть прошлые транзакции либо в Ganache, либо щелкнув значок метамаски в Chrome.
Проблема возникает, когда я закрываю Ganache и запускаю его снова. Теперь в Ganache не отображаются транзакции, так как (насколько я понимаю) блокчейн хранится в памяти, поэтому после перезапуска Ganache он пустой.
Однако Metamask по-прежнему показывает мои прошлые транзакции, даже если они должны исчезнуть. Это приводит к несоответствиям в приложении моего зоомагазина. Кроме того, мои усыновления теперь не работают: при попытке усыновить питомца я получаю следующую ошибку:
Error: the tx doesn't have the correct nonce. account has nonce of: 0
tx has nonce of: 10
Сохраняет ли Metamask где-то транзакции, и поэтому они все еще отображаются? Как Metamask на самом деле взаимодействует с блокчейном?
Редактировать: оказывается, единственное решение, которое я нашел, - это удалить Metamask и установить его снова.
Проблема связана с тем, что Ganache запускает на том же сетевом идентификаторе новый блокчейн после каждого перезапуска. В то время как Metamask хранит историю транзакций и использует ее для определения nonce (индекса каждой транзакции для учетной записи).
Здесь у вас есть несколько решений:
Как вы сказали, установите / удалите Metamask, чтобы повторно инициализировать историю учетной записи.
Вы можете менять идентификатор сети в Ganache каждый раз, когда перезагружаете его .
web3.eth.getTransactionCount
который предоставит вам правильный одноразовый номер для этого адреса.Пример
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);
/ !\ В решениях 2 и 3 вам может потребоваться переключить сеть в Metamask на другую сеть и вернуться к локальному хосту, чтобы правильно сбросить идентификатор сети или баланс после перезапуска ганаша.