Перейти к содержимому
buybitcoinsmart

Глоссарий / Узлы и ПО

Незапрошенная отправка блока

Что такое незапрошенная отправка блока?
Незапрошенная отправка блока означает, что одноранговый узел присылает вам блок, который вы не запрашивали, пропуская обычный обмен «объявление и запрос», чтобы сэкономить один круговой обмен, когда данные критичны по времени.

Отправлять без приглашения грубо в большинстве протоколов и правильно в этом. За каждый круговой обмен, который блок проводит в пути, какой-то майнер тратит время на работу над вершиной, которой уже нет, поэтому BIP152 формализовал этот короткий путь: до трех выбранных одноранговых узлов могут прислать вам блок в тот момент, когда он у них появился. Ваш узел все равно проверяет его с нуля и ничего не должен отправителю.

Как это работает

Под названием «незапрошенная отправка блока» скрываются две разные вещи: одна старая и неформальная, другая описанная в спецификации.

Старая форма представляет собой просто сообщение block, приходящее без соответствующего getdata. Протокол никогда ее не запрещал, и получатели всегда обрабатывали такие блоки, хотя и с условиями. Bitcoin Core проверяет доказательство работы в заголовке, прежде чем делать что-либо дорогостоящее, не передает блок дальше, пока тот не будет полностью проверен и не подключится к лучшей цепочке, а блок, который не подключается ни к чему известному, считает тем, что нужно отбросить, а не головоломкой, которую нужно решить. Эти правила существуют потому, что незапрошенные данные бесплатны для отправителя и дорого обходятся получателю, а такова форма любой атаки типа «отказ в обслуживании» в протоколе.

Описанная форма представляет собой режим высокой пропускной способности BIP152. Узел отправляет своему одноранговому узлу сообщение sendcmpct, первый байт которого равен 1, что означает: не объявлять, просто прислать. Этот одноранговый узел может затем передать cmpctblock в тот момент, когда узнает о новом блоке, возможно, до того, как закончит его проверку. BIP152 устанавливает жесткий предел в три таких узла, и Bitcoin Core соблюдает именно его, храня список не более чем из трех узлов, выбранных за то, что они доставляли недавние блоки первыми. Три представляет собой компромисс: достаточно избыточности, чтобы один медленный узел не мог вас задержать, и достаточно мало, чтобы вы не получали один и тот же блок по каждому своему соединению.

Поскольку объявление в режиме высокой пропускной способности может предшествовать проверке, принимающий узел относится к нему как к утверждению, а не к факту. Сначала проверяется доказательство работы, так как это единственная часть блока, которую нельзя дешево подделать, а все остальное идет обычным путем. Версия протокола 70015 существует именно для того, чтобы узел мог сообщить, что не будет наказывать одноранговый узел за объявление блока, который позже окажется не полностью проверенным.

Где это встречается

Незапрошенные отправки сосредоточены там, где секунды стоят денег.

Майнинговые пулы поддерживают прямые соединения друг с другом и с сетями ретрансляции, такими как FIBRE, построенными для передачи блоков между континентами с таким малым числом обменов объявлениями и запросами, какое позволяет физика. На обычной машине вызов getpeerinfo сообщает два флага для каждого однорангового узла, bip152_hb_to и bip152_hb_from, показывающие, какие узлы вы попросили присылать вам блоки и какие попросили вас о том же. Нормально, когда первый флаг стоит у трех узлов, и это предел.

Незапрошенная отправка блока vs стандартная ретрансляция блоков

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

Не путать с

Часто задаваемые вопросы

Может ли одноранговый узел заставить мой узел принять неверный блок, отправив его без запроса?

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

Сколько одноранговых узлов могут присылать блоки моему узлу?

Три. BIP152 ограничивает режим высокой пропускной способности тремя одноранговыми узлами, и Bitcoin Core соблюдает этот предел, выбирая узлы, которые быстрее всех доставляли недавние блоки. Вызов getpeerinfo показывает их через флаги bip152_hb_to и bip152_hb_from.

Связанные термины

Еще в разделе «Узлы и ПО»

Читать эту страницу на английском