Bitcoin P2P API getBlocks gibt immer 500 Inv-Elemente zurück

Ich versuche, einen Mini-Full-Node zu bauen, damit ich genau verstehen kann, wie sie funktionieren. Ich habe es geschafft, ein paar Teile der P2P-API zum Laufen zu bringen, aber ich stecke bei grundlegenden Dingen wie "getblocks" und "getheaders" fest.

Zum Beispiel habe ich die folgenden Block-Hashes, an denen ich interessiert bin:

block_hash = "000000000000592589e55cda6e8a093998e8356ea770d4aaeb7c0f5439b147d7"
block_stop = "000000000000017a09017d52db538d7a9ddcc48311866d7e5fdbbbec7d0faad5"

Command: getblocks
Request: 0b110907676574626c6f636b73000000450000002a0af9950100000001000000000000592589e55cda6e8a093998e8356ea770d4aaeb7c0f5439b147d7000000000000017a09017d52db538d7a9ddcc48311866d7e5fdbbbec7d0faad5

Meine Frage ist: Warum erhalte ich 500 Inv-Elemente zurück, wenn der Stop-Hash nur 1 Block vom Block-Locator entfernt ist? (Übrigens passiert mir dasselbe, wenn ich getheaders anstelle von getblocks verwende)

BEARBEITEN

Ok, also habe ich die Endian-Ness der Daten, die ich sende, ausgetauscht. Ich musste auch den Block-Locator austauschen und anhalten, um eine Antwort zu erhalten (der Stopp-Hash befindet sich also auf einer Blockhöhe, die niedriger ist als der Locator), was mir das Gefühl gibt, dass ich hier mehr Fehler mache.

Dabei erhalte ich im obigen Beispiel immer noch 500 Inv, aber wenn ich stattdessen diese beiden verwende:

block_stop = "0000000000000049a7ce260de7fcf63f34acf3fe1c5b2040ae77b9bdaf1abb38"
block_hash = "000000000000013d8a77f222805b1dca31d0fb48d60b29098c77609de5f93811

ACTUAL MESSAGE: 0b110907676574626c6f636b7300000045000000a83c12f901000000011138f9e59d60778c09290bd648fbd031ca1d5b8022f2778a3d0100000000000038bb1aafbdb977ae40205b1cfef3ac343ff6fce70d26cea74900000000000000

Es kehrt korrekt von der Höhe zurück, die ich benötige, aber es gibt alle Blöcke bis zum letzten Block zurück, anstatt den, nach dem ich suche. Verstehe ich den Sinn dieser API falsch? Ich hatte den Eindruck, dass es Blockdetails zurückgibt, aber stattdessen gibt es nur fehlende Block-Hashes zurück. Wie finde ich dann heraus, welche Transaktionen in diesem Block stattgefunden haben?

Antworten (1)

Es sieht so aus, als hätten Sie Ihre Block-Hashes in der falschen Byte-Reihenfolge. Sie haben sie in der angezeigten Byte-Reihenfolge, aber das Netzwerk verarbeitet Block-Hashes tatsächlich in umgekehrter Byte-Reihenfolge, die Nullen sind am Ende.

Ich denke, die Blöcke, die Sie als Antwort erhalten, werden auch die ersten 500 Blöcke der Blockchain sein.


Was also passiert, ist, dass ein Knoten Ihren Start-Hash sieht, ihn aber nicht in Ihrer Blockchain findet, also beginnt er mit dem Genesis-Block. Es geht für jeden Block weiter und stellt fest, dass es den Stopp-Hash nicht findet. Dies liegt sowohl daran, dass der Stopp-Hash in der falschen Byte-Reihenfolge ist, als auch daran, dass er bei Genesis und nicht bei Ihrem Start-Hash beginnt.

Die Antwort, die Sie erhalten, ist also das Maximum von 500 Blöcken, beginnend mit dem Genesis-Block - dem jüngsten gemeinsamen Vorfahren zwischen Ihrem Start-Hash und seinem aktuellen Tipp.


Verstehe ich den Sinn dieser API falsch? Ich hatte den Eindruck, dass es Blockdetails zurückgibt, aber stattdessen gibt es nur fehlende Block-Hashes zurück. Wie finde ich dann heraus, welche Transaktionen in diesem Block stattgefunden haben?

getblockserhält die Block-Hashes. Um den eigentlichen Block selbst zu erhalten, müssen Sie getdatadie erhaltenen Hashes verwenden.