Как создать SPV-клиент?

Какие шаги предпринимает клиент SPV для синхронизации?

  • Подключиться к пиру
  • Установить фильтр Блума для адресов кошельков
  • Скачать все заголовки блоков с последней контрольной точки
  • Повторно запрашивать каждый блок с установленными фильтрами
  • Обновление баланса кошелька на основе возвращенных блоков

Очевидно, что вышеперечисленные шаги неверны, так как нет смысла сначала загружать все блокхеды для определения правильной цепочки, а затем повторно запрашивать все блоки для расчета баланса кошелька.

Но какова правильная процедура?

Ответы (2)

Это то, что я делаю:

  1. Подключиться к пиру
  2. Установить фильтр Блума
  3. Отправить сообщение «getblocks»
  4. Отправьте сообщение «getdata» с установленным MSG_FILTERED_BLOCK для любых новых блоков.

Обратите внимание, что getblocks возвращает список хэшей цепочки блоков из указанной начальной точки, а не сами блоки. Затем «getdata» возвращает сообщения «merkleblock» вместо полных блоков. Пир следует за сообщением «merkleblock» с любыми транзакциями, которые соответствуют фильтру Блума, как отдельные сообщения «tx».

Более подробная информация содержится в BIP0037.

Если вам нужен пример, мой кошелек Java можно найти на GitHub.

Пара примеров может помочь вам:

https://code.google.com/p/bitcoinj/

Мой проект https://github.com/richardkiss/pycoinnet не завершен (в частности, на момент написания этой статьи нет реализации фильтра Блума), но, возможно, со временем сделает то, что вам нужно.