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?
Ich habe zufällig ein Konto ausgewählt, bei dem dieses „Problem“ auftritt.
Alle Kontobewegungen:
Lassen Sie uns diese Transaktionswerte umschreiben...
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:
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)
Hat dieses Konto Ether aus dem Nichts generiert?
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.
Wenn Sie auf die letzte Transaktion klicken, die vom Konto ausgegeben wurde (diejenige mit einem ausgehenden Wert von 0), sehen Sie Folgendes:
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!
„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.
Schnitzer
Adam