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
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.
gute Stimmung
count++
Versuchen Sie, auf zu wechseln++count
. Andernfalls versuchen Sie es einfach weiter mit dem von zurückgegebenen WertWeb3.eth.getTransactionCount
, der die aktuelle Nonce ist.Ha ĐANG
Web3.toHex
an vielen Stellen? Ich denke, es ist nicht notwendig!Äther
Nulik
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.