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

Глоссарий / Узлы и ПО

Компактный фильтр блока

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

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

Один фильтр покрывает один блок, и в нем перечислены скрипты выхода, а не адреса, суммы или идентификаторы транзакций. BIP-158 закрепляет базовый тип 0x00 со значениями P, равным 19, и M, равным 784 931, поэтому элемент, которого в блоке нет, все равно совпадает примерно один раз на 784 931 попытку. Поскольку сопоставление выполняется на вашем устройстве, узел, который отдает фильтр, никогда не узнает, какие биткоины принадлежат вам.

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

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

Список элементов задан спецификацией, поэтому два честных узла для одного и того же блока создают побайтово идентичные фильтры. Для каждой транзакции фильтр берет скрипт предыдущего выхода, который тратит каждый вход (пропуская транзакцию coinbase), и scriptPubKey каждого выхода. Одна категория исключена намеренно: выходы, начинающиеся с OP_RETURN. BIP-158 исключает их, чтобы позднее фильтры можно было закреплять внутри выхода OP_RETURN транзакции coinbase, как уже закрепляется обязательство свидетеля, и при этом обязательству не приходилось бы охватывать само себя.

Для хеширования используется SipHash с c, равным 2, и d, равным 4, с ключом из первых 16 байт хеша блока в его стандартном представлении с обратным порядком байтов. Этот ключ меняется с каждым блоком, поэтому один и тот же скрипт попадает в каждый блок в разное место, и никто не может построить таблицу поиска, работающую в масштабе всей цепи. Затем каждый 64-битный результат отображается в диапазон от нуля до N, умноженного на M, умножением и сдвигом, а не делением.

Сжатие и есть то, на что указывает название: отсортированные значения заменяются последовательными разностями, и каждая разность превращается в частное в унарном коде, за которым следуют 19 бит остатка, то есть кодирование Голомба-Райса. Результат не может быть меньше N, умноженного на 20 бит, и перед ним передается число элементов N в формате CompactSize; блок, фильтр которого не содержит элементов, хранится как один байт нулей. Узел, готовый отдавать такие фильтры, объявляет служебный бит NODE_COMPACT_FILTERS, определяемый как 1, сдвинутая влево на 6.

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

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

Wasabi Wallet служит примером в наших собственных обзорах: только для настольных компьютеров, только биткоин, все соединения по умолчанию через Tor, а синхронизация идет по фильтрам, чтобы никакой сервер не узнал, какие адреса принадлежат вам. Наш рейтинг оценивает его в 3,6 и помечает как требующий осторожности по причине, не связанной с синхронизацией. Electrum с оценкой 4,4 идет другим путем: он проверяет через SPV по индексному серверу, который может запустить любой, и этот сервер в итоге получает список адресов, которыми вы владеете.

Перед тем как полагаться на фильтры, стоит знать о двух ограничениях. Фильтр строится по скриптам, поэтому идентификатор транзакции в нем найти нельзя: если у вас есть только txid, вам все равно нужен узел или обозреватель блоков. А выходы OP_RETURN отсутствуют по самому построению, поэтому программное обеспечение, отслеживающее выходы с данными, на этом механизме построить невозможно.

Компактный фильтр блока vs компактная ретрансляция блоков

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

Адресаты разные. Фильтры создаются для каждого блока, детерминированы, используют как ключ первые 16 байт хеша блока и загружаются клиентами, у которых нет собственной цепи. Ретрансляция заменяет большинство транзакций блока 48-битными идентификаторами, ключ для которых получается из хеша заголовка блока вместе с nonce, выбранным отправителем, и она ничего не экономит получателю, в пуле памяти которого этих транзакций еще нет. Одно избавляет смартфон от скачивания ненужных блоков; другое избавляет узел от повторного получения транзакций. Общее слово «компактный» и есть все сходство.

Не путать с

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

Может ли компактный фильтр блока сообщить кому-либо, какие адреса отслеживает мой кошелек?

Нет. Фильтр строится узлом из содержимого самого блока и публикуется для всех, поэтому о вашем кошельке за пределы вашего устройства ничего не уходит. Пир, который отдает вам совпавший блок, действительно узнает, что вы запросили именно этот блок, но это гораздо более слабый сигнал, чем список адресов.

Почему мой кошелек иногда скачивает блок, не имеющий ко мне никакого отношения?

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

Можно ли найти идентификатор транзакции в компактном фильтре блока?

Нет. Базовый фильтр BIP-158 содержит только скрипты выходов: scriptPubKey каждого выхода, кроме выходов OP_RETURN, а также скрипт предыдущего выхода, расходуемый каждым входом, не являющимся coinbase. Идентификатора транзакции там нет, поэтому вам все равно нужен узел или обозреватель блоков.

Читайте далее

Источники

Последняя проверка: 6 сентября 2026 г.

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

Еще в разделе «Узлы и ПО»

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