Прошлые транзакции несовместимы с Metamask с Ganache

Я завершил учебник по зоомагазину с трюфельным каркасом, используя 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 и установить его снова.

Ответы (1)

Проблема связана с тем, что Ganache запускает на том же сетевом идентификаторе новый блокчейн после каждого перезапуска. В то время как Metamask хранит историю транзакций и использует ее для определения nonce (индекса каждой транзакции для учетной записи).

Здесь у вас есть несколько решений:

  1. Как вы сказали, установите / удалите Metamask, чтобы повторно инициализировать историю учетной записи.

  2. Вы можете менять идентификатор сети в Ganache каждый раз, когда перезагружаете его .

введите описание изображения здесь

  1. Третье решение будет заключаться в самостоятельном предоставлении одноразового номера для каждой транзакции. Для этого вы можете использовать тот, 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 на другую сеть и вернуться к локальному хосту, чтобы правильно сбросить идентификатор сети или баланс после перезапуска ганаша.