Fehler bei falscher Berechnung von Gaspreis und -wert nach vielen Iterationen

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

    });
});
}

Antworten (1)

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.