¿Cuáles son los pasos que sigue un cliente SPV para sincronizar?
Obviamente, los pasos anteriores son incorrectos, ya que no tiene sentido descargar primero todos los encabezados de bloque para determinar la cadena correcta y luego volver a solicitar todos los bloques para calcular el saldo de la billetera.
Pero, ¿cuál es el procedimiento correcto?
Esto es lo que hago:
Tenga en cuenta que 'getblocks' devuelve una lista de hashes de cadena de bloques desde el punto de inicio especificado, no los bloques en sí. Luego, 'getdata' devuelve mensajes 'merkleblock' en lugar de bloques completos. El par sigue el mensaje 'merkleblock' con cualquier transacción que coincida con el filtro bloom como mensajes 'tx' separados.
Más detalles están en BIP0037
Si desea un ejemplo, puede encontrar mi billetera Java en GitHub
Un par de ejemplos pueden ayudarte:
https://code.google.com/p/bitcoinj/
Mi proyecto https://github.com/richardkiss/pycoinnet no está completo (en particular, a partir de este escrito, no hay una implementación de filtro de floración), pero eventualmente puede hacer lo que necesita.