Wie erstelle ich einen SPV-Client?

Welche Schritte unternimmt ein SPV-Client, um zu synchronisieren?

  • Verbinden Sie sich mit einem Peer
  • Bloom-Filter für Wallet-Adressen setzen
  • Laden Sie alle Block-Header seit dem letzten Prüfpunkt herunter
  • Fordern Sie jeden Block erneut mit gesetzten Filtern an
  • Aktualisieren Sie das Wallet-Guthaben basierend auf zurückgegebenen Blöcken

Offensichtlich sind die obigen Schritte falsch, da es keinen Sinn macht, zuerst alle Blockheader herunterzuladen, um die richtige Kette zu bestimmen, und dann alle Blöcke erneut anzufordern, um das Guthaben der Brieftasche zu berechnen.

Aber wie ist das richtige Vorgehen?

Antworten (2)

Das ist was ich mache:

  1. Mit Peer verbinden
  2. Bloomfilter setzen
  3. Senden Sie eine 'getblocks'-Nachricht
  4. Senden Sie eine 'getdata'-Nachricht mit gesetztem MSG_FILTERED_BLOCK für alle neuen Blöcke

Beachten Sie, dass „getblocks“ eine Liste von Blockchain-Hashes ab dem angegebenen Startpunkt zurückgibt, nicht die Blöcke selbst. Dann gibt 'getdata' 'merkleblock'-Nachrichten anstelle von vollständigen Blöcken zurück. Der Peer folgt der „merkleblock“-Nachricht mit allen Transaktionen, die dem Bloom-Filter als separate „tx“-Nachrichten entsprechen.

Weitere Einzelheiten finden Sie in BIP0037

Wenn Sie ein Beispiel möchten, finden Sie meine Java-Wallet auf GitHub

Ein paar Beispiele können Ihnen helfen:

https://code.google.com/p/bitcoinj/

Mein Projekt https://github.com/richardkiss/pycoinnet ist nicht vollständig (insbesondere gibt es zum jetzigen Zeitpunkt keine Bloom-Filter-Implementierung), aber es kann letztendlich das tun, was Sie brauchen.