August 15, 2022

Биткоин: работа продолжается. Глава 2

Технические инновации из окопов

Фото автора

Перевод NADO Book by Sjors Provoost.

Проект перевода организован HypeCoinNews.

DNS Bootstrap и Tor V3

В Bitcoin Core 0.21 в 2020 году добавлена поддержка адресов Tor V3. В этой главе объясняется, что это значит и почему это важно. Также будет обсуждаться, как новые биткоин-узлы находят существующие биткоин-узлы при первичной загрузке в сеть.

Как работает Tor?

Когда вы видите адрес Tor, например, на сайт https://bitcoincore.org также можно попасть и с помощью браузера Tor по адресу http://6hasakffvppilxgehrswmffqurlcjjjhd76jgvaqmsg6ul25s7t3rzyd.onion/, он выглядит довольно странно. Дло в том, что это не удобочитаемое имя, такое как домен, а скорее открытый ключ, который соответствует скрытому сервису где-то в Интернете. Поскольку вы не знаете его IP-адреса, то вы общаетесь с этим скрытым сервисом не напрямую, а косвенно, через сеть Tor.

Tor (сокращение от The Onion Router) — это луковичная сеть, в которой сообщения передаются по сети через несколько переходов (или серверов), при этом каждый переход снимает с сообщения один зашифрованный слой, как с луковицы. Последний переход отправляет сообщение в конечный пункт назначения, который снимает последний слой шифрования, раскрывающий фактическое сообщение. Это позволяет легко поддерживать анонимность и безопасность.

Для подключения вам нужно использовать браузер Tor. Этот браузер создает луковые пакеты. Сообщения в них — это обычные вещи, которыми обмениваются браузеры: скажем, запрос HTML-документа или изображения и, в обратном направлении, получение указанного документа или изображения. Браузер Tor сначала создает само исходное сообщение.

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

Далее он упаковывает поверх него другое сообщение с инструкциями о том, где находится конечный пункт назначения, и которое сможет прочитать только последний узел перед скрытым сервисом. Затем он заворачивает поверх другое сообщение с инструкциями для предпоследнего узла о том, как достичь последнего узла, и так далее.

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

Чтобы поддерживать этот механизм, все узлы Tor имеют свой собственный вид IP-адреса — онион-адреса — и именно с ними вы общаетесь напрямую. Между тем, узлы Bitcoin Core могут работать за такими скрытыми сервисами, и это означает, что каждый может запустить свой узел Bitcoin в секретном месте, в результате чего его IP-адреса останутся скрытыми.

Запуск узла Биткоина из-под Тора

По тем или иным причинам вы можете не захотеть, чтобы остальной мир знал, что на вашем IP-адресе запущен биткоин-узел. В частности, вы можете не хотеть, чтобы ваши биткоин-адреса ассоциировались с вашим IP-адресом, поскольку первый говорит о том, сколько у вас денег, а второй часто может быть напрямую связан с вашим именем и адресом — не только для правительства, но и для кого-то с доступом, например, ко взломанной базе данных интернет-магазина с IP-адресами и домашними адресами своих клиентов. Это может привести к неприятным результатам.

Биткоин-узлы уже пытаются вести себя так, чтобы их поведение было неотличимо от других узлов. В идеале узел не раскрывает другим узлам, какие монеты он контролирует. Узел загружает всю цепочку блоков и отслеживает все транзакции в мемпуле вместо получения информации только о своих монетах.

Мемпул — это множество транзакций, которые еще не были подтверждены в блоке. См. приложение A в книге Разъясненный Биткоин. Когда в мемпуле содержится много транзакций, комиссии, как правило, растут. См., например. https://mempool.space/

К сожалению, система не идеальна. Тщательный анализ сети злоумышленником иногда может выявить, откуда произошли транзакции, особенно когда вы отправляете и получаете транзакции со своего IP-адреса. Этот тип анализа — бизнес на миллиарды долларов, что не способствует этичному поведению компаний.

Таким образом, использование биткойнов из-под Тора может улучшить вашу конфиденциальность, разорвав связь между вашим IP-адресом и любой информацией о вас, которые ваш узел может случайно раскрыть.

