Fehler nonce zu niedrig bekommen, aber nonce steckt seit einem Tag richtig fest

Ich arbeite seit einiger Zeit mit web3.js, aber jetzt stecke ich mit dem Nonce zu niedrigen Fehler fest, der Nonce ist richtig, auch ich habe den privaten Schlüssel und andere Adressen überprüft, sie scheinen auch richtig zu sein, aber wenn ich die Funktion addNum aufrufe, wird sie gegeben einmal zu niedriger Fehler

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

var Web3 =  new Web3(new Web3.providers.HttpProvider("https://rinkeby.infura.io/kG4Z6EC5EsknbOqki4mz")); 

let abi = [
    {
        "constant": false,
        "inputs": [
            {
                "name": "x",
                "type": "uint256"
            }
        ],
        "name": "addNum",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "getSum",
        "outputs": [
            {
                "name": "sum",
                "type": "uint256"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    }
];


let contract = Web3.eth.contract(abi);
let contractAddress = "0xc8fe6f104a5076a8d3b1284cd1a48095d6f5b5cd";
let contractInstance = contract.at(contractAddress);

let defaultAccount = '0x262b76df1dcb6542aa4a19296a824f0fdd1b4b04'; 
let privatekey = 'ba456ad306a69c3830eed33f690e8f5b93e36cea3cd37ed9604f71b95a5ae1e3';



    var num = 2;

    var data = contractInstance.addNum.getData(num);
            sendRaw(data, function(err, hash){
                if(err)
                {
                   console.log("err "+err);
                }
                else
                {
                    console.log("hash "+hash);
                }
            });



/**
 * Function to signed and call function in solidity  
 * param data
 * return (err, transactionhash)
 */
var count = Web3.eth.getTransactionCount(defaultAccount);

function sendRaw(data, callback) 
{
    var rawTx  = {
        nonce: Web3.toHex(++count),
        from: Web3.toHex(defaultAccount),
        gasLimit: Web3.toHex(300000),
        gasPrice: Web3.toHex(Web3.toWei('20', 'gwei')),
        to: Web3.toHex(contractAddress),
        value: 0,
        data: data
    };
    var privateKey = new Buffer(privatekey, 'hex');
    var transaction = new tx(rawTx);
    transaction.sign(privateKey);
    var serializedTx = transaction.serialize().toString('hex');
    Web3.eth.sendRawTransaction(
    '0x' + serializedTx, function(err, result) {
        if(err) 
        {
            callback(err, '');
        } 
        else 
        {
            callback('', result);
        }
    });
}

Außerdem teste ich einen aktualisierbaren Smart Contract, sodass die Adresse ein Proxy-Vertrag und abi ein Logikvertrag ist

count++Versuchen Sie, auf zu wechseln ++count. Andernfalls versuchen Sie es einfach weiter mit dem von zurückgegebenen Wert Web3.eth.getTransactionCount, der die aktuelle Nonce ist.
und warum verwenden Sie Web3.toHexan vielen Stellen? Ich denke, es ist nicht notwendig!
Das Ändern von @goodvibration in ++ count hilft nicht
Warum erhöhen Sie den count++ , ist dies die zweite Transaktion, die Sie senden? Wenn nicht, setzen Sie einfach auf die Zahl, die von zurückgegeben wird getTransactionCount(). Die Blockchain erhöht die Transaktionsanzahl für Sie, wenn Ihre Transaktion abgebaut wird. Wenn Sie nicht mehrere Transaktionen senden, müssen Sie nichts erhöhen.

Antworten (1)

Diese Linie:

var count = Web3.eth.getTransactionCount(defaultAccount,'pending');

Sie beginnen Ihre Zählung mit der Anzahl der ausstehenden/ausstehenden Transaktionen, die der Knoten kennt. Das ist die falsche Warteschlange.

Du könntest hier anfangen:

var count = Web3.eth.getTransactionCount(defaultAccount);

Dadurch wird die nächste Transaktion auf die Nonce fallen gelassen, die auf die letzte bekannte bestätigte Transaktion folgt .

Es ist im Allgemeinen kein gutes Muster, sich auf die Transaktionsanzahl des Knotens zu verlassen, um die Nonce festzulegen. Im Idealfall kennt der Software-Client jede Transaktion, die von dem Konto gesendet wird, und kennt die richtige Nummer, ohne zu fragen.

Weitere Informationen finden Sie hier: Warum sendet sendSignedTransaction einen tx-Hash zurück, ABER postet nicht an das Rinkeby-Netzwerk (React, Metamask, web3, infura)

Und hier: Gleichzeitigkeitsmuster für Konto Nonce

Ich hoffe es hilft.

Wechseln zu var count = Web3.eth.getTransactionCount(defaultAccount); hilft nicht
Posten Sie vielleicht Ihre Kontoadresse und teilen Sie uns mit, in welchem ​​Netzwerk es sich befindet. Unterm Strich muss die nächste Nonce diejenige sein, die nach der letzten bestätigten Nonce kommt.
Ich habe den obigen Code mit vorgeschlagenen Änderungen aktualisiert, habe jetzt auch den privaten Schlüssel sichtbar gemacht, die Verträge und die Adresse sind auf Testnet, also fühlen Sie sich bitte frei, den Code zu verwenden, immer noch mit Nonce zu niedrig
Ich denke auch, obwohl es nonce zu niedrig sagt, es hat nichts mit nonce zu tun ... es gibt einen dummen Fehler, den ich übersehe