Я работаю с 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 — к логическому контракту.
Эта строка:
var count = Web3.eth.getTransactionCount(defaultAccount,'pending');
Вы начинаете свой подсчет с количества незавершенных/ожидающих транзакций, о которых знает узел. Это неправильная очередь.
Вы можете начать здесь:
var count = Web3.eth.getTransactionCount(defaultAccount);
Это отбрасывает следующую транзакцию с одноразовым номером, который следует за последней известной подтвержденной транзакцией .
Как правило, не рекомендуется полагаться на количество транзакций узла для установки одноразового номера. В идеале программный клиент будет знать о каждой транзакции, отправленной со счета, и будет знать правильный номер, не спрашивая.
Посмотрите здесь для получения дополнительной информации: Почему sendSignedTransaction возвращает хэш tx, НО не публикует сообщения в сети Rinkeby (React, Metamask, web3, infura)
А здесь: Шаблоны параллелизма для одноразового номера учетной записи
Надеюсь, поможет.
хорошая вибрация
count++
на++count
. В противном случае вы просто продолжите попытки со значением, возвращаемым функциейWeb3.eth.getTransactionCount
, которое является текущим одноразовым номером.Ха ДЖАНГ
Web3.toHex
во многих местах? думаю не надо!Эфир
Нулик
getTransactionCount()
. Блокчейн будет увеличивать количество транзакций для вас, когда ваша транзакция будет добыта. Если вы не отправляете несколько транзакций, вам не нужно ничего увеличивать.