¿Cómo obtener el saldo de una dirección con el cliente bitcoin?

Quiero ver el saldo de alguna dirección usando bitcoind.

Configuré txindex=1e hice una -reindexpara indexar todas las transacciones.

Pero aún así, no parece haber una forma de obtener saldos de una dirección. getreceivedbyaddressno funciona con direcciones fuera de su propia billetera (esperé que lo hiciera después de un -txindex=1 -reindex, pero no fue así).

Me pregunto por qué blockexplorer.com getreceivedbyaddresspuede hacer esto para cualquier dirección pero el cliente predeterminado no puede. Si descarga y sincroniza toda la cadena de bloques, debería poder consultarla para obtener información, ¿verdad?

Si bien no sé la respuesta a su pregunta, me gustaría señalar que txindexno es relevante aquí, ya que el cliente no necesita el índice completo para obtener el saldo de una dirección determinada.
Pensé que podría, pero en realidad no parece ser así.
encontrado alguna solucion?
@coding_idiot No es posible (intencionalmente) consultar información usando bitcoind. Solo mantiene un índice para las transacciones que son relevantes para su billetera.
Puede usar la API de algún explorador de bitcoin como api.blockcypher.com/v1/btc/main/addrs/… . También hay algún explorador de código abierto como github.com/blockcypher/explorer

Respuestas (6)

Por defecto, lo que mantiene el motor blockchain 0.8 es:

  • Todos los bloques
  • Una base de datos con todos los encabezados de bloque y las posiciones en el disco para cada bloque
  • Una base de datos que representa todas las salidas de transacciones no gastadas (UTXO), indexadas por txid, en el extremo actual de la cadena de bloques
  • Deshacer archivos que permiten rebobinar los efectos de los bloques en este conjunto de UTXO.

En este nivel no existe nada relacionado con direcciones o saldos. Esa es solo una representación del lado del cliente de los datos. El saldo de una billetera es la suma de los valores de los UTXO que se pueden gastar con el juego de llaves en la billetera. Puede definir el saldo de una dirección como la suma de los valores de los UTXO asignados a un script que coincide con una dirección determinada (y esto es lo que hacen varios sitios), pero presentarlo de esta manera es bastante confuso: hace que muchas personas piensen que Las transacciones de Bitcoin transfieren valor de una dirección a otra. Esto no es cierto, consumen salidas específicas de una transacción anterior y las fusionan y dividen en nuevas salidas.

La -txindexopción que mencionas, agrega una cosa más que mantiene el motor de validación:

  • Una base de datos con las posiciones en disco de cada transacción , indexada por txid.

Esto se agregó para que el getrawtransactioncomando funcione con transacciones históricas, pero nuevamente, esto no tiene nada que ver con las direcciones. Sería posible una base de datos que indexe el UTXO establecido por dirección, o incluso el historial completo de la cadena de bloques por dirección, pero sería relativamente costoso de mantener y no debería ser necesario para las operaciones normales (aunque es bastante útil para la depuración). ..).

Donde esas cosas pertenecen, es en la billetera. La billetera, tal como la presenta el cliente de referencia, no utiliza el "saldo de una dirección", sino que ve las direcciones como puntos de entrada a la billetera, pero administra las monedas en toda la billetera juntas, independientemente de a qué dirección se enviaron por última vez. Esto también confunde a las personas que están acostumbradas a mirar sitios web similares a BlockExplorer, cuando se dan cuenta de que, por ejemplo, el cambio siempre se envía a una dirección nueva.

Entonces, para dar una respuesta real: si realmente desea realizar un seguimiento de un saldo, necesita la interfaz de la billetera. En este momento, esto es bastante inflexible, pero hay planes para mejorar esta situación pronto. Con suerte, pronto obtendremos soporte para múltiples billeteras y billeteras de solo reloj, donde puede agregar direcciones que le gustaría rastrear, sin tener sus claves.

Tal vez debería agregar una pequeña sección sobre cómo calcular la información que estoy buscando usando la funcionalidad actual de bitcoind. Supongo que tengo que usar listunspento algo así? ¿O es realmente simplemente imposible?
Es simplemente imposible, a menos que tengas una billetera con las llaves adentro.
Bueno, no es imposible en teoría: si tiene -txindex habilitado, puede iterar a través de todos los bloques usando getblockhashy getblock, iterar a través de todas las transacciones en cada bloque usando getrawtransaction, y buscar salidas que acrediten la dirección que desea, o que se consuman en una entrada. Esto probablemente tomaría horas...
¿Esto se debe a que el cliente solo verifica las transacciones que incluyen direcciones en la billetera? No puedo ver una razón por la cual se necesitarían claves privadas para ese proceso. Si tengo razón, esto es solo una deficiencia del cliente original que solo quiere indexar saldos para sus propias direcciones. ¿Y que, en caso de implementarse, podría incluso hacer esto para cualquier otra dirección?
No indexa ningún saldo de direcciones en absoluto, pero para las direcciones conocidas por la billetera, las rastrea (durante la descarga/sincronización/reescaneo de la cadena de bloques). Y esto es de hecho una deficiencia. Hay una característica planificada para permitir "carteras de solo reloj", lo que permitiría importar direcciones en lugar de claves.
Parece que esto casi podría ser posible pronto: github.com/bitcoin/bitcoin/pull/2121
¿Ha cambiado la situación? ¿Hay alguna forma ahora?
Sí, use direcciones de solo vigilancia.
@PieterWuille Hola, ¿hay algunos cambios relacionados con la detección del saldo de direcciones de bitcoin? ¿Puedo recibir el saldo de alguna dirección de bitcoin directamente desde el nodo completo implementado? ¿Quiero decir sin análisis de UTXO?
  1. importar todas las direcciones usando "importaddress"
  2. puede obtener el saldo usando "listunspent", pero debe sumar todo el monto no gastado por dirección.

