¿Por qué mi saldo no es igual a la suma de las entradas, menos la suma de las salidas y las tarifas?

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é?

Un ejemplo

Elegí una cuenta al azar que tiene este "problema".

Todas las transacciones de la cuenta:

Reescribamos estos valores de transacción...

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

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)

¿Qué es esta magia oscura?

¿Esta cuenta generó Ether de la nada?

Este problema también causa problemas para los intercambios, a veces: ethereum.stackexchange.com/questions/4270/…
Yo mismo tuve este problema antes, es muy inconveniente cuando estás tratando de administrar un negocio y los libros no cuadran. ¡Algo que debe mejorarse en el espacio criptográfico!

Respuestas (1)

¿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í.

Entonces, ¿cómo se obtiene el equilibrio real?

Si hace clic en la transacción más reciente emitida por la cuenta (la que tiene un valor de salida 0), verá esto:

ingrese la descripción de la imagen aquí

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!

Pero tengo este problema y no he enviado ni recibido ninguna transacción .

"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.