Nehmen wir an, ich habe eine dezentrale Anwendung, die es Menschen ermöglicht, ein Objekt zu einem beliebigen Preis zu kaufen.
Benutzer 1 kauft das Objekt für 1 eth. Wenige Augenblicke später kauft Benutzer 2 denselben Artikel. Wie kann ich dieses Ereignis überwachen und automatisch die entsprechende Menge Etherium an Benutzer 2 zurückgeben? Hier ist, was ich bisher habe:
contract Adoption {
address[16] public adopters;
function returnEth() public payable {
msg.sender.transfer(msg.value);
}
// Adopting a pet
function adopt(uint petId) public payable returns (uint) {
require(petId >= 0 && petId <= 15);
//require(msg.value == 1 ether);
adopters[petId] = msg.sender;
returnEth();
return petId;
//return value;
}
// Retrieving the adopters
function getAdopters() public view returns (address[16]) {
return adopters;
}
}
Wenn Sie zwischen den Zeilen lesen, sagen Sie, dass Benutzer 2 nicht berechtigt sein sollte, den Artikel zu kaufen, den Benutzer 1 bereits gekauft hat.
Wenn dies der Fall ist, sollte der Anruf des Benutzers 2 zum Kauf des Artikels fehlschlagen. Sie haben die Funktion, die zum Tätigen eines Kaufs verwendet wird, nicht freigegeben, aber sie sollte die Transaktion rückgängig machen, wenn der Artikel bereits verkauft ist.
<address>.transfer(<amount>)
.returnEth();
. Wenn Ihre Frage "Wie rufe ich eine Funktion aus web3.js auf?" das scheint nicht verwandt zu sein. Bitte stellen Sie es als neue Frage, aber lesen Sie zuerst einfach ein Tutorial, vielleicht sogar meins: programtheblockchain.com/posts/2017/12/13/… . (Ich denke jedoch, dass Sie vielleicht Truffle verwenden? Wenn ja, schauen Sie sich stattdessen ein Tutorial dafür an.)returnEth()
sollte niemals die Menge an Ether auf dem Konto des Anrufers verringern. Selbst wenn dies transfer
fehlschlägt, wird die Transaktion rückgängig gemacht, sodass sich kein Äther bewegt.adopt
diese Aufrufe returnEth
.)adopt()
, lande ich nach dem Aufruf bei >99.99999999 Ether.
Benutzer19510