Espero poder calcular el saldo de una cuenta de esta manera: sume el valor de todas las transacciones entrantes y reste el valor de todas las transacciones salientes, luego reste todas las tarifas pagadas.
Sin embargo, cuando uso este método, obtengo un saldo diferente de varias otras fuentes, como: eth.getBalance(account)
y Etherscan. ¿Por qué?
Elegí una cuenta al azar que tiene este "problema".
Todas las transacciones de la cuenta:
Reescribamos estos valores de transacción...
en código pitón:
inbound = ['10']
outbound = ['9', '0.92']
paid_fees = ['0.00045932', '0.010846898028', '0.00084084']
Saldo de la cuenta:
Entonces, cuando calculamos la suma, espero obtener el mismo saldo que muestra Etherscan:
En cambio, obtengo Decimal('0.067852941972')
del siguiente cálculo:
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)
¿Esta cuenta generó Ether de la nada?
¿Esta cuenta generó Ether de la nada?
no _ Ethereum no está roto, y tampoco lo están ENS o Etherscan. Aunque Etherscan podría ser más claro sobre lo que está pasando aquí.
Si hace clic en la transacción más reciente emitida por la cuenta (la que tiene un valor de salida 0), verá esto:
Lo siento, está torpemente recortado. Estoy tratando de darle un poco de privacidad a esta persona al azar.
La primera y la tercera TRANSFERENCIA se envían de vuelta a la cuenta que emitió la transacción. Aunque es una transacción saliente, con valor 0, ¡la cuenta en realidad recuperó Ether! Entonces, ¿cuál es el nuevo saldo?
from decimal import Decimal
real_ether_balance = total_ether + Decimal('0.02') + Decimal('0.0045')
El verdadero saldo es:Decimal('0.09235')
¡Dulce, todo vuelve a sumar!
"Transacciones internas" es la forma en que Etherscan se refiere cuando un contrato envía ether a alguna parte. Cualquier contrato puede emitir "transacciones internas" (realmente solo enviando ether) cuando se ejecuta. El contrato lo puedes enviar a cualquier cuenta.
Por lo tanto, una cuenta con cero transacciones entrantes y cero salientes aún puede tener un saldo.
¿Cómo?
Digamos que la cuenta Alice no tiene transacciones de entrada o salida. Cuenta Betty puede enviar una transacción que ejecuta una función en el contrato de Carly. Durante la ejecución, el contrato de Carly puede "enviar" éter a la cuenta de Alice. Esto no genera una nueva transacción, solo aumenta el saldo de Alice y disminuye el saldo de Carly.
tallista
Adán