Пользовательское пространство, поддержка статически определенной трассировки для Bitcoin Core

В этом отчете обновляется информация о том, над чем 0xB10C, получатель гранта Coinbase Crypto Community Fund , работал в течение первой половины своего годичного гранта на разработку биткойнов. . В частности, речь идет о его работе над пользовательским пространством, поддержкой статической трассировки для ядра биткойна.

Автор 0xB10C, получатель гранта разработчика Coinbase Bitcoin

Ссылочная реализация правил протокола Биткойн, Bitcoin Core, является наиболее широко используемым программным обеспечением для взаимодействия с сетью Биткойн. Однако Bitcoin Core — это черный ящик для большинства пользователей. Хотя информацию можно запрашивать через интерфейс RPC или искать в журнале отладки, не существует определенного интерфейса для получения информации о внутренних процессах в реальном времени. Тем не менее, некоторые пользователи могут извлечь выгоду из большей наблюдаемости в своем узле. Любители и компании, использующие Bitcoin Core в производстве, хотят включить свои узлы в мониторинг в реальном времени. Разработчикам требуется прозрачность тестовых развертываний, чтобы оценивать, анализировать, отлаживать и тестировать изменения. Исследователи хотят наблюдать и анализировать поведение узлов в одноранговой сети. Биржи и другие службы, обрабатывающие большие суммы биткойнов, хотят обнаруживать атаки и другие аномалии на раннем этапе.

Заглядывать внутрь с помощью пользовательского пространства, статически определяемая трассировка

Технология eBPF, присутствующая в ядре Linux, может быть используется для наблюдения в приложениях пользовательского пространства. Технология позволяет запускать небольшую изолированную программу в ядре Linux, которая может подключаться к предопределенным точкам трассировки в запущенных процессах. После подключения к точке трассировки программа выполняется каждый раз при достижении точки трассировки. Точки трассировки могут передавать данные, например, состояние приложения. Сценарии трассировки могут дополнительно обрабатывать данные. Практика подключения к точкам трассировки в приложениях пользовательского пространства известна как пользовательское пространство, статически определяемая трассировка (USDT). Например, эти точки трассировки также включены в PostgreSQL, MySQL, Python, NodeJS, Ruby, PHP и библиотеки, такие как libc, libpthread и libvirt.

Пользователи Bitcoin Core могут использовать статические точки трассировки, желающие больше информации об их узле. Добавление поддержки USDT не потребовало навязчивых изменений, и не нужно было писать никаких специальных инструментов. Когда точки трассировки не используются, влияние на производительность минимально или отсутствует. Только привилегированные процессы могут подключаться к точкам трассировки, никакая информация не просачивается в другие процессы на хосте. Эти свойства делают Userspace, Statically Defined Tracing, хорошо подходящим для Bitcoin Core.

Например, я поместил две точки трассировки в код обработки одноранговых сообщений Bitcoin Core. Для каждого входящего и исходящего P2P-сообщения точки трассировки передают информацию об узле, соединении и сообщении. Эти данные можно фильтровать и обрабатывать с помощью сценариев трассировки. В качестве демонстрации я создал P2P Monitor, который показывает взаимодействие между двумя узлами в реальном времени. Пользователи могут найти этот скрипт вместе с другими примерами USDT в каталоге contrib / tracing / репозитория Bitcoin Core.

body [data-twttr-rendered = «true»] {background-color: transparent;}. Twitter-tweet {margin: auto! important;}

& # x200a; — & # x200a; @ 0xB10C

