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.
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í:
Como dijiste, instala/desinstala Metamask para reiniciar el historial de la cuenta
Puede cambiar la ID de red en Ganache cada vez que lo reinicie
web3.eth.getTransactionCount
which 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.