Wir wissen, dass die Solidität die Float-Werte nicht unterstützt. Aber hier ( https://www.ethereum.org/token#understanding-the-code ) akzeptieren sie einen Eingabeparameter „Dezimalstellen“ für Berechnungszwecke. Wie wurde diese Aktion ausgeführt, wenn dieses Token unter Verwendung des mit Solidity geschriebenen Vertrags erstellt wurde?
Was bei unterteilbaren Token-Verträgen (und ETH selbst) tatsächlich passiert, ist, dass die tatsächliche Einheit winzig ist. Wirklich, wirklich winzig. Ein einzelner Äther ist eigentlich nur 10^18 Wei. Für die Benutzer wird es auf den verschiedenen Frontends als Dezimalzahl der ETH angezeigt.
Das gleiche Prinzip gilt für Token-Kontrakte. Intern ist es nur ein Standard-Uint mit gigantischen Zahlen, aber wenn es angezeigt wird, wird es vom Frontend in eine kleine, für Menschen lesbare Zahl umgewandelt.
Dies ist so, dass der Token in nahezu beliebiger Menge geteilt werden kann, und wenn es plötzlich noch mehr geteilt werden muss, muss nur das Frontend angepasst werden, um damit umzugehen.
Hier sind einige Beispiele aus der Antwort von @Matthew.
Wenn es ein Token mit gibt decimals = 2
, muss ein Benutzer eine balanceOf
100 haben, um 1,00 in Benutzeroberflächen (wie Mist oder Ethereum Wallet) zu sehen. Wenn der Benutzer balanceOf
nur 1 ist, sehen sie in der Benutzeroberfläche 0,01.
In Bezug auf den Code ist die Einstellung decimals
auf 16 eine einfache Möglichkeit, 100 Token für jede 1 ETH zuzuweisen. Wenn ein Vertrag 1 ETH erhält (was msg.value
10 ^ 18 entspricht) und einem Benutzer Token zuweist, balanceOf
wären die des Benutzers 10 ^ 18, aber 100 würden angezeigt (10 ^ 18 / 10 ^ 16).
Aniket
eth
balanceOf
15*10^18;decimals
wird 19 sein. Die Benutzeroberfläche zeigt die korrekte Anzahl von 1,5 (von 15 * 10 ^ 18 / 10 ^ 19) Token für den Benutzer an. Denken Sie daran, Verträge haben eine gigantische Anzahl, wie @Matthew erwähnt hat.