Wie überprüfe ich, ob eine Ausgabe ausgegeben wurde?

Wie kann ich mit einem RPC-Client (z. B. bitcoin-cli) für eine bestimmte Transaktion und einen Index einer Ausgabe davon feststellen, ob die Ausgabe derzeit ein utxo ist oder ob sie bereits ausgegeben wurde?

Im letzteren Fall würde ich auch die Transaktion wissen wollen, die es ausgegeben hat.

Ich habe mir den gettxoutBefehl angesehen, aber es ist mir nicht klar, wie ich die Antwort aus den zurückgegebenen Daten extrahieren soll.

Ich betreibe einen vollständigen Knoten mit txindex=1.

Antworten (2)

Wenn gettxoutetwas zurückgegeben wird, wird die Ausgabe nicht ausgegeben. Wenn es nichts zurückgibt, hat die Ausgabe entweder nie existiert oder wird ausgegeben.

Sie brauchen -txindexdafür nicht.

Ich verstehe. Gibt es also eine Möglichkeit zu sagen, welcher TX es ausgegeben hat? Ist der UnconfirmedParameter hier auch irgendwie relevant?
Nein, es gibt nichts in Bitcoin Core, das nachverfolgt, welche TX etwas ausgegeben hat. Sobald ein UTXO ausgegeben wurde, wird es einfach aus der Datenbank entfernt. Wenn „Unconfirmed“ auf „true“ gesetzt ist, werden Transaktionen im Mempool so behandelt, als ob sie sich in einem Block befänden (also werden ihre Ausgaben aufgelistet und ihre Eingaben entfernt).
In der Entwicklerreferenz heißt es: The gettxout RPC returns details about a transaction output. Only unspent transaction outputs (UTXOs) are guaranteed to be available.Das bedeutet, dass verbrauchte Txos möglicherweise auch verfügbar sind. Wenn Sie mit RPC spielen, scheint es in der Praxis, dass es tatsächlich nicht ausgegeben wird, wenn es nichts zurückgibt, aber ist das garantiert? Ist die Entwicklerreferenz falsch? bitcoin.org/en/developer-reference#gettxout
@ nopara73 Ja, das ist falsch. Es gibt Informationen über nicht ausgegebene Ausgaben und gibt nichts für ausgegebene Ausgaben zurück.
@PieterWuille Danke, habe eine PR für den Fix in den Dokumenten erstellt: github.com/bitcoin-dot-org/bitcoin.org/pull/1891

Da @pieter-wuille bereits die erste Hälfte Ihrer Frage beantwortet hat:

Wenn gettxoutetwas zurückgegeben wird, wird die Ausgabe nicht ausgegeben. Wenn es nichts zurückgibt, hat die Ausgabe entweder nie existiert oder wird ausgegeben.

Dafür würde ich hinzufügen, dass Sie das unbestätigte Flag setzen können true, damit es auch unbestätigte Transaktionen berücksichtigt.

Um den zweiten Teil Ihrer Frage zu beantworten, hier ist ein suboptimaler Weg, um die Transaktion zu finden, die Ihren Txo ausgegeben hat:
Dies setzt voraus, dass txindex=1und prune=0.

Um herauszufinden, wer den Txout ausgegeben hat, können Sie den Block herausfinden, mit dem er bestätigt wurde: getrawtransaction {txid} 1. Von hier aus können Sie alle Blöcke bis zum zuletzt angekommenen ( getblock) und dem Mempool ( getrawmempool) durchlaufen, während Sie jede Transaktion überprüfen:

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
   }
}