Warum entspricht mein Guthaben nicht der Summe der eingehenden Zahlungen abzüglich der Summe der ausgehenden Zahlungen und Gebühren?

Ich gehe davon aus, dass ich den Kontostand auf diese Weise berechnen kann: Addieren Sie den Wert aller eingehenden Transaktionen und subtrahieren Sie den Wert aller ausgehenden Transaktionen und subtrahieren Sie dann alle gezahlten Gebühren.

Wenn ich diese Methode verwende, erhalte ich jedoch ein anderes Gleichgewicht als bei mehreren anderen Quellen, wie: eth.getBalance(account)und Etherscan. Wieso den?

Ein Beispiel

Ich habe zufällig ein Konto ausgewählt, bei dem dieses „Problem“ auftritt.

Alle Kontobewegungen:

Lassen Sie uns diese Transaktionswerte umschreiben...

Geben Sie hier die Bildbeschreibung ein

im Python-Code:

inbound = ['10']
outbound = ['9', '0.92']
paid_fees = ['0.00045932', '0.010846898028', '0.00084084']

Kontostand:

Wenn wir also die Summe berechnen, erwarte ich dasselbe wie die Bilanz, die Etherscan anzeigt:

Geben Sie hier die Bildbeschreibung ein

Stattdessen erhalte ich Decimal('0.067852941972')folgende Rechnung:

from web3 import Web3

total = sum(Web3.toWei(income, 'ether') for income in inbound)
for ether_spent in outbound + paid_fees:
    total -= Web3.toWei(ether_spent, 'ether')

total_ether = Web3.fromWei(total, 'ether')
print(total_ether)

Was ist diese dunkle Magie?

Hat dieses Konto Ether aus dem Nichts generiert?

Dieses Problem verursacht manchmal auch Probleme für Börsen: ethereum.stackexchange.com/questions/4270/…
Ich hatte dieses Problem selbst schon einmal, es ist sehr unpraktisch, wenn Sie versuchen, ein Geschäft zu führen, und die Bücher nicht ausgeglichen sind! Etwas, das im Krypto-Bereich verbessert werden muss!

Antworten (1)

Hat dieses Konto Ether aus dem Nichts generiert?

Nein . Ethereum ist nicht kaputt und ENS oder Etherscan auch nicht. Obwohl Etherscan klarer sein könnte, was hier passiert.

Wie bekommt man also das richtige Gleichgewicht?

Wenn Sie auf die letzte Transaktion klicken, die vom Konto ausgegeben wurde (diejenige mit einem ausgehenden Wert von 0), sehen Sie Folgendes:

Geben Sie hier die Bildbeschreibung ein

Tut mir leid, dass es ungeschickt abgeschnitten ist. Ich versuche, dieser zufälligen Person ein bisschen Privatsphäre zu geben.

Die erste und dritte ÜBERWEISUNG werden an das Konto zurückgesendet, das die Transaktion ausgestellt hat. Obwohl es sich um eine ausgehende Transaktion mit einem Wert von 0 handelt, hat das Konto tatsächlich Ether zurückbekommen! Was ist also das neue Gleichgewicht?

from decimal import Decimal
real_ether_balance = total_ether + Decimal('0.02') + Decimal('0.0045')

Das wirkliche Gleichgewicht ist:Decimal('0.09235')

Süß, alles passt wieder!

Aber ich habe dieses Problem und ich habe keine Transaktionen gesendet oder empfangen

„Interne Transaktionen“ nennt Etherscan es, wenn ein Vertrag Ether irgendwohin schickt. Jeder Vertrag kann „interne Transaktionen“ ausgeben (eigentlich nur Ether senden), wenn er ausgeführt wird. Der Vertrag kann es an ein beliebiges Konto senden.

Ein Konto mit null eingehenden und null ausgehenden Transaktionen kann also immer noch einen Saldo haben.

Wie?

Nehmen wir an, das Konto Alice hat keine eingehenden oder ausgehenden Transaktionen. Konto Betty kann eine Transaktion senden, die eine Funktion auf Vertrag Carly ausführt. Während der Vertragsausführung kann Carly Ether an Konto Alice „senden“. Dies löst keine neue Transaktion aus, sondern erhöht lediglich das Guthaben von Alice und verringert das Guthaben von Carly.