Owlio
DE
← Blog
AnleitungEinsteiger

ERC-20-Dezimalstellen: einen Rohsaldo als lesbare Menge darstellen

Eine große Vertragszahl kann eine kleine Tokenmenge bedeuten. Prüfen Sie die Einheiten, bevor Sie Wallet-Salden vergleichen.

Um einen ERC-20-Rohsaldo in eine lesbare Tokenmenge umzurechnen, teilen Sie die ganze Zahl durch 10 hoch den bestätigten Dezimalstellen des Tokens. Tun Sie das nur, wenn der Wert noch in rohen Basiseinheiten vorliegt. Eine Wallet oder ein Explorer kann die Umrechnung bereits vorgenommen haben.

Ein Rohsaldo von 1234567 mit 6 Dezimalstellen entspricht beispielsweise 1.234567 Token. Dieselbe rohe Ganzzahl mit 18 Dezimalstellen entspricht 0.000000000001234567 Token. Keines der Ergebnisse nennt einen Dollarwert. Es sind hypothetische Rechenbeispiele, keine aus einer Wallet abgefragten Salden.

Was Dezimalstellen beim Lesen eines Saldos ändern

Die Methode balanceOf eines ERC-20-Vertrags liefert eine ganze Zahl. Die ERC-20-Spezifikation beschreibt decimals als Skalierung für die Darstellung einer Tokenmenge gegenüber Nutzern. Stellen Sie sich die Ganzzahl als Anzahl der kleinsten Buchungseinheiten des Tokens vor. Die Dezimalstellen sagen der Anzeige, wo der Dezimalpunkt hingehört.

Die Rechnung lautet:

Lesbare Tokenmenge = rohe Ganzzahl geteilt durch (10 hoch decimals).

In diesem Artikel sind alle rohen Ganzzahlen zur Basis 10 und ohne Tausendertrennzeichen geschrieben. Ein hexadezimaler Wert, der mit 0x beginnt, muss zuerst als Ganzzahl dekodiert werden. Die Buchstaben und Ziffern dieser Kodierung sind keine dezimale Tokenmenge, die Sie unverändert in die Division einsetzen können.

Hier dieselbe hypothetische Ganzzahl mit drei unterschiedlichen Skalierungen:

Rohe Ganzzahl Dezimalstellen Tokenmenge
1234567 6 1.234567
1234567 18 0.000000000001234567
1234567 0 1234567

Bei 0 Dezimalstellen ist der Divisor 1. Bei 6 entspricht ein ganzer Token 1000000 rohen Einheiten. Bei 18 sind es 1000000000000000000 rohe Einheiten. Aus der Größe der Ganzzahl allein lässt sich die passende Skalierung nicht erkennen.

Ermitteln Sie vor der Rechnung die Skalierung

Beginnen Sie mit dem Netzwerk und der vollständigen Token-Vertragsadresse. Ein Symbol ist eine Bezeichnung, kein eindeutiger Bezeichner. Wenn Sie nicht sicher sind, welche Adresse zum Token und welche zum Inhaber gehört, lesen Sie zuerst die Anleitung zu Wallet-Adresse und Token-Vertrag.

Bestimmen Sie den Vertrag anhand der offiziellen Bereitstellungsinformationen des Projekts für dieses Netzwerk. Lesen Sie dann das Ergebnis von decimals über einen vertrauenswürdigen Explorer oder ein Werkzeug zum unverändernden Lesen des Vertrags aus. Halten Sie das Ergebnis zusammen mit Vertrag und Netzwerk fest. Metadaten einer anderen Bereitstellung klären die Skalierung Ihres Bestands nicht.

Ersetzen Sie einen fehlenden decimals-Wert nicht durch 18. ERC-20 macht die Methode optional. Die ERC20-Referenz von OpenZeppelin dokumentiert für ihre Implementierung einen überschreibbaren Standardwert von 18. Dieser Implementierungsstandard gilt nicht allgemein für Token. Dieselbe Referenz erklärt, dass Dezimalstellen der Anzeigeformatierung dienen. Sie ändern die Ganzzahlarithmetik des Vertrags für Salden und Übertragungen nicht.

