Это inv
сообщение используется для передачи информации о блоках и блоках tx
другим клиентам в сети. Когда новый Клиент подключается к Сети, он сначала получает информацию обо всех блоках в виде inv
сообщения, как ответ на getblocks
сообщения. Поскольку сообщения нет gettx
, я предполагаю, что информация о транзакциях передается в последнем inv
ответе на getblocks
. Действительно ли так работает стандартный клиент, или он просто ретранслирует tx
сообщения только тогда, когда они приходят, заставляя вновь подключенных клиентов ждать, чтобы получить информацию о tx
s?
ThreadMessageHandler2() вызывает SendMessages() каждые 100 секунд, что приводит inv
к отправке сообщений одноранговым узлам клиента.
Один пир выбирается случайным образом для получения inv
сообщений, которые ссылаются на все ожидающие транзакции, о которых мы знаем и о которых нет, включая те, которые мы создали сами. Остальные одноранговые узлы получают inv
сообщения, которые ссылаются только на около 25% ожидающих транзакций, о которых мы знаем, а они — нет, не считая созданных нами.
Комментарий в коде объясняет, что это «просачивание» инвентаризации транзакций предназначено для защиты конфиденциальности.
Редактировать: я только что заметил эту тему , которая также описывает процесс рекламных транзакций. К счастью, это согласуется с моим описанием здесь.
Процесс анонсирования и отправки данных одинаков как для транзакций, так и для блоков: inv
объявляется хэш объекта, getdata
используется для запроса самого объекта tx
или block
используются для их отправки.
getblocks
— это шаг перед этим процессом: он запрашивает объявления о последних блоках через файлы inv
.
Питер Уилле