obteniendo el error nonce demasiado bajo, pero nonce está correctamente atascado desde un día

Estoy trabajando con web3.js desde hace algún tiempo, pero ahora estoy atascado con un error de nonce demasiado bajo, el nonce es correcto, también verifiqué la clave privada y otras direcciones, también parecen correctas, sin embargo, cuando llamo a la función addNum, aparece nonce error demasiado bajo

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);
        }
    });
}

También estoy probando un contrato inteligente actualizable, por lo que la dirección es de contrato proxy y abi es de contrato lógico

Intenta cambiar count++a ++count. De lo contrario, seguirá intentándolo con el valor devuelto por Web3.eth.getTransactionCount, que es el nonce actual.
y ¿por qué lo usas Web3.toHexen muchos lugares? ¡Creo que no es necesario!
@goodvibration cambiar a ++ cuenta no ayuda
¿Por qué está incrementando el conteo ++, es esta la segunda transacción que está enviando? De lo contrario, simplemente establezca nonce en el número devuelto por getTransactionCount(). La cadena de bloques incrementará el recuento de transacciones para usted, cuando se extraiga su transacción. A menos que esté enviando múltiples transacciones, no necesita incrementar nada.

Respuestas (1)

Esta línea:

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

Está comenzando su conteo en la cantidad de transacciones pendientes/pendientes que el nodo conoce. Esa es la cola equivocada.

Podrías empezar aquí:

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

Esto eliminará la siguiente transacción en el momento que sigue a la última transacción confirmada conocida .

En general, no es un buen patrón confiar en el recuento de transacciones del nodo para establecer el nonce. Idealmente, el cliente del software estará al tanto de cada transacción enviada desde la cuenta y sabrá el número correcto sin preguntar.

Eche un vistazo aquí para obtener más información: ¿Por qué sendSignedTransaction devuelve un hash tx PERO no publica en la red Rinkeby (React, Metamask, web3, infura)

Y aquí: patrones de concurrencia para cuenta nonce

Espero eso ayude.

Cambiando a var count = Web3.eth.getTransactionCount(defaultAccount); no ayuda
Tal vez publique la dirección de su cuenta y háganos saber en qué red está. La conclusión es que el siguiente nonce debe ser el que viene después del último nonce confirmado.
Actualicé el código anterior con los cambios sugeridos, también hice visible la clave privada, los contratos y la dirección están en testnet, así que siéntase libre de usar el código, todavía atascado con nonce demasiado bajo
También creo que aunque dice nonce demasiado bajo, no está relacionado con nonce ... hay un error tonto que me estoy perdiendo