Das Wiki macht diese Aussage:
Es [
getdata
Nachricht] 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:
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.
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.
Reiches Apodaca
Andreas Chow
G. Maxwell