Как клиент получает ветку merkle транзакции?

Когда биткойн-клиент получает транзакцию, он проверяет, подтверждена ли транзакция. Это делается путем проверки правильности хэширования транзакции в дереве merkle до корня merkle в блоке.

Как клиент узнает, какой блок содержит корень транзакции?

Как получить ветвь merkle после нахождения правильного блока?

Ответы (1)

В текущем протоколе P2P нет способа запросить историческую (=подтвержденную) транзакцию, не запрашивая блок, в котором она находится. Для поддержки этого потребуется, чтобы одноранговый узел имел полный индекс всех транзакций когда-либо, что не является необходимым для нормального операция.

Чтобы запросить транзакцию, вы должны:

  • Используйте getdata MSG_TX <txid>для запроса пула памяти или недавно переданной транзакции. В этом случае информации о блоке не существует.
  • Используйте getdata MSG_BLOCK <blkid>для запроса полного блока, и в этом случае вы получите блок вместе с ним, и в любом случае вам нужно будет проверить полное дерево merkle.
  • Используйте getdata MSG_FILTERED_BLOCK <blkid>для запроса отфильтрованного блока (см. BIP37), и в этом случае вы можете проверить частичное дерево Меркла, чтобы убедиться, что транзакция действительно является частью блока.
Так как же клиент может узнать, какой блок запрашивать?
Почему мой клиент не поддерживает getdataметод? Это новый?
@summerbulb Вы запрашиваете последовательные блоки как часть процесса синхронизации (вы не выбираете блоки для получения определенных транзакций, они просто являются частью этих блоков), используя цикл getblocks/ inv/ getdata/ .block
@StevenRoose getdata— это сообщение P2P, а не вызов RPC. Вы можете просто использовать команды getblockи getblockhashRPC для запроса блоков из базы данных.