Ich versuche, etwas zu codieren, das eine Adresse leert und diesen Betrag an meine Hauptgeldbörse sendet. Um mich mit dem Senden von Raw-Transaktionen und dem manuellen Setzen des Eth-Betrags vertraut zu machen, habe ich ein Testprogramm ausprobiert. Meine Logik besteht darin, den Kontostand von Konto1 <---> Konto2 in einer Endlosschleife zu senden.
Das funktioniert jedoch viele Male, aber irgendwann tritt entweder "FEHLER! Fehler: unzureichende Mittel für Gas * Preis + Wert" oder ein Fehler mit einer doppelten Transaktion auf.
Ich verstehe nicht, warum das so ist, irgendwelche Ideen?
var Web3 = require('web3');
var web3 = new Web3(new
Web3.providers.HttpProvider('https://ropsten.infura.io/'));
const ethereumjs = require('ethereumjs-tx');
var BigNumber = require('bignumber.js');
var account2 = {
'address': '0xaCC9a59A4266F40846664992bE9bACD607716b7c',
'privateKey': '0x26c1999d1b6e51eda8ed8912cc678fe48879b8cefea1af11835d9d64669a818a'
}
var account = {
'address': '0x379ccad8923B1e4CF79E9dB125d70f0843cb2C35',
'privateKey': '0xc129caaa7a963e1c67bd8bf0586dcf4e47b6ae7e9294962886178a9acb842290'
}
recBalanceCheck(account,account2);
function recBalanceCheck(account, account2) {
setTimeout(function () {
var balance = web3.fromWei(web3.eth.getBalance(account.address));
// var balance =(web3.eth.getBalance(account.address));
console.log('awaiting payment... current balance is: ' + balance.toNumber());
if (balance.toNumber() > 0) {
console.log('payment received. Balance is now ' + balance.toNumber());
console.log('sending ether to main account...');
sendEther(account, account2.address, balance.toNumber(), 3);
recBalanceCheck(account2, account);
} else {
recBalanceCheck(account, account2);
}
}, 10000);
}
function sendEther(senderAccount, receiveraddress, amount, gwei) {
var account = senderAccount.address;
var privateKey = senderAccount.privateKey;
privateKey = privateKey.slice(2, privateKey.length);
privateKey = Buffer.from(privateKey, 'hex');
var gas = 21000;
var gasPrice = new BigNumber(web3.toWei(gwei, 'gwei'));
var cost = gasPrice.multipliedBy(gas);
web3.eth.getTransactionCount(account, function (err, nonce) {
var tx = new ethereumjs({
nonce: nonce,
gasPrice: web3.toHex(web3.toWei(gwei, 'gwei')),
gasLimit: 21000,
to: receiveraddress,
value: web3.toHex(new BigNumber(web3.toWei(amount, 'ether')) - cost)
});
tx.sign(privateKey);
var raw = '0x' + tx.serialize().toString('hex');
web3.eth.sendRawTransaction(raw, function (err, transactionHash) {
if (err) {
console.log('ERROR!' + err);
process.exit();
}
console.log(transactionHash);
});
});
}
Ich habe meinen eigenen Fehler gefunden. Ich habe BigNumber nicht für jede Berechnung verwendet. Die sendEther(...)-Funktion muss bereits mit einer BigNumber aufgerufen werden, sonst wird etwas gerundet oder geht verloren, wodurch die Transaktion ungültig wird.