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 виявляє хибні фільтри порівнянням peer-вузлів із принаймні одним чесним учасником. Відтворення basic може також потребувати скриптів витрачених попередніх виходів. Реорганізація вимагає фільтрів нової гілки та перерахунку стану гаманця; та сама стара висота не означає той самий блок. [BIP 157 — Client Side Block Filtering] [Bitcoin Core — BasicFilterElements]
На відміну від BIP 37, клієнт не надсилає серверу власний адресний фільтр. Peer усе ще може бачити IP, час і запитані блоки. Завантаження від різних peer-вузлів обмежує зосередження даних, але не всі кореляції; випадковий збіг сам не робить зв’язок анонімним. [BIP 157 — Client Side Block Filtering]
Bitcoin Core RPC getblockfilter повертає фільтр і заголовок за хешем блоку при ввімкненому відповідному індексі. Це не доводить наявності публічної P2P-служби або всіх історичних блоків у peer-вузла. Клієнту потрібне працездатне джерело блоків; такі фільтри не повідомляють про непідтверджені транзакції 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.