В результате обновления протокола Tor появился новый тип онион-адреса: Tor V3. Он и рекомендуется для практическго использования. Эти новые адреса Tor длиннее, что делает их более безопасными. Однако для поддержки этой увеличенной длины потребовалось обновление Bitcoin Core.

Узлы Биткоина и "госсип"

Почему использование более длинного адреса Tor V3 требует обновления Bitcoin Core? Это связано с тем, как узлы Биткоина распространяют информацию ("госсип" - gossip) о том, где они находятся. Узлы общаются друг с другом в сети сплетен: они отправляют друг другу списки известных узлов и спрашивают друг друга: «Эй, какие узлы Биткоина ты знаешь?» Взамен они получают список IP-адресов, которые обычно являются адресами IPv4 или IPv6.

Адреса IPv6 были формализованы в 1998 году с намерением заменить IPv4, поскольку количество адресов IPv4 ограничено. Существует примерно 4.3 миллиарда потенциальных уникальных адресов IPv4, в то время как адресов IPv6 достаточно для каждой молекулы во вселенной.

Биткоин-узлы хранят списки других биткоин-узлов и их IP-адресов, как IPv4, так и IPv6. Теперь же они передают адрес Tor, используя IPv6. Если «адрес» начинается с fd87::d87e::eb43, то Bitcoin Core знает, что дальнейшее следует интерпретировать как адрес Tor. RFC-4193 гарантирует, что такие адреса не будут конфликтовать ни с одним компьютером в реальном мире.

Проблема с адресами Tor V3 заключается в том, что они имеют длину 32 байта, что в два раза больше, чем у адреса IPv6. Это не вписывается в механизм работы RFC-4193, поэтому узлы не могут передавать такие адреса.

К счастью, в 2019 году Владимир ван дер Лаан написал новый стандарт BIP155 для передачи таких адресов. В этом стандарте вводится новое сообщение ADDRv2, которое узлы, в числе прочего, могут использовать для сплетен о новых адресах Tor. Основное улучшение заключается в том, что в каждом сообщении наряду с самим адресом указывается тип адреса. Это устраняет необходимость в приспособлении к старым форматам. Существуют различные типы адресов, в том числе новый адрес Tor, и каждый тип адреса может иметь разную длину. Так что в будущем, если появится новый формат адреса, это уже не будет проблемой.

Например, в 2021 году была добавлена поддержка I2P (Invisible Internet Project, альтернатива Tor)

Преимущество этого нового однорангового сообщения заключается в том, что старые узлы просто игнорируют его. И если ваш узел знает, что он общается со старым узлом, он не будет использовать ADDRv2. Таким образом, более новые узлы будут понимать это новое сообщение и могут передавать все эти новые типы адресов, а старые узлы продолжают работать, как будто ничего не произошло. Если вы не хотите использовать Tor V3, обновление не требуется.

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

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

Но как подключиться к самому первому узлу, впервые попав в сеть?

Предположим, вы только что загрузили Bitcoin Core или какой-либо другой клиент и запустили его. Что теперь? Будет ли он просто угадывать случайные IP-адреса? Нет. Ему нужно знать как минимум еще один узел для подключения, а лучше больше. Он пытается подключиться с помощью некой сущности, называемой DNS seeds. Интернет-система DNS используется для веб-сайтов, скажем, вы вводите адрес, например www.google.com, и ваш браузер запрашивает у DNS-сервера, какие IP-адреса относятся к этому домену Google.

Система DNS полностью централизована. Таким образом, если вы запускаете веб-сайт, у вашего хостинг-провайдера будет DNS-сервер, указывающий на ваш веб-сайт, и в вашей стране будет DNS-сервер, указывающий на вашего хостинг-провайдера, а у вашего интернет-провайдера будет DNS-сервер, указывающий на все эти различные страны и т.д.

Если вы поддерживаете веб-сайт, вам обычно нужно зайти в панель управления и ввести IP-адрес вашего сервера, а также ваше доменное имя, которое хранится на DNS-сервере. Одно из полей, которые вы должны заполнить - время ожидания. Это время, в течение которого другие пользователи Интернета могут считать, что этот IP-адрес все еще принадлежит вашему сайту.

