Биткойн P2P API getBlocks всегда возвращает 500 элементов inv

Я пытаюсь построить мини-полный узел, чтобы точно понять, как они работают. Мне удалось заставить работать несколько частей API P2P, однако я застрял с основными вещами, такими как «getblocks» и «getheaders».

Например, у меня есть следующие хэши блоков, которые меня интересуют:

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

Command: getblocks
Request: 0b110907676574626c6f636b73000000450000002a0af9950100000001000000000000592589e55cda6e8a093998e8356ea770d4aaeb7c0f5439b147d7000000000000017a09017d52db538d7a9ddcc48311866d7e5fdbbbec7d0faad5

Мой вопрос: почему я получаю обратно 500 элементов inv, когда стоп-хеш находится всего в 1 блоке от локатора блоков? (Кстати, то же самое происходит со мной, когда я использую getheaders вместо getblocks)

РЕДАКТИРОВАТЬ

Итак, я поменял порядок байтов отправляемых данных. Мне также пришлось поменять местами локатор блоков и остановиться, чтобы получить ответ (поэтому хэш остановки находится на высоте блока ниже, чем локатор), что заставляет меня чувствовать, что я делаю больше ошибок здесь.

При этом я по-прежнему получаю 500 инв в приведенном выше примере, однако, если вместо этого я использую эти два:

block_stop = "0000000000000049a7ce260de7fcf63f34acf3fe1c5b2040ae77b9bdaf1abb38"
block_hash = "000000000000013d8a77f222805b1dca31d0fb48d60b29098c77609de5f93811

ACTUAL MESSAGE: 0b110907676574626c6f636b7300000045000000a83c12f901000000011138f9e59d60778c09290bd648fbd031ca1d5b8022f2778a3d0100000000000038bb1aafbdb977ae40205b1cfef3ac343ff6fce70d26cea74900000000000000

он правильно возвращается с требуемой высоты, однако возвращает все блоки до последнего блока вместо того, который мне нужен. Я неправильно понимаю смысл этого API? У меня сложилось впечатление, что он возвращает детали блока, но вместо этого просто возвращает отсутствующие хэши блоков. Как мне тогда узнать, какие транзакции произошли в этом блоке?

Ответы (1)

Похоже, у вас есть хэши блоков в неправильном порядке байтов. У вас они отображаются в порядке отображения байтов, но на самом деле сеть обрабатывает хэши блоков в обратном порядке байтов, нули стоят в конце.

Я думаю, что блоки, которые вы получите в ответ, также будут первыми 500 блоками блокчейна.


Итак, что происходит, так это то, что узел видит ваш начальный хэш, но не находит его в вашей цепочке блоков, поэтому он начинает с блока генезиса. Он продолжает работать с каждым блоком и обнаруживает, что не находит стоп-хеш. Это может быть связано как с неправильным порядком байтов стоп-хэша, так и с тем, что он начинается с генезиса, а не с вашего начального хэша.

Таким образом, ответ, который вы получаете, составляет максимум 500 блоков, начиная с блока генезиса — самого последнего общего предка между вашим начальным хешем и его текущим наконечником.


Я неправильно понимаю смысл этого API? У меня сложилось впечатление, что он возвращает детали блока, но вместо этого просто возвращает отсутствующие хэши блоков. Как мне тогда узнать, какие транзакции произошли в этом блоке?

getblocksполучает хэши блоков. Чтобы получить фактический блок, вам нужно использовать getdataполученные хэши.