Scheitert die Abfrage, unterscheiden Sie eine nicht verfügbare Quelle von einem Vertrag, der keine brauchbaren Metadaten bereitstellt. Versuchen Sie eine vertrauenswürdige Quelle für dieselbe Bereitstellung oder prüfen Sie die dokumentierte Implementierung. Bleibt die Skalierung ungeklärt, bewahren Sie die rohe Ganzzahl auf und kennzeichnen Sie die lesbare Menge als ungeklärt. Eine plausibel wirkende Zahl ist keine bestätigte Umrechnung.

Prüfen Sie, ob die Zahl bereits formatiert ist

Lesen Sie vor Anwendung der Formel die Feldbezeichnung und die Dokumentation der Quelle. Ein rohes Vertragsergebnis, eine normalisierte API-Menge und eine gerundete Wallet-Anzeige können denselben Bestand unterschiedlich beschreiben. Ein Dezimalpunkt deutet auf Formatierung hin. Sein Fehlen beweist aber keinen Rohwert: Eine formatierte Menge kann genau 2 Token betragen.

Bei einem hypothetischen Token mit 6 Dezimalstellen wird aus roh 2500000 eine Menge von 2.5 Token. Zeigt Ihre Wallet bereits 2.5 Token, ergibt das Teilen dieser Anzeige durch 1000000 den Wert 0.0000025, eine falsche zweite Umrechnung.

Wenden Sie nach Ermittlung der genauen Tokenmenge die Anzeigerundung getrennt an. Roh 1 mit 6 Dezimalstellen entspricht 0.000001 Token. Eine Oberfläche mit höchstens 4 Nachkommastellen kann 0.0000 anzeigen. Diese gerundete Anzeige belegt keinen leeren Saldo. Halten Sie bei der Untersuchung einer Abweichung das genaue Ergebnis verfügbar, ohne zusätzliche aussagekräftige Ziffern über die Quellgenauigkeit hinaus zu erfinden.

Bewahren Sie die rohe Ganzzahl für ein Skript oder eine Tabelle bis zur Formatierung als Text oder exakte Ganzzahl auf. Große Ganzzahlen können in einem gewöhnlichen JavaScript-Number Genauigkeit verlieren, wie die MDN-Referenz zu sicheren Ganzzahlen erläutert. Division stellt verlorene Genauigkeit nicht wieder her. Die Dokumentation von ethers v6 bietet formatUnits, das eine Dezimalzeichenfolge zurückgibt. Übergeben Sie die bestätigten Dezimalstellen ausdrücklich und behalten Sie diese Zeichenfolge bei, statt sie aus Bequemlichkeit in eine ungenaue Zahl umzuwandeln.

Gleichen Sie zwei Abfragen ohne Tokenbewegung ab

Verwenden Sie für die Prüfung einen einzigen Bestand. Das Lesen öffentlicher Vertragsdaten erfordert weder Übertragung noch Freigabe, Wiederherstellungsphrase oder Wallet-Signatur.

  1. Identität festhalten. Notieren Sie Netzwerk, öffentliche Inhaberadresse und bestätigten Token-Vertrag. Setzen Sie beim Lesen des Inhabersaldos nicht die Vertragsadresse anstelle der Inhaberadresse ein.
  2. Beobachtung festhalten. Bewahren Sie Uhrzeit und, falls verfügbar, Blocknummer auf. Bevorzugen Sie Werte aus demselben Block. Sonst kann eine Übertragung zwischen den Beobachtungen eine genaue Übereinstimmung verhindern.
  3. Eingaben kennzeichnen. Speichern Sie den Originalwert, seinen rohen oder formatierten Zustand und den Nachweis der Vertragsdezimalstellen. Erklärt eine Quelle ihre Einheiten nicht, stoppen Sie dort die Umrechnung.
  4. Einmal skalieren. Rechnen Sie die rohe Ganzzahl mit diesen Dezimalstellen um und behalten Sie vor jeder Anzeigerundung die exakten Ziffern. Lassen Sie eine bereits in Tokeneinheiten gelieferte Menge unverändert.
  5. Gleiche Einheiten vergleichen. Vergleichen Sie diese Tokenmenge mit der Tokenmenge der anderen Anzeige bei vereinbarer Genauigkeit. Fordern Sie bei einer gerundeten Null mehr Details an, bevor Sie einen Rohsaldo von null annehmen.
  6. Verbleibende Abweichung behandeln. Stimmen Identität, Beobachtungsstand und Einheiten überein, die Mengen aber nicht, dokumentieren Sie beide Werte und Quellen. Fällt eine Quelle aus, kennzeichnen Sie die Abfrage als nicht verfügbar, statt null einzusetzen. Die Anleitung zu Portfolioabweichungen behandelt fehlende Quellantworten, Preise und die Abdeckung von Positionen.

