Compact Block Filters — небольшие вероятностные индексы отдельных блоков, построенные детерминированно. BIP 158 задаёт содержимое и кодирование, BIP 157 — передачу и проверку связности; клиент сопоставляет свои скрипты локально.
Кошелёк синхронизирует заголовки блоков и фильтров, скачивает фильтры и проверяет скрипты локально. При совпадении получает целый блок и ищет конкретную транзакцию. Само совпадение не должно увеличивать баланс: фильтр не возвращает сумму, доказательство владения или полную историю транзакций. [BIP 157 — Client Side Block Filtering]
BIP 158 basic включает scriptPubKey новых выходов, кроме начинающихся с OP_RETURN, и скрипты предыдущих выходов, расходуемых входами вне coinbase. Пустые элементы пропускаются. Адрес нужно преобразовать в правильный скрипт; это не универсальный индекс txid, witness-данных или произвольных заметок. [BIP 158 — Compact Block Filters for Light Clients] [Bitcoin Core — BasicFilterElements]
Golomb-Rice кодирует разности упорядоченных хешированных значений; basic использует P=19 и M=784931. Запрос отсутствующего элемента может совпасть с вероятностью около 1/M. Больше скриптов дают больше возможностей коллизии, а не постоянную частоту ошибок кошелька. Правильный фильтр не пропускает включённый элемент. [BIP 158 — Compact Block Filters for Light Clients]
Заголовок связывает хеш текущего фильтра с предыдущим заголовком. Проверка связности выявляет расхождение с принятой цепочкой, но этого обязательства нет в заголовке блока Bitcoin. Злоумышленник может дать внутренне согласованные ложные фильтры; правильный хеш сам не гарантирует правдивого содержимого. [BIP 157 — Client Side Block Filtering]
BIP 157 выявляет ложные фильтры сравнением пиров с хотя бы одним честным участником. Восстановление basic может требовать и скрипты потраченных предыдущих выходов. Реорганизация требует фильтров новой ветви и пересчёта состояния кошелька; прежняя высота не определяет тот же блок. [BIP 157 — Client Side Block Filtering] [Bitcoin Core — BasicFilterElements]
В отличие от BIP 37 клиент не посылает серверу личный фильтр адресов. Пир всё ещё может наблюдать IP, время и запрашиваемые блоки. Скачивание у разных пиров ограничивает сосредоточение информации, но не все корреляции; случайные совпадения сами не делают общение анонимным. [BIP 157 — Client Side Block Filtering]
Bitcoin Core RPC getblockfilter возвращает фильтр и заголовок по хешу блока при включённом соответствующем индексе. Это не доказывает публичный P2P-сервис или возможность пира выдать все исторические блоки. Клиенту нужен рабочий источник блоков; такие фильтры не объявляют неподтверждённые транзакции Mempool. [BIP 157 — Client Side Block Filtering] [Bitcoin Core 30.0 — getblockfilter]
Compact Blocks по BIP 152 ускоряют передачу нового блока короткими идентификаторами транзакций и локальным Mempool. Compact Block Filters отбирают нужные клиенту блоки. Ни локальное совпадение, ни проверка включения транзакции не заменяют независимой полной консенсусной валидации всех блоков. [BIP 157 — Client Side Block Filtering] [BIP 152 — Compact Block Relay]
Для полной картины прочитайте эту статью вместе с Compact Block Filters, Neutrino, Full Node, Приватность в Bitcoin, Compact block relay. На эту статью также ссылаются Neutrino.