Блокировать сообщения об инвентаризации

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

Поэтому, если я выполню вызов getblocks с хешем с нулевой остановкой, я получу все блоки до вершины, но после этого никогда не будет никаких сообщений об инвентаризации. Есть ли какая-то сигнализация, необходимая, чтобы сообщить узлу, к которому я подключен, что я хочу, чтобы сообщения о блоках инвентаря передавались мне, когда будут найдены новые блоки?

Я подключаюсь с версией протокола 70002, relaybool — 1, nodeservices — 1.

Я не вижу других упоминаний об этой проблеме, поэтому мне интересно, есть ли проблема переговоров, которая не улавливается, или какая-то другая проблема.

Нет видимой оценки бана, подключение осуществляется с локального хоста, я получаю verack, и передаются обычные сообщения инвентаризации tx. Это происходит независимо от того, используется ли параметр -whitelist. Я просто никогда не получаю обновлений инвентаря блоков или нежелательных сообщений о блоках, если только я не запрашиваю блоки через getblocks. После того, как я восстановил блоки до тех пор, пока не начнется потоковая передача подсказок.

Обновление: у кода нет проблем с синхронизацией с экземпляром ядра биткойн на другом компьютере, но локальный экземпляр ядра биткойн никогда не будет отправлять инвентаризацию блоков или отвечать на запросы getheaders. Проблема возникает только при подключении с локального хоста к локальному хосту.

Ответы (2)

Вам нужно выпустить getdata для последней записи в возвращенных invs. Это используется в качестве триггера того, что вы обработали ответ, а оставшаяся часть будет отправлена ​​​​автоматически.

Обратите внимание, что начиная с версии 0.10, Bitcoin Core больше не использует цикл getdata/inv/getdata/block для синхронизации, а использует getheaders/headers (для синхронизации заголовков). Фактические блоки затем асинхронно извлекаются из разных узлов после обнаружения заголовков.

В случае, когда высота моих узлов равна локальному узлу, если я запрашиваю блоки, ни один из них не возвращается (что имеет смысл), и не отправляются сообщения inv, для которых я могу выдать getdata. Я понимаю, что могу переключиться в первый режим заголовков, но для совместимости я хотел бы поддерживать блоки, сигнализируемые через сообщения inv.
Тем не менее, я ценю ответ, я чувствую, что в базовом случае я должен получать эти сообщения inv после getblocks, где я являюсь вершиной цепочки. Этого не происходит, что наводит меня на мысль, что этому препятствует какое-то другое условие. Есть ли что-то еще, что я мог упустить?

Каталог блоков Bitcoind был поврежден. (0.11.0)

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

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