Запрос блоков

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

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

Ответы (1)

Узел не знает о других узлах, к которым подключен один из его одноранговых узлов. Они ответят всем, что ваш узел запрашивает у них, даже если в конечном итоге это будут дубликаты блоков.

Поскольку сетевые соединения являются прямыми потоками, ваш узел точно знает, что он отправил и получил от каждого из своих одноранговых узлов. Таким образом, ваш узел будет выбирать одноранговые узлы, с которых он хочет загружать блоки, и отправлять им конкретные запросы для этих блоков. Поскольку Bitcoin Core использует первую синхронизацию заголовков, нет необходимости просто отправлять сообщение getblocks; вместо этого он может использовать сообщения getdata для запроса определенных блоков и распределения загрузки по нескольким одноранговым узлам.

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

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