使用 truffle (3.4.6)、metamask (3.9.2) 和 testrpc (4.0.1),我调用一笔交易并得到“错误:tx 没有正确的随机数。帐户的随机数为:5 tx 有随机数:15"。我已经将我的契约方法的主体简化为一些琐碎的事情,但我仍然明白这一点。知道是什么原因造成的吗?
contract MyContract {
mapping (address => bool) authorized;
function myMethod (uint element, uint price) whenNotPaused returns (bool) {
if (!authorized[msg.sender]) throw;
return true;
}
}
我这样调用该方法(使用松露):
MyContract.deployed().then((instance) => {
instance.myMethod (id, price, {from: account}).then (...)
在这个线程中,我看到了来回切换网络和错误自我纠正的建议。
¯\_(ツ)_/¯
@okwme 是对的,但您也可以更改网络配置来解决问题。假设您正在使用 HDWallet 提供商在本地主机上运行开发网络,那么您可以通过注释掉该配置属性并向其添加主机和端口属性来修复错误。 看起来如下:
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
gas: 6721975
// networkCheckTimeout: 10000,
// provider: function() {
// return new HDWalletProvider(mnemonic, 'http://127.0.0.1:8545/', 0, 10);
// },
// network_id: '*',
// gas: 6721975,
},
},
我使用 etherjs 遇到了这个错误。从 ethers v6 开始,您可以在签名者上使用 getNonce 方法来查找 Nonce,然后将该 Nonce 传递给合约上的部署方法。完整示例:
const wallet = new ethers.Wallet(
process.env.PRIVATE_KEY,
provider
);
const nonce = await wallet.getNonce();
const contract = await contractFactory.deploy(
{
nonce: nonce,
gasLimit: 1000000,
gasPrice: 2000000000,
value: 0,
}
);