Как проверить, был ли потрачен выход?

Используя клиент rpc (например bitcoin-cli), для данной транзакции и индекса ее вывода, как я могу определить, является ли вывод в настоящее время utxo или он уже был потрачен?

В последнем случае я также хотел бы знать транзакцию, на которую она потрачена.

Я посмотрел на gettxoutкоманду, но мне непонятно, как извлечь ответ из возвращаемых ею данных.

Я запускаю полный узел с txindex=1.

Ответы (2)

Если gettxoutчто-то возвращает, результат остается неизрасходованным. Если он ничего не возвращает, вывод либо никогда не существовал, либо был потрачен.

Вам для этого не нужно -txindex.

Я понимаю. Итак, есть ли способ узнать, какой tx его потратил? Кроме того, Unconfirmedпараметр здесь как-то актуален?
Нет, в Bitcoin Core нет ничего, что отслеживало бы, какие tx что-то потратили. Как только UTXO потрачен, он просто удаляется из базы данных. Если для Unconfirmed установлено значение true, он будет обрабатывать транзакции в мемпуле, как если бы они были в блоке (поэтому он будет перечислять их выходные данные и удалять их входные данные).
Ссылка разработчика гласит: The gettxout RPC returns details about a transaction output. Only unspent transaction outputs (UTXOs) are guaranteed to be available.это означает, что потраченные txos также могут быть доступны. Играя с RPC, на практике кажется, что если он ничего не возвращает, он действительно не потрачен, но гарантируется ли это? Ссылка разработчика неверна? bitcoin.org/en/developer-reference#gettxout
@ nopara73 Да, это неправильно. Он дает информацию о неизрасходованных выходных данных и ничего не возвращает для потраченных выходных данных.
@PieterWuille Спасибо, сделал PR для исправления в документации: github.com/bitcoin-dot-org/bitcoin.org/pull/1891

Поскольку @pieter-wuille уже ответил на первую половину вашего вопроса:

Если gettxoutчто-то возвращает, результат остается неизрасходованным. Если он ничего не возвращает, вывод либо никогда не существовал, либо был потрачен.

Для этого я бы добавил, что вы можете установить неподтвержденный флаг true, чтобы он также учитывал неподтвержденные транзакции.

Чтобы ответить на вторую часть вашего вопроса, вот неоптимальный способ найти транзакцию, которая потратила ваш txo:
это предполагает txindex=1и prune=0.

Чтобы узнать, кто потратил txout, вы можете определить блок, которым он был подтвержден: getrawtransaction {txid} 1. Отсюда вы можете перебирать все блоки до последнего пришедшего ( getblock) и мемпула ( getrawmempool), проверяя каждую транзакцию:

foreach(var input in tx.inputs)
{
   if(input.prevout.txid == myTxo.txid && input.prevout.index == myTxo.index)
   {
      // tx spent the txo you were looking for
   }
}