TestRPC/Ganache:交易没有正确的 nonce

36
我最近一直在尝试使用truffle,并且按照以下教程进行操作:http://truffleframework.com/tutorials/pet-shop 当我尝试设置一个交易时,我一直收到以下错误:
Error: Error: the tx doesn't have the correct nonce. account has nonce of: 14 tx has nonce of: 0
我查看了一些相关文章,但是到目前为止还没有找到可能导致此问题的原因。
以下是我的一些配置信息: - Truffle v3.4.7 - Solidity v0.4.13 - Npm v5.3.0 - TestRPC v4.0.1 (也发生在Ganache) - Metamask v3.9.5
从我的理解来看,似乎无法找到之前的交易以对新交易进行哈希处理?
3个回答

43

使用MetaMask v3.14.1,您可以按照以下步骤重置您的账户:

在设置菜单中,MetaMask有一个“重置账户”按钮。此按钮会清除当前帐户的交易历史记录,该历史记录用于计算当前帐户nonce。

enter image description here

正常用户不应该使用此功能。

这对于重置测试网络但想继续使用相同帐户的开发人员非常有用,强制MetaMask相信此网络ID是干净状态下的新网络。

参考:http://metamask.helpscoutdocs.com/article/36-resetting-an-account

(感谢Tim Wu)


旧的回复:

yatskevich的答案是正确的。

然而,对于使用Truffle 4+和“truffle develop”的人们,每次运行Truffle Develop都需要删除并重新安装MetaMask才能使其再次工作!

这个问题在这里得到解决:https://github.com/trufflesuite/truffle/issues/681,这里:https://github.com/trufflesuite/ganache/issues/112,还有在这里:https://github.com/MetaMask/metamask-extension/issues/1999

简言之,他们正在解决这个问题,在此期间您需要每次重新安装MetaMask!


1
Metamask的问题很快就会得到解决 https://github.com/MetaMask/metamask-extension/issues/1999#issuecomment-347615959,而Truffle现在正在等待他们的修复 https://github.com/trufflesuite/trufflesuite.com/issues/30#issuecomment-348573629。 - jopasserat
1
请注意,您还可以简单地禁用然后重新启用Metamask。虽然仍然很麻烦,但不像重新安装那么糟糕。我还为Truffle Develop制作了一个补丁,可以作为短期解决方案:https://github.com/MetaMask/metamask-extension/issues/1999#issuecomment-354141687 - Stan James
1
@StanJames 注意,使用此修复程序会破坏事件触发,由于某种原因,在更改network_id后事件没有触发。 - Random
我正在使用 Ganache 和 MetaMask。删除然后重新安装 MetaMask 可以解决问题 :) 真是太痛苦了... - Russo
Metamask的作者在v3.14.1中发布了此问题的解决方法。我尝试过了,它有效。https://github.com/MetaMask/metamask-extension/issues/1999#issuecomment-362445864 - Tim Wu
1
谢谢。这个方法可行。可能是重新引入了吗?我正在运行 MM v4.6.1 和 truffle v4.1.6,经过几天同样的应用程序/交易正常工作后,我刚刚得到了它。 - Ioana Grozav

30

尝试在 MetaMask 中重新连接到您的 TestRPC 网络:

  1. 选择 主以太坊网络(或任何非 Localhost 8545 的网络)
  2. 再次选择 Localhost 8545

我在停止并启动新的 TestRPC 节点后遇到了这个问题。


1
这并不总是对我起作用,但当我这样做并重置帐户时,它总是有效的。 - Teleporting Goat

3

请检查您的truffle.jstruffle-config.js文件

如果您正在使用以下类似代码的HDWalletProvider,则可能导致出现错误

var HDWalletProvider = require("truffle-hdwallet-provider");
var mnemonic = "your mnemonic";

module.exports = {
  networks: {
    development: {
      provider: function() {
        return new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/", 0, 50);
      },
      network_id: '*',
      gas: 9999999
    }
  },
  compilers: {
    solc: {
      version: "^0.4.25"
    }
  }
};

将类似下面的 HDWalletProvider 移除,这样就解决了我的问题。

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",     // Localhost
      port: 8545,            // Standard Ganache UI port
      network_id: "*", 
      gas: 4600000
    }
  },
  compilers: {
    solc: {
      version: "0.5.2"
    }
  }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接