Welche Indizes verwaltet ein Bitcoin Core-Knoten, um Bloom-gefilterte Anfragen und SPV-Peers zu bedienen?

Das Wiki macht diese Aussage:

Es [ getdataNachricht] kann verwendet werden, um Transaktionen abzurufen, aber nur, wenn sie sich im Speicherpool oder Relaissatz befinden - willkürlicher Zugriff auf Transaktionen in der Kette ist nicht erlaubt, um zu vermeiden, dass Clients anfangen, von Knoten mit vollständigen Transaktionsindizes abhängig zu sein (was moderne Knoten nicht) . [meine Betonung]

https://en.bitcoin.it/wiki/Protocol_documentation#getdata

Doch "Connection Bloom filtering" (BIP-37) scheint genau ein solches Indexsystem zu erfordern:

Der Filter kann anhand beliebiger Daten getestet werden, um festzustellen, ob diese Daten vom Client eingefügt wurden. Daher stellt sich die Frage, welche Daten eingefügt/getestet werden sollen.

Um festzustellen, ob eine Transaktion mit dem Filter übereinstimmt, wird der folgende Algorithmus verwendet. Sobald eine Übereinstimmung gefunden wird, bricht der Algorithmus ab.

Anschließend wird eine geordnete Liste von Kriterien ausgegeben.

Es scheint, dass ein Knoten, der einen solchen Filter unterstützt, auch einen Index (oder mehrere) unterhalten müsste, oder Denial-of-Service-Angriffe riskieren würde.

Ich habe diese Frage gesehen:

70 % der Knoten akzeptieren Bloom-Filter trotz DoS-Angriffsvektor?

was die Frage nach Indizes nicht zu beantworten scheint.

Ich habe diese Frage gesehen:

Gibt es eine Möglichkeit, Transaktionen zu indizieren, damit Filterload-Befehle beantwortet werden können, ohne alle Transaktionen in einem Block zu durchlaufen?

Die einzige Antwort darauf impliziert, ohne ausdrücklich zu sagen, dass überhaupt keine Indizes erstellt werden.

Welche Indizes erstellt ein Knoten ausschließlich zur Unterstützung der Bloom-Filterung für SPV-Knoten?

Wenn keine erstellt werden und Transaktionen spontan gefiltert werden, wie kann diese Aussage in der verknüpften Frage oben wahr sein?

So können Sie ganz einfach genau denselben DoS-Angriff auslösen, indem Sie einfach immer wieder regelmäßige getdata-Anfragen auf großen Blöcken verwenden. Sie brauchen keine Bloom-Filterung. Wenn Sie die Blöcke nicht wirklich herunterladen möchten, ACKen Sie die Pakete einfach nicht mit TCP ACK und dann nach ein paar Sekunden mit FIN .... die Daten wurden alle geladen und befinden sich in den Sendepuffern.

Antworten (1)

Bitcoin Core verwaltet einen Index von Blöcken und deren Speicherorten auf der Festplatte. Wenn jemand einen Block anfordert, zieht er den Block von der Festplatte, und wenn er BIP 37 verwendet hat, wird er den Block durch den Filter laufen lassen. Der Blockindex ist für den normalen Knotenbetrieb erforderlich; Es werden keine weiteren Indizes erstellt. Das einzige "Index"-ähnliche Ding ist der Mempool, und dieser wird ausschließlich im Speicher verwaltet. Von dort kommen Transaktionen, wenn sie angefordert werden; Bestätigte Transaktionen befinden sich nicht im Mempool und können nicht weitergeleitet werden.

Für BIP 37 werden die Dinge nur gegen den Filter getestet, bevor sie an einen Knoten weitergeleitet werden, der einen Filter gesetzt hat. Die einzigen Dinge, die jemals weitergeleitet werden, sind unbestätigte Transaktionen und ganze Blöcke.

Wenn keine erstellt werden und Transaktionen spontan gefiltert werden, wie kann diese Aussage in der verknüpften Frage oben wahr sein?

Die Aussage ist wahr, weil ein Knoten einen Filter setzen und Blöcke und unbestätigte Transaktionen von dem Knoten anfordern kann. Der Knoten leitet diese Blöcke und Transaktionen dann durch den Filter, bevor er sie weiterleitet.

Das Fragmentieren von Transaktionen und das Ausführen der Teile durch einen Bloom-Filter, wie BIP-37 empfiehlt, verbraucht Knotenressourcen, nicht wahr? Wenn ein Knoten nur ohne Filterung sendet, müssen diese Ressourcen nicht verbraucht werden. Öffnet das spontane Filtern von Transaktionen nicht einen DoS-Angriffsvektor, der nicht existiert, wenn Blöcke und Mempool ohne Filterung gesendet werden?
Ja, es verbraucht Ressourcen und kann möglicherweise zu DoS-Angriffen führen. Es gibt auch Möglichkeiten, DoS-Angriffe wie Ratenbegrenzung abzuschwächen. Aus diesem Grund halten die meisten Entwickler BIP 37 für schlecht, aber bisher ist es das einzige, das Lightweight Wallets dezentral unterstützt.
Das Design des BIP 37 ist in jedem Fall mehr oder weniger inkompatibel mit irgendeiner Art von Indizierung, da der Serving-Knoten den Filter kontinuierlich in der Reihenfolge von Transaktion zu Transaktion modifizieren muss.