получение одноразового номера ошибки слишком низко, но одноразовый номер правильно застрял с одного дня

Я работаю с web3.js с некоторого времени, но теперь я застрял с слишком низкой ошибкой одноразового номера, одноразовый номер правильный, также я проверил закрытый ключ и другие адреса, они также кажутся правильными, однако, когда я вызываю функцию addNum, дает одноразовый номер слишком низкая ошибка

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

Кроме того, я тестирую обновляемый смарт-контракт, поэтому адрес относится к прокси-контракту, а abi — к логическому контракту.

Попробуйте изменить count++на ++count. В противном случае вы просто продолжите попытки со значением, возвращаемым функцией Web3.eth.getTransactionCount, которое является текущим одноразовым номером.
и почему вы используете Web3.toHexво многих местах? думаю не надо!
Изменение @goodvibration на ++ count не помогает
почему вы увеличиваете count++ , это вторая транзакция, которую вы отправляете? Если нет, просто установите nonce на число, возвращаемое getTransactionCount(). Блокчейн будет увеличивать количество транзакций для вас, когда ваша транзакция будет добыта. Если вы не отправляете несколько транзакций, вам не нужно ничего увеличивать.

Ответы (1)

Эта строка:

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

Вы начинаете свой подсчет с количества незавершенных/ожидающих транзакций, о которых знает узел. Это неправильная очередь.

Вы можете начать здесь:

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

Это отбрасывает следующую транзакцию с одноразовым номером, который следует за последней известной подтвержденной транзакцией .

Как правило, не рекомендуется полагаться на количество транзакций узла для установки одноразового номера. В идеале программный клиент будет знать о каждой транзакции, отправленной со счета, и будет знать правильный номер, не спрашивая.

Посмотрите здесь для получения дополнительной информации: Почему sendSignedTransaction возвращает хэш tx, НО не публикует сообщения в сети Rinkeby (React, Metamask, web3, infura)

А здесь: Шаблоны параллелизма для одноразового номера учетной записи

Надеюсь, поможет.

Изменение на var count = Web3.eth.getTransactionCount(defaultAccount); не помогает
Может быть, разместите адрес своей учетной записи и дайте нам знать, в какой сети она находится. Суть в том, что следующим одноразовым номером должен быть тот, который следует за последним подтвержденным одноразовым номером.
я обновил приведенный выше код с предложенными изменениями, а также теперь сделал видимым закрытый ключ, контракты и адрес находятся в тестовой сети, поэтому, пожалуйста, не стесняйтесь использовать код, все еще застрявший с слишком низким одноразовым номером.
Также я думаю, что, хотя он говорит, что одноразовый номер слишком низкий, он не связан с одноразовым номером... есть какая-то глупая ошибка, которую я упускаю