Блокчейн/Уровень III · Сеть/3.1 Ноды/Урок 2
Одноранговая сеть и gossip-протокол
Gossip-протокол: как ноды находят пиров и распространяют данные без центра
МатериалыРаботающая нода Bitcoin CoreДоступ к терминалу с ‘bitcoin-cli’Текстовый редактор для записи информации о пирах
Любопытство
- Как новая нода в пустой сети находит своего первого пира?
- Как новый блок за считаные секунды достигает тысяч нод без какой-либо координации?
- Что мешает злоумышленнику изолировать ноду от остальной сети?
Исследование
- Биткоин работает как децентрализованная одноранговая (peer-to-peer) сеть, в которой каждая полная нода независимо поддерживает собственное состояние. Чтобы присоединиться к ней, новая нода должна установить TCP-соединения с существующими пирами. В мейннете для этих соединений используется порт 8333. Первоначальное обнаружение опирается на DNS-сиды, которые поддерживают давние участники сообщества и которые прописаны в программе, а также на жёстко заданные резервные адреса. После подключения нода может запросить адреса командой 'getaddr' и получить их в сообщениях 'addr', что позволяет ей узнавать о других активных участниках и динамически расширять круг своих пиров.
- Bitcoin Core поддерживает определённую топологию: 8 исходящих соединений с полной ретрансляцией (full-relay) для распространения транзакций и блоков плюс 2 соединения только для ретрансляции блоков (block-relay-only), чтобы снизить нагрузку на канал. Всего допускается до 125 соединений, входящих и исходящих. Такая структура обеспечивает избыточность: если один пир отключается или перестаёт отвечать, нода сохраняет связь через остальных. Соединения block-relay-only не передают ни транзакций, ни адресов, поэтому стороннему наблюдателю сложнее составить карту топологии сети.
- Распространение данных строится на механизме объявлений. Получив новую транзакцию, нода объявляет о ней сообщением 'inv' (inventory), которое содержит хеш, но не сами данные; новые блоки сейчас обычно объявляются прямой отправкой заголовка или компактного блока. Пиры, получившие объявление, видят, что у них нет этого объекта, и отправляют запрос 'getdata'. Затем исходный владелец передаёт полные данные. Такой двухэтапный процесс не даёт засорять сеть избыточными крупными пакетами данных, пока пиры не подтвердят интерес, и обеспечивает эффективное использование пропускной способности во всей распределённой системе.
- Компактные блоки (BIP152), появившиеся в 2016 году, ещё больше оптимизируют этот процесс. Поскольку большинство транзакций в блоке пирам уже известны благодаря их распространению через мемпул, отправлять полный блок расточительно. Вместо этого нода отправляет заголовок блока и короткие идентификаторы (по 6 байт каждый) его транзакций вместе с coinbase-транзакцией; получатель восстанавливает блок из собственного мемпула и запрашивает лишь те немногие транзакции, которых у него нет. Это значительно сокращает задержку распространения блоков и позволяет сети быстрее достигать консенсуса даже при большом объёме транзакций.
- Eclipse-атаки демонстрируют хрупкость разнообразия пиров. Хейлман и соавторы (2015) показали, что злоумышленник, захвативший все соединения ноды, может изолировать её от честной сети и подсовывать ей ложное представление о цепочке. Bitcoin Core внедрил предложенные ими контрмеры начиная с версии 0.10.1, в том числе пробные (feeler) соединения и более аккуратное вытеснение записей из таблицы адресов, а позже добавил якорные (anchor) соединения, сохраняющиеся после перезапуска. Работа исключительно через Tor может сделать ноду более, а не менее уязвимой для eclipse-атаки.
- Проверьте подключения своей ноды, выполнив 'bitcoin-cli getpeerinfo' в терминале, подключённом к локальному экземпляру Bitcoin Core. В выводе указаны адрес каждого пира, его 'connection_type' (например, outbound-full-relay или block-relay-only), версия ПО и степень синхронизации ('synced_headers', 'synced_blocks'). У исправной ноды около десяти исходящих соединений: восемь full-relay и два block-relay-only.
Ключевые факты
- Основная сеть Биткоина (mainnet) использует TCP-порт 8333 для одноранговой связи.
- Новые ноды выполняют начальное подключение через DNS-сиды и жёстко заданные адреса, а затем узнают о пирах через gossip-протокол.
- По умолчанию Bitcoin Core использует 8 исходящих соединений full-relay, 2 соединения block-relay-only и не более 125 соединений в сумме.
- Сообщение 'inv' объявляет хеши данных; 'getdata' запрашивает сами данные у пира, у которого они есть.
- Компактные блоки (BIP152) позволяют пирам восстанавливать блоки из локальных мемпулов, сокращая сетевой трафик.
- Eclipse-атаки нацелены на захват всех соединений ноды; с 2015 года в Bitcoin Core добавлено несколько контрмер.
Упражнение девять, шесть, три, один
9СобратьПеречислите 9 отдельных компонентов процесса начального подключения (bootstrap) и распространения данных в P2P-сети Биткоина (например, DNS-сиды, сообщения 'inv').
6СгруппироватьСгруппируйте эти 9 компонентов в 6 категорий в соответствии с их функцией: обнаружение, управление подключениями, объявление данных, получение данных, оптимизация или безопасность.
3Выделить главноеСократите 6 групп до 3 основных принципов, которые обеспечивают эффективное и безопасное распространение данных в сети.
1КристаллизоватьНапишите одно предложение о том, почему нода должна поддерживать разнообразные исходящие соединения, чтобы противостоять eclipse-атакам.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.