Der auf das Konto des Empfängers überwiesene Ether ist nicht exakt

Ich versuche zu übertragen, um in einem in Solidity geschriebenen Smart Contract etwas Ether von einem Konto zu einem anderen zu senden. Die Überweisung ist erfolgreich, aber der erhaltene Betrag stimmt nicht genau mit dem überwiesenen Betrag überein. Es gibt einen sehr kleinen Unterschied, manchmal nimmt er zu und manchmal ab.

Zum Beispiel -

received amount: 0.04999999999999716
Transferred amount: 0.05

Ein anderes Beispiel -

Received amount - 0.05000000000001137
Transferred amount -0.05

Gibt es etwas, das ich vermisse?

Soliditätsfunktion, die die Übertragung durchführt -

function borrowBook(uint id) onlyMember payable{
    // Can't borrow book if passed value is not sufficient
    if (msg.value < 100){
        throw;
    }
    // Can't borrow a non-existent book
    if (id > numBooks || catalog[id].state != State.Available) {
        throw;
    }
    catalog[id].borrower = msg.sender;
    catalog[id].dateIssued = now;
    catalog[id].state = State.Borrowed;
    // 50% value is shared with the owner
    var owner_share = msg.value/2; 
    if (!catalog[id].owner.send(owner_share)){
        throw;
    }
    Borrow(id, msg.sender, catalog[id].dateIssued);
}

Testfall, bei dem ich die Salden von Sender und Empfänger überprüfe -

    it.only('should borrow book and transfer 50% weis to owner account', async function(){
        await lms.addBook('a', 'b', 'c');
        await lms.addMember('Michael Scofield', accounts[2]);
        // balance of owner and borrower's account before book borrow
        let ownerBal1 = web3.fromWei(web3.eth.getBalance(accounts[0]).valueOf());
        let borrowBal1 = web3.fromWei(web3.eth.getBalance(accounts[2]).valueOf());
        await lms.borrowBook(1, {from: accounts[2], value: web3.toWei(0.1)});
        // balance of owner and borrower's account after book borrow
        let ownerBal2 = web3.fromWei(web3.eth.getBalance(accounts[0]).valueOf());
        let borrowBal2 = web3.fromWei(web3.eth.getBalance(accounts[2]).valueOf());
        let contractBal = web3.fromWei(web3.eth.getBalance(lms.address).valueOf());
        // contract account get's 50% of the value
        assert.equal(contractBal, 0.05);
        // owner's account should get increased by approx 50% of sent value
        console.log(ownerBal2 - ownerBal1);
        console.log(0.05);
        console.log(borrowBal1-borrowBal2);
        assert.isAtMost(ownerBal2 - ownerBal1, 0.05);
        // borrower's account shoul d get decreased by atleat total sent value
        assert.isAtLeast(borrowBal1 - borrowBal2, 0.1);
    });
Wahrscheinlich aufgrund der JS-Gleitkommapräzision, und ein Vorschlag ist, Werte in BigNumber zu belassen (anstatt in Zeichenfolgen zu konvertieren und Berechnungen durchzuführen).
Ja, du hast recht. Ich habe jedes Mal wertgeschätzt. Durch das Entfernen von valueOf bei der Variablendeklaration wurde dieses Problem behoben. Vielen Dank!

Antworten (1)

Behalten Sie nach Möglichkeit Werte in BigNumber bei, um JavaScript- Präzisions- und Zahlenbeschränkungen zu vermeiden. Versuchen Sie, die Verwendung von zu vermeiden valueOf(), und arbeiten Sie bei Bedarf lieber mit BigNumber-Methoden.

Genauerer Code ist also wie folgt:

let ownerBal1 = web3.fromWei(web3.eth.getBalance(accounts[0]));

und

ownerBal2.sub(ownerBal1);