Я пытаюсь понять реализацию SPV.
Я прочитал вики-страницы по спецификации протокола и безопасности тонкого клиента , а также главу 8 технического документа .
Чего я не понимаю:
предположим, что у пользователя A
есть биткойн-адрес X
.
Пользователь A
может сделать getheaders
и загрузить все заголовки блоков, а затем получить все хэши и временные метки блоков.
Итак: как клиент SPV затем находит возможные транзакции на биткойн-адрес пользователя, X
не загружая все блоки (и все транзакции)?
Вы правы в том, что SPV, описанный в статье о биткойнах, не объясняет, как обнаружить платежи самому себе без загрузки полных блоков. Я предполагаю, что Сатоши либо планировал разработать это позже, либо предполагал, что вам просто сообщат о платежах самому себе (плата за IP, существующая рядом с платой за публичный хэш, которая используется сейчас).
Однако сегодняшние практические реализации узлов SPV используют расширение протокола, называемое фильтрами Блума, описанное в BIP 37 . Они используют getheaders
для получения информации о блоке до временной метки своего кошелька, а затем запрашивают отфильтрованные блоки . Для этого они отправляют партнеру фильтр Блума, описывающий интересующие их адреса и транзакции. Затем партнер включает только соответствующие транзакции в блоки, которые он отправляет, вместе с их путями Merkle, чтобы доказать, что эти транзакции действительно были частью указанного блока.
Если поможет https://gist.github.com/TOMOAKI12345/7e0aa1c6b8ace4a70ca6
Исходный код Breadwallet — действительно хороший источник для изучения сетевого протокола кошелька SPV.
Только что нашел кое-что в исходном коде биткойнов:
/**
* 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 предназначен только для проверки транзакций, а не для расчета баланса или списка всех транзакций по определенному адресу.
Андрия