Estoy usando bitcoinj para escuchar pagos. Necesito una forma de mantener todo el conjunto UTXO en una base de datos local.
¿Se puede usar bitcoinj para descargar cada bloque (creo que solo descarga bloques recientes y encabezados para bloques más antiguos)?
No necesito usar bitcoinj o incluso Java para crear o mantener esta base de datos si existe una solución mejor. ¿Hay algo como esto?
Idealmente, lo que quiero es una billetera que descargue solo el conjunto UTXO sin descargar toda la cadena de bloques (debido a las limitaciones de ancho de banda) y la mantenga a partir de ese momento. Debe ser el conjunto completo, no solo las direcciones que poseo. Además, necesito una API que permita las siguientes consultas:
Creo que actualmente no es posible validar un determinado conjunto de UTXO sin descargar toda la cadena de bloques, por lo que también se agradecería alguna solución en este sentido.
Sí, por defecto bitcoinj descarga bloques completos, desde el Génesis. Solo si conecta una billetera, utiliza optimizaciones como puntos de control y filtros.
No es posible simplemente descargar el conjunto UTXO (sin confianza), porque el protocolo Bitcoin no está diseñado para eso. Puede obtener UTXO de exploradores de bloques y servidores Electrum, pero será sin prueba criptográfica.
Si dejas de lado los temas de confianza, validación de los datos, mantenerlos actualizados y demás. Si solo desea una instantánea única para algún propósito académico, puede pedirle a un amigo que usa Bitcoin Core que le dé una copia de su carpeta chainstate , pero tendría que extraer datos de la estructura de datos de LevelDB .
Otras billeteras, como Electrum, también pueden tener un almacenamiento de datos persistente que consiste principalmente en datos UTXO.
Como escribió Andreas, simplemente no es posible descargar el conjunto UTXO (sin confianza). Me gustaría que fuera posible, y por eso he pensado en cómo hacerlo...
Cada bloque identifica transacciones de bloques anteriores que estaban en el conjunto UTXO y ya no están en él y también especifica completamente todas las transacciones que el bloque actual ha agregado al conjunto UTXO. Esto significa que SI ya tiene un conjunto UTXO completo y verificado y alguien quiere saber si un conjunto UTXO de hace N bloques es válido, puede proporcionar una respuesta. Si confían o no en ti es un tema diferente. Si su conjunto es válido, puede deshacer las sumas y restas de transacciones como lo indican los bloques N, calcular un hash y luego enviar ese hash a la otra persona. Si obtienen el mismo hash en su conjunto, es seguro que supongan que usó el mismo UTXO Set para obtener el hash que usaron (es decir, coinciden).
Es posible que ya exista un software que pueda hacer esto. Me gustaría eso. Pero no hay pruebas de que ninguno de ustedes tenga el conjunto UTXO correcto . Me gustaría ver eso arreglado para todos, pero requiere un poco de arranque. Tengo un plan para ello:
Por la misma razón que no se puede gastar el bitcoin extraído que tiene menos de 100 bloques de profundidad (es decir, es poco probable una reorganización de 100 bloques, ¿posiblemente ni siquiera sea compatible?), Esta estrategia nos permite proceder con un mínimo de 100 bloques de historial. en lugar de toda la cadena de bloques.
Esto coloca la responsabilidad de garantizar la integridad del UTXO de punto de partida establecido en el ser humano que utiliza el software de nodo completo. Tendría que ser experimental por un tiempo, hasta que demuestre que los bloques del cero al X ya no son necesarios (porque el UTXO establecido en la altura del bloque X fue lo suficientemente memorable como para ser reconocible por simples humanos que usan esta nueva característica), reduciendo así la cadena de bloques. requisito de una cantidad siempre creciente de almacenamiento a una cantidad de almacenamiento que presumiblemente se estabilizará.
Parte del atractivo de esta idea para mí es que el hash SHA256 aleatorio de un conjunto UTXO se puede convertir en algo memorable, y las posibilidades de que eso suceda son bajas pero no nulas, al igual que la minería en sí. Diferentes algoritmos de renderizado podrían competir. Acabo de pensar en uno...
Los 256 bits del hash más los 32 bits de la altura del bloque podrían usarse para indicar en qué celdas de un juego de vida de 16x18 están activas. Deja correr el juego de la vida. Míralo. Recuerda cómo se estabiliza. Algunos juegos eventualmente despejarán el tablero. Eso es memorable. Cómo despeja el tablero también sería memorable.
Empecé a buscar un conjunto UTXO canónico (es decir, uno cuya estructura esté estandarizada, de modo que el mismo conjunto de UTXO tenga la misma representación que los datos). Convertir el hash SHA256 más 32 bits de la altura del bloque en un Juego de la vida para ver cómo se desarrolla se puede hacer fácilmente con Golly o cualquier otro software que implemente el "Juego de la vida" de John Conway.
Así que tengo la misma búsqueda que OP, pero Andreas tiene razón. Tienes que ejecutar un nodo completo y crearlo tú mismo. Sin embargo, una vez que haya hecho eso, posiblemente podría ponerlo a disposición de otros (¡yo!). También señala que no hay forma de probar que es correcto, excepto ejecutando un nodo completo y repitiendo todo el trabajo de actualización para cada transacción. Demostrar que el resultado es correcto sin todo ese trabajo es el objetivo de la idea que presento en esta respuesta.
Echa un vistazo a este programa. Volcará toda la base de datos UTXO actual en un archivo CSV al que puede hacer una referencia cruzada. https://github.com/in3rsha/bitcoin-utxo-dump
@ Dave Scotese: Estoy de acuerdo con su idea de tener un conjunto UTXO generalmente aceptado (aunque no estoy seguro de por qué sugirió ejecutar el hash de puntos de control resultante en un juego de la vida). De todos modos, creo que el problema no es que no se pueda hacer, sino que se trata de un consenso (muy similar al problema que resuelve la propia cadena de bloques). Supongamos que usó honestamente su algoritmo y proporcionó al mundo un hash memorable que define el conjunto UTXO en algún punto de control de altura de bloque que coloca en algún repositorio para descargar. Ahora, si el Sr. A lo descarga y verifica usando su propia base de datos y está de acuerdo con usted. No espera que el Sr. B esté de acuerdo con usted simplemente porque el Sr. A está de acuerdo. Verá, quien necesite usar este conjunto UTXO debe verificarlo por sí mismo. Todavía vuelve al problema de los generales bizantinos que resolvió blockchain. Sinceramente, creo que para que funcione,
Y sí, estoy completamente de acuerdo con usted en que tener un conjunto UTXO de este tipo resolverá el problema de tener que descargar toda la cadena de bloques antes de poder validar las transacciones.
Jus12