Das nützliche Ergebnis ist eine für andere reproduzierbare Aufzeichnung: welcher Vertrag, wessen Saldo, welche Beobachtung, welcher Rohwert, welche Dezimalstellen und welche umgerechnete Menge. Eine Transaktion gehört nicht zum Nachweis der Umrechnung.

Trennen Sie Tokenmenge und Wert

Die Formatierung liefert eine Anzahl dieses Tokens. Eine Dollarschätzung benötigt zusätzlich einen Preis für genau diesen Vermögenswert, in einer genannten Währung und zu einem genannten Zeitpunkt. Dezimalstellen bestimmen weder diesen Preis noch Handelsliquidität oder Vertragssicherheit. Ein unbekannter Token kann einen völlig gewöhnlichen decimals-Wert liefern.

Ein Beleg- oder Wrapper-Token wirft eine weitere Frage auf: Wie viel Basisvermögenswert repräsentiert jeder Token? Die Umrechnung seines Rohsaldos liefert Beleg- oder Wrapper-Token. Ein Gegenwert im Basisvermögenswert benötigt die Umrechnungsmethode und Einheiten des betreffenden Protokolls. Die Dezimalstellen eines Tokens ersetzen diesen Wechselkurs nicht. Auch eine Protokollkennzahl wie ein Gesundheitsfaktor benötigt ihre eigene dokumentierte Skalierung.

Wirkt die Zahl weiterhin falsch, behalten Sie die entscheidende Unbekannte bei. Unbekannte Dezimalstellen lassen die lesbare Menge ungeklärt. Eine bekannte Menge bei unbekanntem Preis lässt die Bewertung ungeklärt. Diese Lücken ausdrücklich festzuhalten ermöglicht eine sinnvolle nächste Prüfung, ohne den untersuchten Bestand zu verändern.

Häufige Fragen

Haben alle ERC-20-Token 18 Dezimalstellen?

Nein. Die ERC20-Implementierung von OpenZeppelin verwendet standardmäßig 18, doch ERC-20 schreibt diesen Wert nicht vor. Die Methode decimals ist optional. Ermitteln Sie vor der Umrechnung eines Rohsaldos die Dezimalstellen des genauen Vertrags im richtigen Netzwerk.

Soll ich den angezeigten Wallet-Betrag anhand der Dezimalstellen teilen?

Nur ein als rohe Basiseinheiten dokumentierter Betrag muss skaliert werden. Eine Wallet kann bereits die lesbare Tokenmenge anzeigen. Erneutes Teilen einer formatierten Menge verfälscht sie. Klären Sie zuerst die Einheiten des gelesenen Feldes.

Beweist eine angezeigte Null einen leeren Tokensaldo?

Nein. Eine Anzeige kann eine kleine positive Menge auf null runden. Prüfen Sie eine genauere Menge oder den Rohsaldo mit bestätigten Dezimalstellen. Ein erfolgreich gelesener Rohsaldo von null und eine nicht verfügbare Abfrage sind unterschiedliche Ergebnisse.