Глоссарий / Узлы и ПО
Упрощенная проверка платежей
Другие названия: SPV.
- Что такое упрощенная проверка платежей?
- Упрощенная проверка платежей проверяет, что транзакция находится в блоке, за которым стоит реальное доказательство работы, используя только заголовки блоков и ветвь дерева Меркла.
Сатоши Накамото описал этот метод в разделе 8 белой книги 2008 как способ пользоваться биткоином, не запуская сервер. Он дешев, потому что заголовок блока занимает 80 байт: примерно на 960 000 блоках вся цепочка заголовков весит около 77 МБ против 759 ГБ, которые занимают сами блоки в августе 2026 года. Он дает вам доказательство того, что майнеры зафиксировали ваш платеж, и ровно ничего о том, был ли этот платеж законным.
Как это работает
Упрощенная проверка платежей отвечает на один вопрос с помощью двух видов доказательств.
Первое доказательство представляет собой цепочку заголовков. Каждый заголовок блока занимает ровно 80 байт и содержит хеш предыдущего заголовка, корень Меркла транзакций внутри блока, метку времени и целевой уровень сложности, который майнер должен был превзойти. Клиент скачивает только заголовки, проверяет, что каждый ссылается на предыдущий и что каждый хеш действительно ниже заявленной цели, и в итоге получает цепочку, которую можно оценить в электроэнергии. Подделать ее нельзя, просто убедительно соврав: для этого нужно заново выполнить майнинг.
Второе доказательство представляет собой ветвь Меркла. Транзакции в блоке попарно хешируются, пока не останется один корень, поэтому доказательство того, что конкретная транзакция входит в блок, требует лишь нескольких соседних хешей на пути к этому корню. Их число логарифмическое: блоку с 4096 транзакциями нужно 12 хешей, то есть 384 байта, а удвоение числа транзакций в блоке добавляет еще только один. Клиент поднимается по ветви, вычисляя хеши, сравнивает результат с корнем Меркла в заголовке, которому он уже доверяет, и транзакция либо есть в этом блоке, либо нет.
Соедините оба элемента, и получите утверждение, которое делает упрощенная проверка платежей: эта транзакция была зафиксирована блоком, и с тех пор поверх нее накопилось измеримое количество работы.
Теперь о пробелах, потому что именно они полезны. Включение в блок не означает действительность. Метод не может сказать вам, что потраченные биткоины существовали, что подписи были верными, что блок выдал майнеру правильную субсидию или что те же биткоины не были потрачены в другой ветви. Он не может доказать и отрицательное утверждение: сервер, который просто опускает платеж, не оставляет после себя никаких свидетельств. Сатоши прямо записал эту оговорку в белую книгу, отметив, что метод надежен, пока честные узлы контролируют сеть, и что компании, получающие частые платежи, все равно захотят запускать свой собственный узел.
Почему это важно при покупке биткоина
Зеленая галочка в кошельке на смартфоне обычно вовсе не является проверкой.
Большинство кошельков, которые устанавливают после первой покупки на бирже, никогда не строят цепочку заголовков. Они спрашивают у сервера компании, сколько у вас средств, показывают ответ и помечают его как подтвержденный. Это более слабая гарантия, чем метод из белой книги, а метод из белой книги сам по себе слабее узла. Для небольших повседневных балансов такая цепочка доверия подходит, и делать вид, что это не так, никому не помогает. Она перестает подходить в тот момент, когда сумма станет ощутимой.
Практический вопрос в том, кому вы доверяете и как долго. В наших обзорах бирж перечислено, что требует каждая платформа перед выдачей вывода, и каждое из этих чисел подтверждений является отчетом собственного узла этой биржи. Когда биткоины приходят, кошелек, который их вам показывает, снова отчитывается от чужого узла. Ни одна из сторон, вероятно, не лжет. Обе могут ошибаться, быть отключены от сети или обслуживать цепочку, которую им передали, и ни одна не сообщит вам, когда это произойдет.
Есть и аспект приватности. Исследование 2014 года о клиентах с фильтрами Блума обнаружило, что фильтры, предназначенные скрывать, какие адреса интересуют кошелек, выдавали большинство из них. Поэтому Bitcoin Core отключил эту функцию по умолчанию в версии 0.19.0 в ноябре 2019 года, и поэтому более новые легкие кошельки скачивают компактные фильтры вместо того, чтобы загружать запросы.
Что упрощенная проверка платежей пропустила бы в сентябре 2018 года
CVE-2018-17144 является самым наглядным примером разницы между включением в блок и действительностью в истории биткоина.
Оптимизация, добавленная в Bitcoin Core 0.14.0, пропускала проверку, которую считали избыточной, и в результате затронутые версии частично обрабатывали блок, содержащий транзакцию, которая дважды тратила один и тот же вход. При одном развитии событий узел падал. При другом майнер мог создать биткоины из ничего. Об ошибке сообщили 17 сентября 2018 года, и на следующий день она была исправлена в Bitcoin Core 0.16.3. В действующей сети ее никто не использовал.
Представьте, что кто-то все же использовал бы ее. Майнер создает блок, который завышает предложение, с заголовком, несущим полностью подлинное доказательство работы, и безупречно правильным деревом Меркла. Обновленный полный узел разбирает блок, находит повторяющийся вход, отклоняет блок и отключает отправившего его пира. Клиент, выполняющий упрощенную проверку платежей, проверяет заголовок, проверяет ветвь и сообщает, что платеж внутри подтвержден, потому что каждое доступное ему свидетельство действительно. У него нет доступа к тратимому входу, поэтому такой вопрос вообще не возникает.
В этом весь компромисс. Упрощенная проверка платежей наследует свои правила от того, кто ведет майнинг. Узел так не поступает.
Упрощенная проверка платежей vs Neutrino
Упрощенная проверка платежей и Neutrino обе позволяют кошельку работать без полной цепочки, и они направляют фильтрацию в противоположные стороны. Классический подход в рамках BIP37 отправляет ваши интересы пиру: вы загружаете фильтр, пир ищет за вас и узнает примерно, какими адресами вы владеете. Neutrino, реализация BIP157 и BIP158, которую используют большинство мобильных кошельков Lightning, заставляет узел публиковать один компактный фильтр на блок для всех; ваш кошелек скачивает фильтры, проверяет их приватно и запрашивает только совпавшие блоки. Проверка, которую вы выполняете после этого, остается той же арифметикой Меркла и заголовков. Меняется то, что никто на другом конце не узнает, что вы искали.