Когда биткойн-клиент получает транзакцию, он проверяет, подтверждена ли транзакция. Это делается путем проверки правильности хэширования транзакции в дереве merkle до корня merkle в блоке.
Как клиент узнает, какой блок содержит корень транзакции?
Как получить ветвь merkle после нахождения правильного блока?
В текущем протоколе P2P нет способа запросить историческую (=подтвержденную) транзакцию, не запрашивая блок, в котором она находится. Для поддержки этого потребуется, чтобы одноранговый узел имел полный индекс всех транзакций когда-либо, что не является необходимым для нормального операция.
Чтобы запросить транзакцию, вы должны:
getdata MSG_TX <txid>
для запроса пула памяти или недавно переданной транзакции. В этом случае информации о блоке не существует.getdata MSG_BLOCK <blkid>
для запроса полного блока, и в этом случае вы получите блок вместе с ним, и в любом случае вам нужно будет проверить полное дерево merkle.getdata MSG_FILTERED_BLOCK <blkid>
для запроса отфильтрованного блока (см. BIP37), и в этом случае вы можете проверить частичное дерево Меркла, чтобы убедиться, что транзакция действительно является частью блока.
летняя луковица
Стивен Руз
getdata
метод? Это новый?Питер Уилле
getblocks
/inv
/getdata
/ .block
Питер Уилле
getdata
— это сообщение P2P, а не вызов RPC. Вы можете просто использовать командыgetblock
иgetblockhash
RPC для запроса блоков из базы данных.