Esto proviene de la lista de llamadas del cliente/API de Bitcoin original con respecto al comando getreceivedbyaddress.

Devuelve el importe total recibido por en transacciones con al menos [minconf] confirmaciones. Si bien algunos pueden considerar esto obvio, el valor informado por esto solo considera recibir transacciones. No comprueba los pagos que se han realizado desde esta dirección. En otras palabras, esto no es "getaddressbalance". Funciona solo para direcciones en la billetera local, las direcciones externas siempre mostrarán 0. [Negrita agregada por mí.]

Técnicamente tienes razón; la cadena de bloques lleva la información que está buscando. Sin embargo, el cliente original no tiene la función para calcularlo.

Sabía que se notaba así, pero quería saber por qué era así y si existe un método alternativo para lograr finalmente lo getreceivedbyaddressque no se puede.
Lo siento, pero ¿cómo es que estás usando getaddressbalance ? ¿Qué versión de bitcoind estás usando?
¿Cómo puedo usar getreceivedbyaddress? ¿A qué debo enviarlo? ¿Hay algún ejemplo simple de este comando o cualquier otro?
@earthmeLon: supongo que el getaddressbalance@jorijnsmit mencionado fue solo un comando hipotético.
No devuelve ningún monto en el caso de 1 of nmúltiples firmas, incluso si se reconoce como mío.

El concepto de "saldo de dirección" se basa en la confusión.

La forma en que Bitcoin está diseñado, hay tres conceptos diferentes relacionados: direcciones, billeteras y cuentas. Las billeteras se componen de una o más cuentas, cada una con un saldo (que incluso puede ser negativo). La billetera en su conjunto tiene un saldo que suma la suma de todas las cuentas (que siempre debe ser positivo).

Las direcciones son simplemente puntos de entrada a una billetera; no tienen saldos y solo deben usarse una vez*. Las direcciones están asociadas a una cuenta: cuando se reciben monedas en la dirección, se acredita esa cuenta; tenga en cuenta que esta es una asociación unidireccional: la cuenta no está asociada a la dirección, ni la moneda recibida; su saldo simplemente se incrementa por la cantidad recibida. Cuando gasta bitcoins, su billetera elige monedas para gastar (más o menos) al azar, sin preocuparse por cómo se recibieron, y generalmente usará una dirección invisible completamente nueva internamente, que no verá como un final. usuario. En general, estas son algunas de las razones por las que tiene poco sentido hablar de un "saldo de direcciones".

* Si bien es bastante común que las personas reutilicen las direcciones para depósitos o donaciones, hacerlo es perjudicial para usted y para otras personas que usan Bitcoin de varias maneras que están fuera del alcance de esta pregunta.

Por el contrario, las cuentas y las billeteras no son reales, mientras que solo las direcciones sí lo son. Diría que todas las salidas no gastadas con una dirección determinada constituyen el saldo de la dirección. Debe haber una forma en bitcoind de consultar la lista de salidas no gastadas para una dirección determinada (independientemente de si está en mi "billetera" o "cuenta")
@ Jus12 Puede usar el scantxoutsetRPC para eso ahora, que escanea el conjunto UTXO en lugar de toda la cadena de bloques.

"Esperamos que pronto obtengamos soporte para (...) monederos de solo visualización, en los que puede agregar direcciones que le gustaría rastrear, sin tener sus claves". –Pieter Wuille

Por lo que he visto, Pieter Wuille y otros incluyeron esta función en la versión 0.10.0 de Bitcoin Core , por lo que ahora es posible usar Bitcoin Core para obtener el saldo de cualquier dirección simplemente siguiendo estos pasos:

1) Cree una nueva billetera (detenga el programa, cambie el nombre del antiguo archivo wallet.dat, reinicie el programa y creará una nueva billetera.dat vacía).

2) Inicie Bitcoin Core y vaya a Ayuda > Ventana de depuración > Consola.

3) En la línea de comandos de la consola, ejecute el siguiente comando :

direcciónimportada la_dirección_en la que_está_interesado

Tenga en cuenta que esto hará que el programa vuelva a escanear toda la cadena de bloques, lo que puede llevar varios minutos.

Luego puede cerrar la ventana de depuración. Ahora la ventana principal del programa muestra dos columnas de saldos, la primera es el saldo de las direcciones normales en la billetera (aquellas cuyos bitcoins puede gastar), y la segunda es el saldo de las direcciones de solo reloj en la cartera. Este último es lo que estabas buscando.

Una vez que haya terminado, puede detener el programa, eliminar o cambiar el nombre de la billetera o moverla a otro lugar, y cambiar el nombre de la billetera anterior a "wallet.dat".

Tenga en cuenta que el cliente de Bitcoin debe tener una copia actualizada de toda la cadena de bloques, ya que la opción predeterminada rescan=true de importaddress no acepta cadenas de bloques recortadas, y rescan=false no mostrará el saldo actual.

No he probado esto y no soy un experto en bitcoins, así que tome esta respuesta con precaución.

Interesante saber ¿Esto también sería posible solo en la línea de comandos? ¿Cómo podría consultar el resultado una vez finalizada la indexación?

He escrito un programa en Python3 que le permite buscar cualquier dirección en el núcleo de bitcoin, ya sea que pertenezca a su billetera o no.

Aquí está el enlace de github:

https://github.com/ORP967/Bitcoin_Core_RPC_par_address

Déjame saber lo que piensas o si tienes alguna mejora que puedas tener.