Итак, когда вы посещаете веб-сайт, вы спрашиваете своего интернет-провайдера: «Эй, ты знаешь IP-адрес такого-то веб-сайта?» Если нет, он спросит DNS-сервер дальше по улице: «А ты знаешь этот IP?» И затем, как только провайдер найдет запись, он скажет: «Ладно, давайте посмотрим, эта запись все еще действительна, или срок ее действия истек?» Если действителен, он будет использовать найденный адрес, а если срок действия истек, он продолжит поиски, постепенно приближаясь к фактическому хостинг-провайдеру. Поэтому в основном все эти данные кэшируются.

Из-за этого кэширования записи DNS хранятся очень избыточно. Это хорошо как в плане конфиденциальности, так и в плане доступности данных.

Биткоин как бы злоупотребляет этой системой, потому что биткоин-узлы - не веб-сайты. Есть несколько основных разработчиков, использующих DNS seeds, кои по сути являются DNS-серверами. И мы просто делаем вид, что, например, seed.bitcoin.sprovoost.nl — это «веб-сайт», и когда вы спрашиваете этот «веб-сайт», какой у него IP-адрес, вы получаете целый список IP-адресов. Однако эти IP-адреса являются биткоин-узлами, и каждый раз, когда вы отправляете запрос, вы будете получать разные IP-адреса.

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

Это означает, что стандартная инфраструктура Интернета, включая всех интернет-провайдеров в мире, кэширует огромный список биткоин-узлов, к которым можно подключиться, потому что думает, что это просто веб-сайты. Это также позволяет Биткоину использовать любую защиту от цензуры, встроенную в DNS.

Мэтт Коралло попытался пойти еще дальше, опубликовав через DNS заголовки блоков: bitcoin/bitcoin#16834

И поэтому мы доверяем этим разработчикам?

Что, если бы один из операторов DNS-seed солгал и предоставил список поддельных или каким-то образом вредоносных узлов? Возможно, как часть сложной eclipse-атаки (см. главу 7). Ничто не сможет его остановить, но это будет очень заметно. Любой может запросить IP-адреса из DNS-seed, а затем проверить, действительно ли они ведут к биткоин-узлам или нет, и ведут ли себя эти узлы подозрительным образом. Такая прозрачность препятствует мошенничеству.

Другая потенциальная проблема может заключаться в том, что ни один из DNS-seeds не доступен, скажем, из-за того, что все они офлайн. На случай такого сценария в исходном коде Bitcoin Core (и, следовательно, в бинарном файле, который вы загружаете) есть список IP-адресов, а также некоторые скрытые сервисы.

Каждые шесть месяцев или около того всех ответственных за DNS-seeds просят предоставить список самых надежных узлов — просто все узлы, отсортированные по частоте их нахождения онлайн, то есть доступных для отслеживания через DNS-seeds. Разработчики Bitcoin Core объединяют эту информацию от всех операторов DNS-seeds, и включают ее в исходный код.

И DNS-seeds, и встроенные резервные адреса в идеале используются только один раз за время существования вашего узла: когда он запускается в первый раз. После этого ваш узел уже сам отслеживает узлы, о которых он узнает, сохраняя все эти сплетни в файле. При перезапуске он открывает файл и пробует из него несколько случайных узлов. Только если у него заканчивается перечень IP-адресов для подобных попыток, или если это занимает слишком много времени, он снова запрашивает DNS-seeds.

Всякий раз, когда узел подключается к вам в первый раз, он первым делом спрашивает: «Кого еще вы знаете?» Ваш узел может также отправлять IP-адреса другим одноранговым узлам и без запроса. В частности, он объявляет им свой собственный IP-адрес. По мере того, как сплетни о вашем IP-адресе расходятся по сети, вы начинаете получать входящие соединения.

И благодаря всей этой кухне ваш узел просто запускается и работает!

Поддержите проект!

Шлите ваши сатоши, используя эту LNURL ссылку с сообщением "НАДО"/"NADO"

Используя страничку,просто пользователю @c3p0rs через @lntxbot, либо [email protected] если ваш кошелёк поддерживает LN адреса.