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

Глоссарий / Справочник разработчика

MSG_FILTERED_WITNESS_BLOCK

Что такое MSG_FILTERED_WITNESS_BLOCK?
Тип фильтрованного блока со свидетелем присутствует в списке зарезервированных типов из BIP144 и в перечислении исходного кода Bitcoin Core, при этом ни в одном из этих мест за ним не стоит реализация.

Определено в BIP-144.

MSG_FILTERED_WITNESS_BLOCK представляет собой код инвентаря 0x40000003, зарезервированный, когда в 2016 году писались правила segwit для пиров, и так и не получивший реализации. Bitcoin Core содержит его как элемент перечисления с комментарием, где записано именно это. Функция для легких кошельков, которую он должен был расширить, фильтрация по фильтрам Блума из BIP37, была отключена по умолчанию в Bitcoin Core 0.19.0, и это имеет значение для вас, только если кошелек на вашем смартфоне все еще на нее опирается.

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

Статус: зарезервирован и никогда не реализован. BIP144 дал типу название; Bitcoin Core содержит его как элемент перечисления в src/protocol.h с комментарием, где записано, что обработчика не существует. Фильтрация BIP37, которой он должен был служить, отключена по умолчанию начиная с Bitcoin Core 0.19.0 в ноябре 2019 года, а ее заменой стали компактные фильтры блоков из BIP157 и BIP158.

Понять этот пробел означает понять, чем был фильтрованный блок. Легкий клиент, использующий BIP37, отправляет сообщение filterload, которое приблизительно описывает интересующие его адреса. Затем он запрашивает тип инвентаря 3, MSG_FILTERED_BLOCK, и обслуживающий узел отвечает сообщением merkleblock: заголовок блока из 80 байт, число транзакций, частичная ветвь дерева Меркла и битовое поле, указывающее, как обходить дерево. Совпавшие транзакции приходят следом отдельными сообщениями. Клиент проверяет, что каждая из них действительно связана с корнем дерева Меркла из заголовка, и делает это, используя только txid.

Свидетели в эту арифметику никогда не входили. Поскольку корень дерева Меркла строится из txid, легкий клиент может доказать включение без единой подписи, поэтому последующие транзакции отправлялись без данных свидетеля. Зарезервированный тип 3 с добавленным флагом свидетеля, 0x40000003, позволил бы клиенту запрашивать эти транзакции полностью. Никто его не реализовал, потому что никто из создателей легких кошельков не хотел больше BIP37.

Причина в конфиденциальности, а не в трудозатратах. Фильтр, который загружает клиент, сообщает обслуживающему узлу приблизительно, какие адреса ему принадлежат, и исследования середины 2010-х годов показали, что такие фильтры раскрывали гораздо больше, чем предполагалось. Ответ Bitcoin Core состоял в том, чтобы перестать обслуживать их по умолчанию, а не исправлять саму схему. BIP158 вместо этого меняет направление потока: узел строит один небольшой фильтр с кодированием Голомба на каждый блок, настроенный на долю ложных срабатываний один к 784 931, и публикует его. Клиент скачивает фильтры, проверяет их локально и запрашивает целый блок только при совпадении, поэтому сервер ничего не узнает о том, какие адреса вас интересовали.

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

Почти нигде, и это честный ответ для того, кто найдет MSG_FILTERED_WITNESS_BLOCK в справочной таблице.

Если выполнить grep по константе в Bitcoin Core, найдется один единственный элемент перечисления. Альтернативные реализации, такие как btcd, повторяют это имя в своих пакетах wire для полноты, опять же без какого-либо поведения за ним. Ни один кошелек никогда его не отправлял.

Покупателя эта тема касается в том, как мобильный кошелек получает свои данные. Если кошелек называет себя SPV и подключается к случайным публичным узлам с фильтрами Блума, он использует механизм, который эталонная реализация перестала обслуживать по умолчанию много лет назад, и сообщает этим узлам кое-что о ваших адресах. Кошельки на компактных фильтрах блоков, схеме, лежащей в основе Neutrino от lnd, запрашивают гораздо меньше. Кошелек, направленный на собственный сервер своего поставщика, представляет собой третий вариант и самый распространенный: быстрый, скрытый от посторонних и полностью видимый поставщику.

MSG_FILTERED_WITNESS_BLOCK vs блок Меркла

Блок Меркла является ответом; MSG_FILTERED_WITNESS_BLOCK представляет собой запрос, который так и не был подключен к его созданию. Сообщение merkleblock является реальной реализованной структурой, которая доказывает принадлежность набора транзакций блоку, не передавая сам блок. Зарезервированный вариант со свидетелем изменил бы только то, что шло после этого доказательства, а именно, приходят ли совпавшие транзакции вместе со своими подписями. Поскольку доказательства включения работают на основе txid, отсутствующая функция никому ничего не стоила.

Не путать с

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

Стоит ли избегать кошельков, использующих фильтры Блума BIP37?

Предпочитайте альтернативы, когда у вас есть выбор. Bitcoin Core перестал обслуживать фильтры Блума по умолчанию в версии 0.19.0, потому что фильтр, который загружает кошелек, раскрывает приблизительно, какими адресами он владеет. Кошельки на компактных фильтрах блоков BIP158 или на вашем собственном узле раскрывают гораздо меньше.

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

Еще в разделе «Справочник разработчика»

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