Neutrino — лёгкий клиент Bitcoin от Lightning Labs, написанный на Go и рассчитанный в том числе на мобильные приложения с Lightning Network. Он использует BIP 157 и BIP 158 для компактных фильтров блоков. Это определённая программная библиотека, а не общее название лёгких кошельков и не замена Full Node, который сам проверяет все правила.
Анна открывает кошелёк и ожидает увидеть полученный платёж. Чтобы показать правильное состояние, приложение должно получить и обработать данные сети Bitcoin. Neutrino может выполнять эту часть работы, не сохраняя всю цепочку блоков на телефоне постоянно. Блок — это группа транзакций, записанная в общую историю сети Bitcoin. В программе за это отвечает ChainService: служба управляет соединениями, локальной базой и синхронизацией заголовков. Заголовок содержит краткие основные сведения о блоке. Приватный ключ — это секретное число, с помощью которого создают цифровую подпись, разрешающую расходование средств. Само использование Neutrino не определяет, кто хранит приватные ключи Анны или разрешает отправку. Управление ключами, интерфейс и резервные копии остаются задачами кошелька, использующего библиотеку. [1]
Компактный фильтр похож на небольшой поисковый указатель для одного блока. Кошелёк загружает его и на собственном устройстве проверяет совпадение с тем, что ищет. На практике он сравнивает скрипты — условия, при которых можно потратить конкретные выходы Bitcoin. Выход — это часть транзакции, которая задаёт сумму и условия её дальнейшего расходования. Отправлять другой стороне весь список своих адресов не требуется. При совпадении кошелёк загружает блок и ищет настоящую транзакцию. Даже правильно созданный фильтр может дать ложноположительный результат: блок загрузится зря, потому что нужного элемента в нём нет. Само совпадение поэтому не подтверждает получение платежа, его сумму или возможность потратить деньги. [1] [2] [3]
Анна меняет телефон и восстанавливает кошелёк. Искать лишь начиная с сегодняшних блоков недостаточно, если платежи приходили раньше. Приложение должно передать правильные отслеживаемые скрипты и достаточно раннюю точку начала поиска. По документации Rescan без заданного начального блока начинает с последнего известного блока, а не автоматически с начала всей истории. Исправный фильтр не найдёт адрес, который кошелёк не ищет, или старые платежи в пропущенном диапазоне. Поэтому завершённое восстановление нужно отличать от продолжающегося сканирования. Пустой список во время восстановления сам по себе не доказывает потерю средств. [1]
Neutrino синхронизирует заголовки блоков и фильтров. Заголовки блоков позволяют проверить связи и Proof of Work — доказательство выполненной вычислительной работы — и следовать цепочке с наибольшей накопленной работой. Это намного больше, чем слепо принять баланс с сервера, но меньше, чем самостоятельно проверить каждую транзакцию и правило, как делает Full Node. Кроме того, это две разные цепочки заголовков. Заголовки блоков Bitcoin не содержат прямого криптографического обязательства в отношении правильности этих фильтров. Одной проверки хешей, криптографических отпечатков, недостаточно, чтобы исключить поддельный, но внутренне согласованный набор фильтров. Экономия работы имеет конкретную границу доверия. [2] [4]
Пир — другой компьютер сети, от которого клиент получает данные. BIP 157 опирается на сравнение ответов и наличие хотя бы одного честного пира для обнаружения неверных фильтров. Если все соединения контролирует один злоумышленник, само число компьютеров не поможет. Они могут согласованно дать ложный ответ или скрыть более новое состояние. Такое отсечение от честных источников связано с Eclipse Attack. Кошельку нужны доступные и достаточно независимые источники, а не просто соединения. Зелёный значок подключения не доказывает, что история платежей уже полная и актуальная. [2]
Ян только что отправил Анне деньги. Транзакция может сначала ждать в Mempool — локальном наборе неподтверждённых транзакций узла — пока майнер не включит её в блок. Документированные уведомления Neutrino recvtx и redeemingtx приходят при подтверждении в блоке, а не при попадании в Mempool. Приложению, показывающему входящие неподтверждённые платежи, нужен дополнительный подходящий механизм. Сам фильтр блока не может сообщить об этом до появления блока. Отправка, принятие пиром и подтверждение — разные события; отсутствие уведомления ещё не означает, что Ян ничего не отправил. [1]
Совпадение фильтра полезно, только если клиент получит и нужный блок. Если сеть сейчас его не предоставляет, правильный вывод — «данных пока не хватает», а не «баланс равен нулю». Состояние может измениться и при реорганизации: сеть принимает другую ветку с большей накопленной работой и отсоединяет ранее присоединённые блоки. Rescan сообщает о присоединении и отсоединении, чтобы приложение пересчитало записи. Приватность тоже не абсолютна: пир не получает список искомых адресов, но видит запросы конкретных блоков и сетевые сведения о соединении. Способ получения данных по-прежнему важен. [1] [2]
Lightning Network — платёжная сеть, построенная на Bitcoin. В платёжном канале два участника обновляют распределение общих средств между собой, вместо того чтобы записывать каждый платёж в блок Bitcoin. Neutrino поставляет данные цепочки; само оно не хранит за пользователя данные для восстановления текущего состояния каналов. Восстановление истории кошелька и каналов — разные задачи. README описывает сохранение запрошенных фильтров и получение блоков без их постоянного хранения; реальные требования зависят от версии и настроек приложения. Прежде чем полагаться на такой кошелёк, нужно разобраться в его собственном порядке резервирования, восстановления и поведении при отказе источников данных. Меньшая база на телефоне не снимает этих обязанностей. [1] [4]
Для полной картины прочитайте эту статью вместе с Compact Block Filters, Compact Block Filters, Full Node, Lightning Network, Eclipse Attack, Bitcoin. На эту статью также ссылаются Compact Block Filters, Compact Block Filters.