Глоссарий / Майнинг и консенсус
Блок Меркла
Другие названия: Блок Меркла, Частичная ветвь Меркла.
- Что такое блок Меркла?
- Блок Меркла представляет собой ответ, который получает легкий кошелек, запрашивая отфильтрованное содержимое блока: заголовок размером 80 байт плюс ровно столько хешей, сколько нужно, чтобы доказать, какие транзакции совпали.
Определено в BIP-37.
BIP37 позволял кошельку передать узлу фильтр и получать только совпадения, упакованные в доказательство того, что ничего не было подделано. Замысел провалился и по приватности, и по нагрузке: Bitcoin Core отключил эту функцию по умолчанию в версии 0.19.0, выпущенной в ноябре 2019 года. Если вы пользуетесь современным легким кошельком, он почти наверняка применяет вместо этого компактные фильтры блоков.
Как это работает
Статус: фильтрация по фильтрам Блума из BIP37 и сообщение merkleblock, которое ее обслуживает, были отключены по умолчанию в Bitcoin Core 0.19.0 в ноябре 2019 года по соображениям приватности и защиты от отказа в обслуживании. Компактные фильтры блоков, описанные в BIP157 и BIP158, заменили их, и Bitcoin Core умеет отдавать их пирам с версии 0.21.0, выпущенной в январе 2021 года.
Блок Меркла является доказательством, а не сводкой. Его структура состоит из четырех частей: заголовок блока, общее число транзакций в блоке, упорядоченный список хешей и компактное битовое поле флагов. Флаги описывают обход дерева Меркла этого блока в глубину и сообщают принимающему кошельку, спускаться ли в ветвь или взять следующий хеш из списка как замену всему, что находится под ним. Кошелек повторяет этот обход, получает корень и сравнивает его с корнем в переданном ему заголовке.
В этом сравнении весь смысл. Враждебный пир может скрыть от вас транзакции, просто не упомянув их, и ни один протокол с фильтрацией этого предотвратить не может. Чего он не может, так это выдумать транзакцию, которую вы никогда не получали, потому что поддельный хеш не дал бы корень, совпадающий с заголовком, за которым стоит реальное доказательство работы.
Запрос блока Меркла представляет собой обмен в два шага. Кошелек загружает фильтр сообщением filterload, а затем запрашивает блок, используя тип инвентаря «отфильтрованный блок», а не обычный. Сначала приходит блок Меркла, а следом полные совпавшие транзакции отдельными сообщениями. Блок с 2000 транзакциями и одним совпадением стоит кошельку заголовка, примерно дюжины хешей и одной транзакции вместо мегабайта или больше.
Где это встречается
Блоки Меркла принадлежат поколению мобильных кошельков, которое в основном уже ушло.
Библиотека BitcoinJ сделала их популярными, и Android-кошельки, построенные на ней, большую часть 2010-х годов синхронизировались именно так. Тот, кто пользуется старой сборкой одного из таких приложений, может по-прежнему отправлять сообщения filterload и тихо не находить пира, который ответит, поскольку для обслуживания оператор должен вручную снова включить peerbloomfilters.
То, что их заменило, меняет направление запроса. При компактных фильтрах блоков узел публикует небольшой фильтр для каждого блока, описывающий его содержимое, а кошелек скачивает фильтры, локально решает, какие блоки ему интересны, и загружает их целиком. Ничего об адресах кошелька не покидает устройство. Это модель, лежащая в основе бэкенда Neutrino в lnd и мобильных кошельков Lightning, построенных на нем.
О провале приватности стоит сказать прямо, потому что именно он стал причиной смены подхода. Работа, опубликованная в 2014 году Артуром Жерве и соавторами, показала, что узел, обслуживающий клиента с фильтром Блума, мог восстановить большую часть адресов этого клиента, а запрос двух блоков с одним и тем же фильтром раскрывал еще больше. Заполнение ложными срабатываниями, которое должно было скрыть кошелек, его не скрывало.
Блок Меркла vs фильтр Блума
Наверх кошелек отправляет фильтр Блума, а обратно вниз приходит блок Меркла. Фильтр представляет собой вероятностное описание с потерями тех адресов и outpoints, которые кому-то важны, и хранится на обслуживающем узле. Блок Меркла представляет собой детерминированное доказательство об одном конкретном блоке и хранится в ответе. Их объявили устаревшими как пару, но проблемой приватности был только фильтр. Сами доказательства Меркла по-прежнему в порядке, поэтому компактные фильтры блоков сохранили идею доказательства и отказались от той части, где вы рассказываете незнакомцу, чем владеете.