Глоссарий / Узлы и ПО
Neutrino
Другие названия: BIP157, Компактные фильтры блоков.
- Что такое Neutrino?
- Neutrino представляет собой схему легкого клиента, в которой ваш кошелек скачивает крошечный фильтр для каждого блока, проверяет его локально и запрашивает целиком только те блоки, которые могут его касаться.
Определено в BIP-157.
Весь смысл в том, чтобы перевернуть прежнюю схему. Вместо того чтобы сообщать серверу, за какими адресами следить, кошелек берет компактную сводку каждого блока и выполняет сопоставление на собственном оборудовании. Bitcoin Core умеет строить такие фильтры с версии 0.19.0 от ноября 2019 года и отдавать их пирам с версии 0.21.0, поэтому механизм больше не зависит от доверия к одному поставщику.
Как это работает
Neutrino опирается на две спецификации, между которыми разделена одна задача.
BIP158 определяет сам фильтр: для каждого блока набор, содержащий каждый выходной скрипт, который блок создает, и каждый выходной скрипт, который он расходует, сжатый в структуру с кодированием Голомба-Райса. Оба его параметра зафиксированы спецификацией: P равен 19, M равен 784 931, что дает долю ложных срабатываний примерно один на 784 931 проверенный элемент. На практике кошелек, отслеживающий несколько десятков скриптов, скачивает за год горстку ненужных блоков.
BIP157 определяет сообщения, которые передают эти фильтры: getcfilters и cfilter для фильтров, getcfheaders и cfheaders для цепочки заголовков фильтров, getcfcheckpt для периодических контрольных точек. Заголовки фильтров важнее, чем кажется. Каждый из них фиксирует предыдущий, поэтому клиент может запросить контрольные точки у нескольких независимых пиров и сразу заметить, если один из них отдает иной набор фильтров, чем остальные, не скачивая для этого блоки.
Дальше порядок работы кошелька прост. Он синхронизирует заголовки блоков, скачивает каждый фильтр, проверяет каждый из них по своим скриптам и запрашивает блок целиком только тогда, когда фильтр указывает на возможное совпадение. Пир, отдающий этот блок, узнает, что вам нужен блок 912 345 и ничего больше, что является гораздо более слабым сигналом, чем список ваших адресов. На узле Bitcoin Core индекс включается опцией blockfilterindex, он занимал около 4 GiB диска на момент появления функции, и отдается пирам опцией peerblockfilters.
Где это встречается
Neutrino является бэкендом цепочки в мобильных кошельках Lightning, которые не желают запускать сервер.
Название принадлежит прежде всего реализации на Go от Lightning Labs, которую lnd может использовать вместо полного узла, и именно там большинство людей с ней сталкивается: кошелек на смартфоне, который открывает каналы и оплачивает счета, не неся собственного блокчейна. Breez и несколько других мобильных кошельков идут тем же путем.
Платой становятся трафик и терпение. Клиент Neutrino скачивает каждый фильтр независимо от того, есть ли совпадение, поэтому расходует гораздо больше данных, чем кошелек, который просто спрашивает у сервера баланс, а восстановление старой резервной копии означает перебор фильтров вперед от высоты создания кошелька, а не ответ одним запросом. На мобильном соединении с лимитом трафика такой компромисс является реальным решением, а не формальностью.
Neutrino vs фильтры Блума BIP37
В Neutrino блоки фильтрует клиент; в BIP37 клиент передавал свой фильтр серверу, а это устроено наоборот. Фильтр Блума BIP37 строится из ваших собственных адресов и отправляется пиру, и исследователи неоднократно показывали, что ложные срабатывания мало что скрывают из его содержимого. Он также был дешевым способом отказа в обслуживании, поскольку любой пир мог попросить узел повторно просканировать всю цепочку с произвольным фильтром. Bitcoin Core перестал по умолчанию обслуживать BIP37 в версии 0.19.0, том же выпуске, где появился индекс компактных фильтров, и любой кошелек, который по-прежнему на него полагается, раскрывает свой набор адресов тому узлу, к которому случайно подключен.
Neutrino vs сервер Electrum
Neutrino переносит работу и знание на ваше устройство; сервер Electrum сохраняет и то и другое. Запрос к серверу стоит килобайты и отвечает сразу, поэтому настольные кошельки предпочитают его, но в итоге оператор получает историю ваших адресов. Neutrino же за срок жизни кошелька расходует гигабайты, чтобы эта история оставалась на вашем смартфоне.