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);
});
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);
eth
Sanchit