function notifyResize (height) {height = height? height: document.documentElement.offsetHeight; var resized = false; if (window.donkey && donkey.resize) {donkey.resize (height); resized = true;} if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe (объект); resized = true;} if (window.location && window.location.hash === «# amp = 1» && window.parent && window.parent.postMessage) {window.parent.postMessage ({sentinel: «amp», type: «embed-size», height: height}, «*»);} if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize) {window.webkit.messageHandlers.resize.postMessage ( рост); resized = true;} return resized;} twttr.events.bind (‘обработано’, функция (событие) {notifyResize ();}); twttr.events.bind (‘изменение размера’, функция (событие) {notifyResize ();}); if (parent && parent._resizeIframe) {var maxWidth = parseInt (window.frameElement.getAttribute («width»)); if (500 <maxWidth) {window.frameElement.setAttribute ("width", "500");}}

Примеры использования пространства пользователя, статически определяемая трассировка

Я перечисляю некоторые варианты использования для Пользовательское пространство, статически определяемая трассировка Я думал или работал над этим. При объединении всего трех точек трассировки у разработчиков есть много возможностей для добавления новых точек трассировки и творчества со сценариями трассировки. Проблема №20981 содержит обсуждение и идеи для дополнительных точек трассировки, которые могут быть реализованы.

Исследователи и разработчики могут использовать точки трассировки сообщений P2P для отслеживания аномалий в сети P2P в режиме реального времени. Одним из примеров может быть обнаружение недавнего переполнения адресных сообщений, о котором сообщается в этом сообщении bitcointalk.org. В сообщениях объявлялись случайные IP-адреса, не принадлежащие узлам сети Биткойн. О наводнении подробно рассказывали Грундманн и Баумстарк. Они обсуждают, что злоумышленник может получить количество подключенных одноранговых узлов и узнать о других адресах, включая адреса Tor, которые прослушивает узел. Это снизит конфиденциальность оператора узла. Важно сохранять бдительность в отношении этих атак, обсуждать их, а затем, при необходимости, реагировать на них.

Точно так же я оснастил диспетчер сетевых адресов Bitcoin Core точками трассировки. Addrman отслеживает сетевые адреса, о которых говорят сплетни, для потенциальных исходящих одноранговых соединений, которые устанавливает узел. Он разработан, чтобы быть устойчивым к атакам Eclipse, когда узел имеет соединения только с одноранговыми узлами, контролируемыми злоумышленником. Злоумышленник может выбрать, какую информацию передать узлу, например, для атак с двойным расходом. Информация об адресах в addrman может помочь обнаружить нарастание атаки eclipse в сочетании с другими данными.

Кроме того, эти точки трассировки addrman могут быть полезны во время отладки и проверки кода. Чтобы продемонстрировать это, я создаю инструмент, который визуализирует адреса в структуре данных addrman на основе данных, отправленных в точки трассировки.

body [data-twttr-rendered = «true»] {background-color: transparent;} .twitter-tweet {margin: auto! important;}

& # x200a; — & # x200a; @ 0xB10C

function notifyResize (height) {height = height? height: document.documentElement.offsetHeight; var resized = false; if (window.donkey && donkey.resize) {donkey.resize (height); resized = true;} if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe (объект); resized = true;} if (window.location && window.location.hash === «# amp = 1» && window.parent && window.parent.postMessage) {window.parent.postMessage ({sentinel: «amp», type: «embed-size», height: height}, «*»);} if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize) {window.webkit.messageHandlers.resize.postMessage ( рост); resized = true;} return resized;} twttr.events.bind (‘обработано’, функция (событие) {notifyResize ();}); twttr.events.bind (‘изменение размера’, функция (событие) {notifyResize ();}); if (parent && parent._resizeIframe) {var maxWidth = parseInt (window.frameElement.getAttribute («width»)); if (500 <maxWidth) {window.frameElement.setAttribute ("width", "500");}}

Экспортер метрики Prometheus также может строить поверх точек трассировки, не требуя дополнительного кода в Bitcoin Core. Уже существуют экспортеры Prometheus на основе RPC и такие проекты, как Statoshi. Однако экспортеры на основе RPC ограничены информацией, предоставляемой через интерфейс RPC, а Statoshi — это большой набор исправлений, который требует обслуживания при каждом выпуске Bitcoin Core. Я опубликовал экспериментальный экспортер на основе USDT под названием bitcoind-Observer, который подключается к трем объединенным в настоящее время точкам трассировки и обслуживает метрики в формате Prometheus. Экспортер может использоваться всеми, кто в настоящее время использует узел Bitcoin Core, скомпилированный с поддержкой USDT. Демо-версия доступна на bitcoind.observer.

Уже существующая проверка точки трассировки: block_connected может использоваться для тестирования проверки правильности блоков. Это позволяет, например, сравнивать производительность начальной загрузки блока между различными патчами и может помочь в обнаружении улучшений и падений производительности. Например, проект bitcoinperf может выиграть от таких точек трассировки. Я использовал точку трассировки для тестирования запроса на вытягивание № 22702 Мартина Анкерлса. В случае объединения предлагаемые им изменения приведут к значительному ускорению проверки блока и сокращению использования памяти.

Следующие шаги

Я соберу дальнейшие идеи для точек трассировки и реализую их вместе с примером сценарии трассировки и другие инструменты. Это также будет включать общение с другими разработчиками Bitcoin и Bitcoin Core о том, какие точки трассировки могут быть полезны в их проектах. Примером может служить сторожевой таймер межуровневого обнаружения аномалий Антуана Риара, который он первоначально предложил в качестве нового внутреннего модуля для Bitcoin Core. Однако многие из необходимых событий и показателей могут быть собраны путем подключения к точкам трассировки. Это означает, что сторожевой таймер может быть внешней средой выполнения, что ускорит разработку сторожевого таймера и требует меньшего количества кода и обслуживания на стороне ядра биткойна.

Если все пойдет по плану, выпуск биткойна v23.0 Core, который ожидается в начале 2022 года, будет включать первый набор точек трассировки. Цель состоит в том, чтобы по умолчанию включить поддержку USDT в сборках релизов, что еще требует некоторой доработки. Кроме того, API точек трассировки должен быть полустабильным и, следовательно, требует тестирования.

Вкратце: я добавляю точки трассировки в Bitcoin Core, к которым пользователи могут подключиться, чтобы получить представление о внутреннем состоянии. Точки трассировки основаны на технологии ядра Linux и не требуют навязчивых изменений или специальных инструментов. Фундамент сделан. Теперь можно добавлять дополнительные точки трассировки и писать инструменты.

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

Пользовательское пространство, поддержка статически определенной трассировки для Bitcoin Core изначально была опубликована в блоге Coinbase на Medium, где люди продолжают разговор, выделяя эту историю и отвечая на нее.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *