Как кошельки SPV (простая проверка платежей) узнают о входящих транзакциях?

Я пытаюсь понять реализацию SPV.

Я прочитал вики-страницы по спецификации протокола и безопасности тонкого клиента , а также главу 8 технического документа .

Чего я не понимаю:
предположим, что у пользователя Aесть биткойн-адрес X.
Пользователь Aможет сделать getheadersи загрузить все заголовки блоков, а затем получить все хэши и временные метки блоков.

Итак: как клиент SPV затем находит возможные транзакции на биткойн-адрес пользователя, Xне загружая все блоки (и все транзакции)?

Ответы (5)

Вы правы в том, что SPV, описанный в статье о биткойнах, не объясняет, как обнаружить платежи самому себе без загрузки полных блоков. Я предполагаю, что Сатоши либо планировал разработать это позже, либо предполагал, что вам просто сообщат о платежах самому себе (плата за IP, существующая рядом с платой за публичный хэш, которая используется сейчас).

Однако сегодняшние практические реализации узлов SPV используют расширение протокола, называемое фильтрами Блума, описанное в BIP 37 . Они используют getheadersдля получения информации о блоке до временной метки своего кошелька, а затем запрашивают отфильтрованные блоки . Для этого они отправляют партнеру фильтр Блума, описывающий интересующие их адреса и транзакции. Затем партнер включает только соответствующие транзакции в блоки, которые он отправляет, вместе с их путями Merkle, чтобы доказать, что эти транзакции действительно были частью указанного блока.

Если поможет https://gist.github.com/TOMOAKI12345/7e0aa1c6b8ace4a70ca6

Исходный код Breadwallet — действительно хороший источник для изучения сетевого протокола кошелька SPV.

Источник Breadwallet больше недоступен.

Только что нашел кое-что в исходном коде биткойнов:

/**
 * The "getheaders" command is structurally identical to "getblocks", but has different meaning. On receiving this
 * message a Bitcoin node returns matching blocks up to the limit, but without the bodies. It is useful as an
 * optimization: when your wallet does not contain any keys created before a particular time, you don't have to download
 * the bodies for those blocks because you know there are no relevant transactions.
 */

В дополнение к приведенным выше ответам вы можете обратиться к этой диаграмме, если она поможет по этой ссылке .

введите описание изображения здесь

Я думаю, что SPV предназначен только для проверки транзакций, а не для расчета баланса или списка всех транзакций по определенному адресу.

Но как Multibit (тонкий клиент SPV) так быстро проверяет входящие платежи?
@Jonas, Multibit использует фильтры Блума, поэтому он может так быстро проверять входящие платежи.
Я проголосовал против. Проверка транзакции — это именно то, чего SPV не делает: он проверяет только цепочку блоков, а не транзакции в ней.
Клиенты SPV могут рассчитывать балансы и составлять список транзакций по определенным адресам, запрашивая отфильтрованные блоки. Клиенты SPV также проверяют действительность транзакции, проверяя подписи; что SPV не проверяет, так это включение выходов в utxo, так что возможны двойные траты.
Клиенты @dionyziz SPV не могут проверять подписи, так как у них нет записей UTXO, чтобы знать, что проверять.