Я хотел бы лучше понять, как работает легкий клиент. Насколько мне известно, легкий клиент хранит локально только заголовки блоков (каждый по 80 байт) и получает новый заголовок блока в среднем каждые 10 минут.
У меня по сути два вопроса:
1) Как легкий клиент может получить транзакцию по ее хэшу? Я хотел бы вернуть полную транзакцию, чтобы прочитать данные после кода OP_RETURN.
2) Как легкий клиент может быть уверен, что полученная транзакция действительно является транзакцией в самой длинной цепочке блоков? Он просто проверяет, есть ли уже подтвержденные 5 блоков после блока транзакции?
Большое спасибо
1) Самый простой способ в рамках протокола, вероятно, состоит в том, чтобы добавить этот хэш транзакции в фильтр Блума, отправить фильтр Блума на удаленный узел filterload
и запросить каждый отфильтрованный блок. Это отправит вам только интересующую вас транзакцию. (Также будет отправлено несколько дополнительных транзакций, которые соответствуют фильтру Блума, поскольку они являются ложными срабатываниями.) См. BIP37 для получения более подробной информации о том, как работает эта функция. Вот как легкие клиенты на основе BitcoinJ находят транзакции, соответствующие им.
Зная высоту блока, в которую он включен, это чрезвычайно упростит, так как вам нужно будет смотреть только на один блок, а не на всю цепочку.
2) Нет. Они получают заголовки блоков для всей лучшей цепочки. Это идет от блока генезиса до текущей вершины. (В настоящее время это 450000*80=36MB
) Затем они проверяют, что соответствующий блок находится где-то в этой цепочке.
gatb27
Ник Оделл
gatb27
Ник Оделл
gatb27
tx_hash
иblock_number
, какое сообщение мне нужно отправить своим сверстникам, чтобы вернуть полную транзакцию?Ник Оделл
block_hash
иtx_hash
, вы отправляете фильтр Блума с расширениемfilterload
. Затем вы отправляетеgetdata
с типом запросаMSG_FILTERED_BLOCK
и хэшем блока. Это документирует детали низкого уровня. en.bitcoin.it/wiki/Protocol_documentation#Inventory_Vectors Позвольте мне посмотреть, смогу ли я разработать для вас пример кода.gatb27
tx_hash
иblock_number
возвращает шестнадцатеричный код после OP_RETURN в выводе tx_hash. Где я могу найти руководство по обучению, как это сделать? :)