Блокчейн/Уровень III · Сеть/3.1 Ноды/Урок 4
Ноды с прунингом и лёгкие клиенты (SPV)
Архитектура доверия: от полной верификации до доказательств Меркла
МатериалыНода Bitcoin Core с параметром prune=550 (необязательно)Легкий кошелекОбозреватель блоков
Любопытство
- Как нода может проверить всю историю Биткоина, не храня все блоки вечно?
- Какой именно криптографический механизм позволяет кошельку на смартфоне проверить свой баланс, не загружая сотни гигабайт данных?
- Почему первые фильтры для лёгких кошельков, призванные защищать приватность, раскрывали личность пользователей и как этот недостаток был устранён?
Исследование
- Полная проверка и полное хранение разделимы. Каждая валидирующая нода должна один раз обработать каждый блок, чтобы построить текущий набор непотраченных выходов, но хранить старые блоки после этого не обязана. Некоторые клиенты идут дальше и полностью отказываются от проверки, удостоверяясь лишь в том, что транзакции включены в блоки с достаточным доказательством работы. Выбор подхода — это компромисс: дисковое пространство, трафик и приватность против независимости.
- Нода с прунингом выполняет ту же первоначальную проверку каждого блока начиная с генезис-блока, но затем удаляет старые данные блоков ради экономии места на диске. Параметр `prune` в Bitcoin Core сохраняет не менее 550 МБ последних блоков, удаляя более старые после проверки. Такая нода остаётся полноценным валидатором, способным применять правила консенсуса и защищать кошелёк владельца независимой истиной. Однако она больше не может отдавать другим пирам исторические данные блоков и не поддерживает функции, требующие глубокого поиска по цепочке, например `txindex`.
- Лёгкие клиенты, или SPV-ноды, действуют иначе: они не проверяют полный набор правил. Они загружают только заголовки блоков, содержащие корень Меркла всех транзакций блока. Чтобы проверить включение конкретной транзакции, клиент запрашивает у пира доказательство Меркла и сверяет его с корнем в заголовке. Этот подход опирается на допущение, что цепочка с наибольшей накопленной работой действительна, и жертвует независимым применением правил ради резкого снижения требований к хранилищу и пропускной способности.
- В ранних реализациях SPV использовались фильтры Блума BIP37, позволявшие кошелькам запрашивать у пиров только относящиеся к ним транзакции. Кошелёк отправлял фильтр, описывающий его адреса; пиры просматривали свой мемпул и отправляли подходящие транзакции. Такая схема нарушала приватность: наблюдая за фильтрами, злонамеренный пир мог определить, какие адреса принадлежат пользователю, и отслеживать его активность. В 2019 году (версия 0.19) Bitcoin Core по умолчанию перестал обслуживать фильтры Блума.
- Компактные фильтры блоков (BIP157/158) развернули эту схему в обратную сторону, чтобы восстановить приватность. Вместо того чтобы кошелёк раскрывал свои адреса, полные ноды публикуют компактный фильтр для каждого блока; клиент загружает эти фильтры и локально проверяет их по своим ключам. При совпадении фильтра клиент загружает весь блок, поскольку запрос отдельной транзакции раскрыл бы её пиру. Так пиры не узнают, какие адреса отслеживает кошелёк, что значительно повышает приватность пользователя при сохранении эффективной синхронизации.
- Многие мобильные кошельки получают данные от стороннего сервера, например сервера Electrum, а доказательства Меркла сами сверяют с заголовками блоков. Компромисс очевиден: удобство и низкое потребление ресурсов против независимой проверки и приватности. Пользователь ноды с прунингом сохраняет полную способность к проверке, но может отдавать лишь ограниченную историю; SPV-кошелёк занимает минимум ресурсов, но полагается на пиров в том, что они покажут ему каждую относящуюся к нему транзакцию, и без проверки исходит из того, что цепочка с наибольшей работой действительна.
Ключевые факты
- Нода с прунингом проверяет все блоки начиная с генезис-блока, но удаляет старые данные, сохраняя не менее 550 МБ последних блоков.
- SPV-клиенты загружают только заголовки блоков и проверяют транзакции с помощью доказательств Меркла, сверяя их с корневым хешем заголовка.
- Фильтры Блума BIP37 нарушали приватность пользователей, раскрывая пирам, какие адреса отслеживает кошелёк.
- Компактные фильтры блоков (BIP157/158) позволяют клиентам локально проверять фильтры, предоставленные сервером, сохраняя приватность адресов.
- SPV-кошельки исходят из того, что цепочка с наибольшим накопленным доказательством работы действительна, вместо того чтобы самостоятельно применять все правила консенсуса.
- Ноды с прунингом остаются полноценными валидаторами и могут защищать средства владельца, но не могут отдавать исторические данные блоков другим пирам.
Упражнение девять, шесть, три, один
9СобратьПеречислите 9 типов нод или клиентских реализаций Биткоина. Для каждого укажите: требования к хранилищу, возможности проверки (полная или SPV) и основное назначение.
6СгруппироватьРазделите эти 9 на 6 категорий по уровню независимой проверки и объёму хранимых данных.
3Выделить главноеСократите 6 групп до 3 отдельных компромиссов между конфиденциальностью, безопасностью и потреблением ресурсов.
1КристаллизоватьНапишите одно предложение о том, почему модель доверия лёгкого клиента принципиально отличается от модели доверия полной ноды.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.
- Satoshi Nakamoto, 'Bitcoin: A Peer-to-Peer Electronic Cash System' (2008), Section 8
- BIP37: Connection Bloom filtering
- BIP157: Client Side Block Filtering
- BIP158: Compact Block Filters for Light Clients
- Bitcoin Core release notes 0.11.0 (pruning)
- A. M. Antonopoulos & D. A. Harding, Mastering Bitcoin, 3rd ed. (2023), ch. 10