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
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.
buena vibración
count++
a++count
. De lo contrario, seguirá intentándolo con el valor devuelto porWeb3.eth.getTransactionCount
, que es el nonce actual.HaĐANG
Web3.toHex
en muchos lugares? ¡Creo que no es necesario!Éter
Nulik
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.