Глоссарий / Узлы и ПО
Фильтр Блума
Другие названия: BIP37.
- Что такое фильтр Блума?
- Фильтр Блума представляет собой компактное вероятностное множество, которое легкие кошельки BIP37 отправляли полному узлу, чтобы узел пересылал им только транзакции, вероятно принадлежащие им.
Определено в BIP-37.
Конструкция обменивала пропускную способность на то, что ее авторы надеялись получить как приватность, а приватность так и не появилась. Bitcoin Core перестал обслуживать эти фильтры по умолчанию в версии 0.19.0, выпущенной в ноябре 2019 года, после того как годы исследований показали, насколько много они раскрывают. Кошелек, который все еще полагается на такой фильтр, передает чужой машине рабочий список биткоинов, которыми вы владеете.
Как это работает
Статус: фильтрация Блума по BIP37 была отключена по умолчанию в Bitcoin Core 0.19.0 в ноябре 2019 года, и компактные фильтры блоков BIP157 и BIP158 взяли на себя задачу легких кошельков.
Фильтр Блума представляет собой массив битов плюс несколько хеш-функций. Чтобы вставить элемент, его хешируют несколькими способами, берут каждый результат по модулю длины массива и устанавливают эти биты в единицу. Чтобы проверить элемент, его хешируют теми же способами и смотрят на эти биты. Если хотя бы один из них равен нулю, элемент точно никогда не вставлялся; если все они равны единице, элемент, вероятно, был вставлен, либо другие вставки случайно установили те же биты. Ложные отрицания невозможны. Ложные срабатывания возможны, и их доля служит параметром настройки.
BIP37 зафиксировал арифметику. Размер фильтра ограничен 36 000 байтами, число хеш-функций ограничено 50, а хеширование выполняется версией 3 функции Murmur разрядностью 32 бит с начальным значением, равным номеру хеша, умноженному на 0xFBA4C795, плюс выбранная клиентом поправка. Работой управляют три сообщения: filterload устанавливает фильтр для соединения, filteradd расширяет его, filterclear удаляет его. После установки фильтра узел отвечает на запрос блока сообщением merkleblock, которое несет заголовок размером 80 байт, совпавшие транзакции и ветви Меркла, доказывающие их принадлежность этому блоку. Позднее BIP111 добавил служебный бит NODE_BLOOM, чтобы узел мог сообщать, будет ли он вообще в этом участвовать.
Вся история с приватностью опиралась исключительно на долю ложных срабатываний. Расширьте фильтр, захватите чужие транзакции вместе со своими, и наблюдатель якобы не сможет определить, какие из них какие. Это не подтверждается. Научная работа, опубликованная в 2014 году, показала, что фильтр с реалистичным числом адресов выдает большинство из них, а два фильтра, загруженные одним и тем же кошельком, можно пересечь, чтобы полностью снять маскировку. Повторное подключение к новому узлу с новым фильтром делает проблему хуже, а не лучше.
Второй изъян объяснить проще. Обслуживание фильтра означает сканирование блоков с диска по указанию чужого человека, поэтому любой узел сети мог заставить узел с вращающимся диском выполнить огромный объем неоплаченной работы. Именно этот аргумент об отказе в обслуживании, а не исследование приватности, стоит первым в примечаниях к выпуску 0.19.0.
Где это встречается
Фильтры Блума сохраняются в основном в программном обеспечении, написанном до 2019 года, и в файлах конфигурации, которые обходят их отсутствие.
Кошельки для Android, построенные на библиотеке bitcoinj, использовали BIP37 как единственный источник данных о цепочке, и некоторые из них все еще установлены. Bisq тоже нуждался в этом, поэтому его документация раньше предписывала людям добавлять peerbloomfilters=1 в конфигурацию собственного узла. Эта строка и выдает ситуацию: когда программа просит вас снова включить фильтрацию Блума на узле, который вы запускаете, она просит о технике, которую эталонный клиент отключил по веским причинам.
Современная замена работает наоборот. В рамках BIP157 и BIP158 узел строит один фильтр на блок и публикует его для всех, а кошелек сопоставляет данные на собственном оборудовании, поэтому ничего о ваших адресах не покидает устройство.
Фильтр Блума vs SPV
Фильтр Блума был механизмом доставки; упрощенная проверка платежей представляет собой модель доверия, и смешение этих понятий заставляет людей предполагать, что модель умерла вместе с механизмом. SPV означает проверку того, что транзакция находится под корнем Меркла заголовка в цепочке с наибольшим объемом работы, без проверки остального содержимого этой цепочки. Это рассуждение не изменилось. Изменилось то, как легкий кошелек находит транзакции, которые стоит проверять: раньше он рассылал сжатую схему собственных адресов и надеялся, а теперь он скачивает фильтр на каждый блок и проверяет его у себя.