Transacciones pasadas inconsistentes en Metamask con Ganache

Completé el tutorial de la tienda de mascotas de truffle framework usando Metamask y Ganache. El blokchain (alojado localmente en el puerto 7545) almacena mis "adopciones de mascotas", que se representan como transacciones de ethereum. Puedo ver las transacciones pasadas en Ganache o haciendo clic en el ícono de Metamask en Chrome.

El problema surge cuando cierro Ganache y lo vuelvo a iniciar. Ahora no se muestran transacciones en Ganache, ya que (según tengo entendido) la cadena de bloques se almacena en la memoria, por lo que después de reiniciar Ganache está en blanco.

Sin embargo, Metamask todavía muestra mis transacciones pasadas, aunque deberían haber desaparecido. Esto genera inconsistencias en la aplicación de mi tienda de mascotas. Además, mis adopciones ahora no funcionan: Al intentar adoptar una mascota, me sale el siguiente error:

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

¿Metamask almacena las transacciones en algún lugar y es por eso que todavía se muestran? ¿Cómo interactúa realmente Metamask con la cadena de bloques?

Editar: resulta que la única solución que he encontrado es eliminar Metamask e instalarlo nuevamente.

Respuestas (1)

El problema se debe al hecho de que Ganache inicia en la misma ID de red una nueva cadena de bloques después de cada reinicio. Mientras que Metamask guarda el historial de las transacciones y lo usa para determinar el nonce (índice de cada transacción para una cuenta).

Tienes algunas soluciones aquí:

  1. Como dijiste, instala/desinstala Metamask para reiniciar el historial de la cuenta

  2. Puede cambiar la ID de red en Ganache cada vez que lo reinicie

ingrese la descripción de la imagen aquí

  1. La tercera solución consistirá en proporcionar el nonce usted mismo para cada transacción. Para eso, puede usar web3.eth.getTransactionCountwhich ill para proporcionarle el nonce correcto para esta dirección.

Ejemplo

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);

/ !\ En la solución 2 y 3, es posible que deba cambiar la red en Metamask a otra red y volver a localhost para restablecer la ID de red o el saldo correctamente después de reiniciar ganache.