Я написал некоторый код для подключения к сети, получения инвентаризации и запроса данных. Что я заметил, так это то, что мой локальный узел никогда не отправляет мне сообщения инвентаризации с блоками в них, если я специально не запрашиваю блоки.
Поэтому, если я выполню вызов getblocks с хешем с нулевой остановкой, я получу все блоки до вершины, но после этого никогда не будет никаких сообщений об инвентаризации. Есть ли какая-то сигнализация, необходимая, чтобы сообщить узлу, к которому я подключен, что я хочу, чтобы сообщения о блоках инвентаря передавались мне, когда будут найдены новые блоки?
Я подключаюсь с версией протокола 70002, relaybool — 1, nodeservices — 1.
Я не вижу других упоминаний об этой проблеме, поэтому мне интересно, есть ли проблема переговоров, которая не улавливается, или какая-то другая проблема.
Нет видимой оценки бана, подключение осуществляется с локального хоста, я получаю verack, и передаются обычные сообщения инвентаризации tx. Это происходит независимо от того, используется ли параметр -whitelist. Я просто никогда не получаю обновлений инвентаря блоков или нежелательных сообщений о блоках, если только я не запрашиваю блоки через getblocks. После того, как я восстановил блоки до тех пор, пока не начнется потоковая передача подсказок.
Обновление: у кода нет проблем с синхронизацией с экземпляром ядра биткойн на другом компьютере, но локальный экземпляр ядра биткойн никогда не будет отправлять инвентаризацию блоков или отвечать на запросы getheaders. Проблема возникает только при подключении с локального хоста к локальному хосту.
Вам нужно выпустить getdata для последней записи в возвращенных invs. Это используется в качестве триггера того, что вы обработали ответ, а оставшаяся часть будет отправлена автоматически.
Обратите внимание, что начиная с версии 0.10, Bitcoin Core больше не использует цикл getdata/inv/getdata/block для синхронизации, а использует getheaders/headers (для синхронизации заголовков). Фактические блоки затем асинхронно извлекаются из разных узлов после обнаружения заголовков.
Каталог блоков Bitcoind был поврежден. (0.11.0)
После исчерпывающего тестирования выяснилось, что каталог блоков bitcoind был каким-то образом поврежден, и поэтому, несмотря на то, что все указывало на то, что он находится в правильном конце цепочки, он не отдавал блоки пирам без явного запроса getblocks. Он будет игнорировать запросы getheaders, а не релейные инвентаризации блоков. Полная пересинхронизация решила проблему.
Ключевым моментом было понимание того, что тот же самый код может без проблем подключаться к внешним узлам, и что во время дампа wireshark локальный узел вообще никогда не ретранслировал блоки в сеть.
МэттиБи
МэттиБи