简体   繁体   中英

web3.eth.sendSignedTransaction() always return “Returned error: nonce too low”

I used web3@1.00 in node.js to interact with private blockchain. And I write the code according to the official documents of web3@1.00.

    var Web3 = require('web3');
    var Tx = require('ethereumjs-tx');


    var web3 = new Web3('http://localhost:8101');


    //get the privatekey
    var decryptPK = web3.eth.accounts.decrypt({"address":"68c5cb5aa9f568ae2a6ec530e982f4f1144f2d10",
    "crypto":{"cipher":"aes-128-ctr",
    "ciphertext":"96b6a86bd5ff16a5669975974eabba844bc414bc52d9cc36843b4f41e89d46b9",
    "cipherparams":{"iv":"6858473ac21c43e94add7e0b70306da5"},
    "kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,
    "salt":"4dee1ee7cf929cd38938aaf0a6c83ceeb743348980052b6fb94ab139ae7e09db"}
    ,"mac":"f7d9bbd81f9c91ffa21e564e613bae57bd77c1914a6690f6018623ff2ce80845"},
    "id":"0eb12580-d11a-49f5-91bb-3592a530e4d8","version":3}
    , '123');
    var privateKey = new Buffer(decryptPK.privateKey.substring(2),'hex');


  //check the nonce
web3.eth.getTransactionCount('0x68c5cb5aa9f568ae2a6ec530e982f4f1144f2d10').then(console.log);

    var rawTx = web3.eth.accounts.signTransaction({
        from: '0x68c5cb5aa9f568ae2a6ec530e982f4f1144f2d10',
        to: '0x7fdec66a5c1b69824dfe3bc29138fac9ddf13ed4',
        value: '1000000000',
        gas: 2000000
    }, decryptPK.privateKey)
    .then(console.log).rawTransaction;


    var tx = new Tx(rawTx);
    tx.sign(privateKey);

    var serializedTx = tx.serialize();

    web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));

However, I always fail to send a transaction. The web3.eth.sendSignedTransaction() always return the error "nonce too low".

    (node:78916) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Returned error: nonce too low
(node:78916) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Please help me know how to fix this problem. Thanks.

This bit of code looks wrong:

var rawTx = web3.eth.accounts.signTransaction({
    from: '0x68c5cb5aa9f568ae2a6ec530e982f4f1144f2d10',
    to: '0x7fdec66a5c1b69824dfe3bc29138fac9ddf13ed4',
    value: '1000000000',
    gas: 2000000
}, decryptPK.privateKey)
.then(console.log).rawTransaction;

I assume rawTx is undefined after this? You're trying to access a field called "rawTransaction" on a Promise object.

The code should probably look something like this (completely untested):

web3.eth.accounts.signTransaction({
    nonce: 1,  // Use the right nonce here, just hardcoding at 1 for the example.
    from: '0x68c5cb5aa9f568ae2a6ec530e982f4f1144f2d10',
    to: '0x7fdec66a5c1b69824dfe3bc29138fac9ddf13ed4',
    value: '1000000000',
    gas: 2000000
}, decryptPK.privateKey)
.then(tx => {
    var rawTx = tx.rawTransaction;
    web3.eth.sendSignedTransaction(rawTx).on('receipt', console.log);
});

The transaction object must be signed with private key transaction sender. If it is showing nonce too low then it means that means the private key does not belongs to the sender of the transaction.

Find working code here :

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM