Cálculo de una suma de bitcoins recibidos

Tengo una lista de direcciones de bitcoin proporcionadas por un usuario y estoy tratando de averiguar una suma depositada en estas direcciones. Estoy usando la API blockexplorer.com para obtener transacciones.

Esta es una llamada API típica (por conveniencia solo para una dirección) que hace mi script. La llamada admite parámetros fromy to, estos se pueden usar para optimizar de manera efectiva un libro de transacciones completo.

https://blockexplorer.com/api/addrs/1Archive1n2C579dMsAu3iC6tWzuQJz8dN/txs?from=0&to=20

Parece que no hay ningún error en mi algoritmo de simplificación, pero si resumo los valores encontrados en valueIn(que presumiblemente deberían representar los valores enviados a una dirección), el resultado es completamente incorrecto en comparación con el resultado devuelto en la llamada a la API totalReceived.

https://blockexplorer.com/api/addr/1Archive1n2C579dMsAu3iC6tWzuQJz8dN/totalReceived

¿Por qué obtengo resultados totalmente diferentes?

¿Es esta una forma correcta de averiguar si una determinada cantidad se depositó en la dirección (o direcciones)?

Dato curioso: blockexplorer.com devuelve un valor totalReceivedque es diferente del valor devuelto por blockchain.info.

Respuestas (2)

¿Por qué obtengo resultados totalmente diferentes?

Te encontrarás con mucha confusión con este tipo de API, simplemente porque la información que muestran no está estandarizada y, para empezar, no está presente en la cadena de bloques de Bitcoin. Como resultado, hay muy poca continuidad en estos valores entre los servicios; en general, no está claro cómo se les ocurren estos valores a ninguno de ellos.

En este caso, el "total recibido" probablemente se refiera a la cantidad de salidas que han sido confirmadas y que pasan al OP_DUP OP_HASH160 6c1b511a63306b6294e1d3390ac8cd481f76705d OP_EQUALVERIFY OP_CHECKSIGscript para la dirección P2PKH que publicaste. Algunos exploradores de bloques restan las salidas de cambio de esta cantidad, como en esta transacción donde 1Archive se reutiliza para el resto que no se gasta en una nueva dirección.

El "total recibido" para su dirección de ejemplo en algunos servicios diferentes:

El "saldo" de una dirección, como lo muestran estas API, presumiblemente contiene un total de todas las salidas no gastadas confirmadas con ese script, pero dependiendo de la API, esto a veces incluye transacciones no confirmadas o simplemente valores indescifrables como negativos.

¿Es esta una forma correcta de averiguar si una determinada cantidad se depositó en la dirección (o direcciones)?

Probablemente no, si puede, puede usar un nodo Bitcoin Core y la función de solo observación para monitorear su lista de direcciones y obtener una verificación independiente de cuánto Bitcoin está disponible para gastar. Sin embargo, esto será lento de configurar y no es adecuado para situaciones en las que agregará nuevas direcciones con frecuencia (lleva tiempo volver a procesar los datos históricos, posiblemente hasta 30 minutos ahora). Si debe usar estas API, probablemente sea mejor que use el punto final de salidas no gastadas disponible y haga un recuento de ellas usted mismo.

Las transacciones pueden tener múltiples salidas y múltiples entradas. El campo valueIn es la suma de todas las entradas de la transacción, no la cantidad que va hacia la dirección que le interesa.

En lugar de sumar valueIn, debe hacer una lista de todas las salidas, luego filtrar las que no se envían a la dirección que le interesa y luego resumirlas.

Dato curioso: blockexplorer.com devuelve un valor de totalReceived que es diferente del valor devuelto por blockchain.info.

El significado de 'total recibido' no está bien definido. Por ejemplo, si tomo dinero en la dirección A y lo envío a la dirección A, ¿ha "recibido" dinero la dirección A? Diferentes API calculan esto de manera diferente.

Nota: supongo que intencionalmente no busca encontrar el saldo de la dirección, que está bien definida.

La razón por la que no estoy buscando un saldo es que, según tengo entendido, este valor se reduce cuando el valor se envía desde esta dirección. Lo que busco es el valor real transmitido a una dirección sin tener en cuenta los posibles "retiros". Mi aplicación permite a los usuarios pegar una lista de direcciones, luego las monitorea todas, resumiendo la cantidad de bitcoins que se les envía.