Ethereum-Token und Dezimalzahlen

Wie gehe ich am besten mit Dezimalzahlen um, wenn ich eine Währung erstelle?

Nehmen wir ein Beispiel. Ich habe KARLCOIN (KARL), und ich habe 1.000.000 davon, und der Token hat 6 Dezimalstellen. Dieser Token wird auch einen Crowdfund haben, bei dem 100 KARL = 1 ETH (0,01 ETH / KARL).

Wenn ich diesen Vertrag erstelle, sollte ich so etwas tun:

// Constructor
 function token() {
    owner = msg.sender;
   totalSupply = 1000000;
  balances[owner] = totalSupply;
  decimals = 6;
  symbol = "KARL";
  }    

Und dann hat dieser Token auch eine Funktion zum Übertragen.

Wie berechne, überweise und zeige ich nun diese Beträge an? Zum Beispiel sind 1.000.000 KARL 1.000.000.000.000 der kleinsten Einheit meiner Münze. Nennen wir es microKarl oder mk.

Bedeutet das, dass totalSupply in meinem Konstruktor eigentlich 1.000.000.000.000 sein sollte? Wenn ich Beträge an Personen überweise, überweise ich sie in mK? Im Grunde der Betrag von Karl * 1.000.000, um es in seine MikroKarl-Form zu bringen? Wie werden MyEtherWallet und MetMask und dergleichen wissen, wie sie den korrekten Betrag anzeigen?

Wenn ich web3 verwenden würde, um es anzuzeigen, könnte ich einfach rechnen und es selbst anzeigen. Holen Sie sich den Betrag in mK, multiplizieren Sie ihn mit 0,000001, und dann machen Sie sich auf den Weg. Recht? Oder liege ich hier daneben?

Ich habe einen Token erstellt und so etwas gemacht (es war eine lange Nacht) und mir die Token geschickt, und in MetaMask steht der richtige Betrag. Bei Etherscan ist dies nicht der Fall, es zeigt einen viel kleineren Betrag an und sagt auch, dass die Dezimalstellen "18" sind, als MetaMask sie als 6 erfasste, indem sie einfach die Vertragsadresse einfügten.

Ich bin nur ein bisschen verwirrt über die Dezimalisierung von Token und habe das Gefühl, dass ich nicht die Grundlage dafür habe, was ich tue, um dies zu debuggen. Jede Klarheit wäre willkommen.

Antworten (2)

Wenn Ihr Token dem ERC20-Standard folgt (und es sollte, wenn Sie möchten, dass es von Wallets oder Client-Anwendungen verarbeitet wird), können Sie Dezimalinformationen hinzufügen (es ist nicht obligatorisch, wird aber von den meisten Clients verarbeitet ) .

Ihr Vertrag sollte also in etwa Folgendes enthalten:

uint8 public constant decimals = 6;

Und Ihr Code sollte davon ausgehen, dass die Beträge in den kleinstmöglichen Einheiten angegeben sind.

Ja, ich habe die Dezimalzahlen. Aber auf MetaMask, wenn ich meine Token-Vertrags-ID eingebe, werden die Dezimalstellen automatisch als "6" geladen. Auf Etherscan steht dort „18“ und zeigt damit einen falschen Kontostand der Token an. Ich glaube, ich habe den Rest richtig gemacht ... muss ich den Vertrag auf Etherscan verifizieren, damit er die Dezimalstellen richtig liest?
Können Sie die Dezimalstellendeklaration in Ihrem Vertrag zeigen?
uint8 öffentliche Dezimalstellen = 0; Funktionstoken () zahlbar { Eigentümer = msg.sender; _totalSupply = 1000000000000; Guthaben [Eigentümer] = _totalSupply; Dezimalstellen = 6; symbol = "KARL"; } Und MetaMask kann dies gut lesen und zeigt den Wert korrekt an.
Der Vertrag wird hier mit 18 Dezimalstellen bei Etherscan und 6 in Metamask bereitgestellt: ropsten.etherscan.io/token/…
Nun ... Ich habe auf den Link geklickt, den Sie bereitgestellt haben, und er zeigt Token Decimals: 6 for me.
Hm. Es scheint jetzt aktualisiert worden zu sein. Vielleicht dauert es nur 24 Stunden oder so ... Meine anderen Bereitstellungen desselben Vertrags wurden jetzt ebenfalls aktualisiert, aber neue nicht. Vielen Dank!

Verwenden Sie es wie folgt:

uint256 public constant decimals = 6;
uint256 public constant totalSupply = 1000000*10**decimals;
Willkommen in der Community :), stellen Sie sicher, dass Sie Ihre Antwort ein wenig erklären, um die Lesbarkeit und Verständlichkeit zu verbessern :)
In der Ethereum-Blockchain wurde das Gesamtangebot mit 10^-nbr der Dezimalzahl multipliziert, weshalb Sie es in Ihrem Smart Contract mit 10^6 multiplizieren sollten, um Ihre Token-genaue Zahl zu erhalten