Buy()-Funktion verhält sich nicht wie erwartet

Ich experimentiere mit dem MyAdvancedTokenCode unter: https://www.ethereum.org/token

    function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner public {
        sellPrice = newSellPrice;
        buyPrice = newBuyPrice;
    }

    function buy() payable public {
        uint amount = msg.value / buyPrice;               // calculates the amount
        _transfer(this, msg.sender, amount);              // makes the transfers
    }

Wenn die amount purchased = msg.value/buyPrice, wie ist es jemals möglich, einen Token zu kaufen, der weniger als 1ETH wert ist? buyPricekann keine Dezimalzahl kleiner als 1 sein. Mit anderen Worten, ich möchte, dass eine Person 1 ETH senden und 10 Token erhalten kann. Diese Mathematik lässt das nicht zu ( buyPricekann nicht 0,1 sein).

Ein Teil der Dokumentation besagt das valueund buyPricesollte in wei sein, nicht in ETH. In diesem Fall könnte ich die Mathematik zum Laufen bringen. Beim Testen mit MyEtherWallet und der Ethereum Wallet-Anwendung sehe ich jedoch, dass ich msg.valueals ETH rüberkomme. Wenn ich 1 ETH sende, mit buyPrice = 10, kauft der Benutzer am Ende 0,1 Token.

Gibt es einen Trick, um msg.valuewei anstelle von ETH zu bekommen?

Danke.

Antworten (1)

Innerhalb eines Vertrages msg.valueist immer Wei. Front-End-Anwendungen zeigen manchmal Werte in Eth als „Bequemlichkeit“ für den Benutzer an, aber innerhalb der Transaktion ist es immer Wei.

Beachten Sie, dass Ähnliches für Token-Werte innerhalb von Verträgen gilt. MyAdvancedTokenDieses Token ist beispielsweise decimalsauf 18 gesetzt (dasselbe wie Ether). Wenn Sie 0,1 Token kaufen, kaufen Sie intern tatsächlich 10 17 Token. Eine Benutzerschnittstelle kann den decimalsParameter verwenden, um dies zur Anzeige in 0,1 zu übersetzen.


[Um das jetzt zu erweitern, ich bin nicht mehr auf dem Handy.]

Sowohl für Ether als auch für Token gibt es zwei Dinge:

  1. Die interne Darstellung, die immer eine Ganzzahl ist. Für Ether ist dies Wei.
  2. Die Darstellung der Benutzeroberfläche, die unterschiedlich sein kann. UIs wissen, dass 1 Eth = 10^18 Wei (dh 18 Dezimalstellen). ERC20-Token teilen dem UI über den Parameter mit, aus wie vielen internen Einheiten ein ganzer Token besteht decimals. Das ist oft auch 18, muss aber nicht sein.

In Ihrem Beispiel MyAdvancedTokenist es decimalsgleich 18, genau wie Ether. Sie können also nicht mehr Token ausgeben als die Menge an Ether, die hereinkommt, da buyPricees sich um eine Ganzzahl von eins oder mehr handelt.

Wenn Sie 10 Token für 1 Eth ausgeben möchten, können Sie einen der folgenden Schritte ausführen:

  • buyPriceAuf 1 und 17 einstellen decimals. Jeder Wei kauft 1 Token, aber die Benutzeroberfläche zeigt ihn als 10x größer an.

  • Stellen Sie buyPriceauf 10 17 und decimalsauf 0 ein. Jeder Ether kauft 10 Basis-Token und sie werden als ganze Token angezeigt.

  • buyPriceAuf 10 x und decimalsauf einstellen 17 - x.

Oder Sie können das alles vergessen und einfach mit der Umkehrung von buyPrice(10) multiplizieren, anstatt durch den Kaufpreis zu dividieren. Dies ist wahrscheinlich das einfachste.


Das alles bereitet natürlich große Kopfschmerzen. Ich hasse das ERC20-Token- decimalsKonzept wirklich. Hier ist eine lange Diskussion darüber. Ich bevorzuge Hardcoding decimalsauf 0, fwiw.

Mit anderen Worten, in allen Verträgen, die unter Verwendung dieses ethereum.org-Boilerplate-Codes abgeschlossen wurden, darf ein gekaufter Token keinen Wert von weniger als 1 ETH haben? Danke für die tolle Antwort.