
Биткоин использует одноранговую сеть P2P (peer-to-peer — «равный к равному»): узлы соединяются напрямую и передают данные друг другу. Но при первом запуске Bitcoin Core еще не знает ни одного участника. Ему нужен хотя бы один адрес, с которого можно начать.
Один из способов получить такие адреса — DNS seeds. DNS (Domain Name System — система доменных имен) обычно связывает доменное имя с IP-адресом, то есть сетевым адресом устройства. В биткоине специальные DNS-серверы возвращают адреса доступных узлов.
Они не передают транзакции, не создают блоки и не определяют правила сети. Их задача заканчивается после того, как новый клиент узнал, к кому можно подключиться.
Откуда берутся первые адреса
В Bitcoin Core 31.1 для основной сети прописано восемь DNS seeds, которыми управляют разные операторы. Клиент может использовать несколько источников, а кроме них Bitcoin Core содержит резервный набор заранее известных адресов узлов.
После получения контакта программа устанавливает обычное P2P-соединение уже непосредственно с найденным узлом. DNS seed дальше в обмене блоками и транзакциями не участвует.
Поэтому отключение одного такого сервера не означает остановку биткоина. Для давно работающего узла его значение еще меньше: программа уже накопила собственный список участников сети.
Как узел собирает собственную адресную книгу
Подключенные узлы сообщают друг другу адреса других участников сети. Для этого используются сообщения addr и addrv2.
Второй формат появился в BIP-155. BIP (Bitcoin Improvement Proposal — предложение по изменению биткоина) — технический документ, описывающий изменение протокола или сетевого взаимодействия. addrv2, например, позволяет передавать не только обычные интернет-адреса, но и адреса Tor — сети, позволяющей скрывать прямой IP-маршрут участника.
Полученные контакты Bitcoin Core помещает в AddrMan — встроенный менеджер адресов. Это не простой список. Для еще не проверенных адресов предусмотрено 1024 группы, для узлов, с которыми соединение уже успешно устанавливалось, — 256. В каждой может храниться до 64 записей.
Такое устройство усложняет задачу злоумышленнику, который захотел бы наполнить адресную книгу тысячами собственных узлов и заставить клиента подключаться только к ним.
Контакты сохраняются в peers.dat. После перезапуска Bitcoin Core поэтому не начинает поиск сети с нуля, а сначала пробует уже известные адреса.
Узел не подключается ко всему биткоину
Полный узел — программа, которая самостоятельно проверяет блоки и транзакции, — взаимодействует только с небольшим числом соседей. При стандартной конфигурации Bitcoin Core создает до 11 исходящих соединений разных типов.
Восемь из них используются для обычного обмена блоками, транзакциями и сетевой информацией. Еще два предназначены только для блоков. Дополнительное короткое соединение периодически позволяет проверить новый адрес.
Поэтому каждый компьютер не соединен со всей сетью. Один узел знает ограниченный набор соседей, те связаны с другими узлами, и данные проходят через эту сеть соединений.
Современный Bitcoin Core также поддерживает P2P-соединения версии v2, описанные в BIP-324. Они шифруют трафик между соседними узлами и затрудняют пассивное распознавание и вмешательство в передачу данных.
Как транзакция расходится по сети
Такой способ передачи часто называют gossip — «распространением слухов, сплетни». Это не название отдельного сообщения Bitcoin Core, а общий принцип.
Если узел узнает о новой транзакции, он сообщает о ней своим соседям. Те передают информацию дальше. В результате операция постепенно распространяется по сети сразу по нескольким маршрутам.
Перед ретрансляцией каждый узел самостоятельно проверяет транзакцию. Если она соответствует правилам сети и политике самого клиента, она может попасть в пул неподтвержденных транзакций — mempool.
Общего пула неподтвержденных транзакций у биткоина нет.
Одна и та же операция может уже находиться у одного узла и еще отсутствовать у другого. Некоторые узлы способны вообще отказаться ее хранить или передавать, например из-за собственных ограничений на комиссии и размер пула.
Для пользователя это означает, что два обозревателя блокчейна или два сервиса могут некоторое время показывать разный статус одной неподтвержденной транзакции. Они получают данные не из единой очереди, а от собственных узлов.
После того как блок распространится по сети и будет принят узлами, статус включенной в него транзакции обычно выравнивается.
Почему блок передают не целиком
Новый блок тоже должен быстро разойтись по сети. Но многие содержащиеся в нем транзакции уже находятся в пулах соседних узлов.
Поэтому Bitcoin Core использует компактную передачу блоков (Compact Blocks), описанную в BIP-152. Вместо повторной отправки всего содержимого узел передает заголовок блока и короткие идентификаторы транзакций. Получатель пытается собрать блок из операций, которые у него уже есть.
Если нескольких транзакций не хватает, он запрашивает только их. Полный блок приходится передавать лишь тогда, когда восстановить его таким способом не получилось.
Это уменьшает объем трафика и ускоряет распространение нового блока. Для майнинга задержка имеет практическое значение: пока часть сети еще не узнала о свежем блоке, другие майнеры могут продолжать работу над предыдущей вершиной цепочки.
Можно ли захватить узел через DNS
Сам DNS seed не может заставить Bitcoin Core принять неправильный блок. Полный узел самостоятельно проверяет доказательство выполненной работы, транзакции и правила консенсуса.
Даже если стартовый сервер отдаст только адреса злоумышленников, им нельзя просто прислать жертве блок с созданными из воздуха биткоинами — клиент его отвергнет.
Риск возникает, если атакующему удастся окружить узел только подконтрольными соединениями и тем самым ограничить информацию, которую он получает от остальной сети.
Такую схему называют eclipse attack — атакой затмения. Узел остается запущенным, но фактически видит сеть через окружение злоумышленника.
Для снижения такого риска Bitcoin Core распределяет адреса по разным группам, периодически проверяет новые контакты и поддерживает отдельные соединения для получения блоков.
При штатном завершении программа также может сохранить до двух проверенных соседей для передачи блоков в файле anchors.dat, чтобы после перезапуска попробовать восстановить эти соединения.
Что будет, если сеть разделится
Сбой интернет-маршрутизации, фильтрация трафика или атака могут временно разделить узлы на группы, которые перестанут обмениваться данными друг с другом.
Если майнеры окажутся по обе стороны разделения, могут появиться конкурирующие ветви. После восстановления связи Bitcoin Core продолжит действительную цепочку с наибольшей накопленной выполненной работой.
Блоки проигравшей ветви перестанут считаться частью основной истории. Транзакции из них могут снова попасть в пулы неподтвержденных операций, если остаются действительными и не конфликтуют с победившей цепочкой.
Поэтому для крупных переводов ждут несколько подтверждений. Одно подтверждение означает, что транзакция попала в блок. Каждый следующий блок уменьшает вероятность того, что блок с платежом окажется частью проигравшей ветви.
Будь в курсе! Подписывайся на Телеграм.






