Intento entender una implementación de SPV.
Leí las páginas wiki sobre especificación de protocolos y seguridad de clientes ligeros , así como el capítulo 8 del libro blanco .
Lo que no entiendo:
supongamos que el usuario A
tiene una dirección de Bitcoin X
.
El usuario A
puede hacer getheaders
y cargar todos los encabezados de bloque y luego tener todos los hashes y marcas de tiempo de bloque.
Entonces: ¿cómo encuentra un cliente SPV posibles transacciones en la dirección de Bitcoin del usuario X
sin cargar todos los bloques (y todas las transacciones)?
Tiene razón en que SPV, como se describe en el documento de Bitcoin, no explica cómo descubrir los pagos por sí mismo, sin descargar bloques completos. Mi suposición es que Satoshi planeó desarrollar esto más tarde, o que asumió que solo le informarían sobre los pagos a usted mismo (pago a IP, como existía junto al pago a pubkeyhash como se usa ahora).
Sin embargo, las implementaciones prácticas de los nodos SPV actuales utilizan una extensión de protocolo llamada filtros de floración, que se describe en BIP 37 . Utilizan getheaders
para obtener información de bloques antes de la marca de tiempo de nacimiento de su billetera y solicitan bloques filtrados después. Para hacerlo, envían un filtro de floración que describe las direcciones y transacciones que les interesan al par. Luego, el par solo incluye las transacciones relevantes en los bloques que envía, junto con sus rutas de Merkle para demostrar que estas transacciones eran de hecho parte de dicho bloque.
Si ayuda https://gist.github.com/TOMOAKI12345/7e0aa1c6b8ace4a70ca6
El código fuente de Breadwallet es realmente una buena fuente para aprender sobre el protocolo de red de la billetera SPV.
Acabo de encontrar algo en el código fuente de bitcoinj:
/**
* The "getheaders" command is structurally identical to "getblocks", but has different meaning. On receiving this
* message a Bitcoin node returns matching blocks up to the limit, but without the bodies. It is useful as an
* optimization: when your wallet does not contain any keys created before a particular time, you don't have to download
* the bodies for those blocks because you know there are no relevant transactions.
*/
Además de las respuestas anteriores, puede consultar este diagrama si le ayuda desde este enlace .
Creo que SPV solo está destinado a verificar transacciones, no a calcular un saldo o una lista de todas las transacciones a una dirección determinada.
andrija