Wie bringt .transfer Ether in ein testrpc-Konto?

Ich führe das CrowdFunding-Beispiel aus den Solidity-Dokumenten aus und frage mich, warum der Ether-Saldo nicht korrekt ansteigt, nachdem ich checkGoalReachedden folgenden Code ausgeführt habe:

function checkGoalReached(uint campaignID) returns (bool reached) {
        Campaign storage c = campaigns[campaignID];
        if (c.amount < c.fundingGoal)
            return false;
        uint amount = c.amount;
        c.amount = 0;
        c.beneficiary.transfer(amount);
        return true;
    }

Bevor ich diese Funktion ausführe, habe ich den Kontostand des 2. Kontos in meinem testrpc über überprüft web3.eth.getBalance(web3.eth.accounts[1])und das Ergebnis ist

{ [String: '100000000000000000000'] s: 1, e: 20, c: [ 1000000 ] }

Nach dem Ausführen checkGoalReachedeiner Transaktion in testrpc, aber nach dem getBalanceerneuten Ausführen ist dies das Ergebnis:

{ [String: '100000000000000016000'] s: 1, e: 20, c: [ 1000000, 16000 ] }

Warum erhöhen sich die ursprünglichen 1.000.000 Ether nicht auf 1.016.000, sondern schaffen ein 2. Element in der Bilanz?

Antworten (1)

Sie müssen es von BigNumber konvertieren. Web3 schließt dies automatisch ein.

resultOfgetBalance.toNumber();

Und Sie haben Ihre richtige Menge. BigNumber wird als Array gespeichert, um außergewöhnlich große Zahlen zu berechnen.

Durch Ausführen web3.eth.getBalance(accounts[1]).toNumber()in der Konsole bekomme ich 100000000000000020000' als Ergebnis. Ich hatte 1.016.000 erwartet, macht für mich immer noch keinen Sinn.
Sie erhalten den Betrag in Wei, nicht in Ether. es ist 18 Dezimalstellen abgegrenzt. Übergeben Sie das Ergebnis an web3.fromWei(result, 'ether');und es wird das Problem der vielen Nullen für Sie beheben. Was das Ergebnis von 20000 vs. 16000 angeht, nun, ich würde annehmen, dass Sie den falschen Betrag überwiesen haben. Es würde Ihnen etwas nützen, etwas tiefer in die Solidty-Dokumentation bezüglich der Dezimalisierung und der Speicherung von Werten von Ether/Token einzutauchen.