Was ist in getrawtransaction die vout-Ganzzahl in der vin-Liste?

Ich arbeite daran, die Bitcoin-Transaktionen zu durchforsten, die über getrawtransaction eingehen.

Ich konnte die notwendige Dokumentation nicht finden, um die vout-Ganzzahl im vin-Array zu beschreiben:

{"txid"=>"0fbf9a6f2172251611a58028bf596c3ace98b19f6f08d2b6581326c58aecda8e",
    "vout"=>0,     <----- THIS
    "scriptSig"=>
     {"asm"=>
       "3045022100a9ba4f0b8ff86e91e622f43f9b76944643a807c0f6c8b43490087a169fe7542f0220258eaa36c96faaaeb41052e8d4aa41f74950df1b1c2835cb677f201c1ee0a33901 0393a2770ce81ddd9cd1e6ef71a282261ef8c03648373db209078f7850b9ab1ad1",
      "hex"=>
       "483045022100a9ba4f0b8ff86e91e622f43f9b76944643a807c0f6c8b43490087a169fe7542f0220258eaa36c96faaaeb41052e8d4aa41f74950df1b1c2835cb677f201c1ee0a33901210393a2770ce81ddd9cd1e6ef71a282261ef8c03648373db209078f7850b9ab1ad1"},
    "sequence"=>4294967295},
{"txid"=>"4983504e9727a5ea73c4a0915da475faba248d0d8da265e2d270563dc3eabbaf",
    "vout"=>1,     <----- THIS
    "scriptSig"=>
     {"asm"=>
       "3045022100ccc460cb0b8777d14f27acb821eacae0b5316de19db03ea707c59364f098d44f0220058a4f9df9a917944299b4c52efe500d50ab28c2fd29bb7b9ff8b75f38abcd4201 03244951ad9d146a635b321816d953e54986c62ce9c92502873335531dada0156c",
      "hex"=>
       "483045022100ccc460cb0b8777d14f27acb821eacae0b5316de19db03ea707c59364f098d44f0220058a4f9df9a917944299b4c52efe500d50ab28c2fd29bb7b9ff8b75f38abcd42012103244951ad9d146a635b321816d953e54986c62ce9c92502873335531dada0156c"},
    "sequence"=>4294967295}

In den Transaktionen, die ich sehe, neigt es dazu, 0 1 0 1 0 1 im Array zu vouten. Was bedeutet dies in einer Transaktion? Muss ich es auf eine bestimmte Weise interpretieren? Vielen Dank!

Antworten (5)

Die Eingabe jeder Transaktion bezieht sich auf eine Ausgabe einer vorherigen Transaktion.

Eine Eingabe kann nicht nur durch den Transaktions-Hash definiert werden. Eine Transaktion besteht aus 1 oder mehreren Ausgaben, wenn Sie nur den Transaktions-Hash angeben, gibt es keine Möglichkeit zu wissen, welche Ausgabe ausgegeben wird.**

Da diese Art von Fragen oft von einem größeren Missverständnis darüber herrühren, wie das Netzwerk „wirklich funktioniert“, beginne ich mit einigen „klaren englischen“ Regeln für Transaktionen (tx):

1. A tx consists of one or more inputs and one or more outputs.
2. All tx inputs refer to an unspent output of a prior transaction.
3. The full value of an input is always spent; a tx can not spend part of the value.
4. Likewise all outputs are either spent or unspent, they can't be partially spent.
5. A tx "spends" the outputs which are referenced in the input portion of the tx.
6. A tx creates new spendable "unspent outputs" listed in the output portion of the tx.

Nachdem wir das aus dem Weg geräumt haben, müssen Sie zum Definieren einer tx-Eingabe auf den Hash einer vorherigen Transaktion UND den Ausgabeindex verweisen . Der tx-Hash identifiziert die Transaktion, aber die Transaktion kann mehr als eine Ausgabe haben, sodass der Index verwendet wird, um zu identifizieren, welche Ausgabe hier „ausgegeben“ wird.

Dies mag verwirrend erscheinen, da Sie Aussagen wie „Ich habe 20 BTC unter der Adresse 1XYZ ...“ oder „Meine Brieftasche hatte 100 BTC“ hören werden, aber das ist wirklich eine Abstraktion. Der Client zeigt Ihnen lediglich die Summe aller nicht ausgegebenen Ausgaben für eine Adresse oder das gesamte Wallet.

Das Bitcoin-Netzwerk arbeitet nach dem Konzept der Ein- und Ausgänge

Das Bitcoin-Netzwerk berücksichtigt bei der Validierung von TXs nicht den "Wert" einer Adresse. Bei der Validierung einer tx werden Ausgänge als unabhängige Einheiten betrachtet. Das Ausgeben einer Ausgabe für eine bestimmte Adresse hat keine Auswirkung auf die anderen Ausgaben (falls vorhanden) für diese Adresse. Eine Transaktion ist (unter anderem) gültig, wenn sich alle Eingaben auf gültige, nicht ausgegebene Ausgaben früherer Transaktionen beziehen (Münzen können nicht zweimal ausgegeben werden), die Summe der Ausgaben kleiner oder gleich der Summe der Eingaben ist (kann nicht gefälschte neue Münzen), und die Eingaben werden mit dem richtigen privaten Schlüssel signiert (nur der "Besitzer" des privaten Schlüssels kann die Münzen ausgeben).

Beispiele

Um viele überflüssige Details zu vermeiden, werden wir uns eine vereinfachte Version der im Bitcoin-Netzwerk verwendeten Transaktionen ansehen.

Angenommen, es existiert eine vorherige Transaktion (tx-Hash 1234567890). In dieser Transaktion haben Sie eine Eingabe, die auf eine nicht ausgegebene Ausgabe einer vorherigen Transaktion im Wert von 100 BTC verweist. Sie senden 50 BTC an eine Adresse, 10 BTC an eine andere Adresse und das Wechselgeld (40 BTC) wird an eine neue Adresse in Ihrer Brieftasche gesendet. Denken Sie daran, dass wir keinen Teil einer nicht ausgegebenen Ausgabe ausgeben können, daher ist die Änderung notwendig, da wir eine Eingabe von 100 BTC ausgeben, aber nur 60 BTC „senden“ müssen.

Die vereinfachte Pseudo-Transaktion könnte etwa so aussehen.

In[0] <lets ignore the input for now but it does have a value of 100 BTC>
Out[0] Bitcoin address=1ABC... Value=50 BTC
Out[1] Bitcoin address=1DEF... Value=10 BTC
Out[2] Bitcoin address=1XYZ... Value=40 BTC

Der tx hat 1 Eingang, 3 Ausgänge, alle In/Out-Indizes sind nullbasiert und der Wert der Ausgänge ist gleich dem Wert des Eingangs. Wenn der/die Output(s) geringer sind als der/die Input(s), dann ist die Differenz die an den Miner gezahlte Gebühr. Wenn die Ausgaben mehr sind als die Eingaben, dann ist die tx ungültig.

Da die "Änderungs"-Adresse nun 1XYZ ist, handelt es sich um eine weitere Adresse in unserer Brieftasche, die wir für neue Transaktionen verwenden können. Wir zahlen einem Händler 1 BTC und geben dem Miner eine Gebühr von 0,01 für die schnelle Aufnahme in einen Block. Die Änderung wird an eine weitere neue Adresse im Wallet gesendet (1ZZZ....). Die resultierende Transaktion kann wie folgt aussehen:

In[0]  Tx hash=1234567890 OutputIndex=2
Out[0] Bitcoin Address=1HIJ... Value=1 BTC
Out[1] Bitcoin Address=1ZZZ... Value=38.99 BTC

Die Eingabe bezieht sich auf die 3. (0-Basis-Array) Ausgabe des obigen TX. Wenn wir den Ausgabeindex 2 von tx 123456789 nachschlagen, sehen wir, dass der Wert 40,00 BTC beträgt. Die Summe der Ausgaben beträgt 39,99, was bedeutet, dass 0,01 BTC vom Miner des Blocks gesammelt werden.

Echte Sendungen weichen von der oben gezeigten vereinfachten Version ab

Beachten Sie, dass dies nicht wirklich wichtig ist, es sei denn, Sie möchten tiefer in die Funktionsweise des Protokolls eintauchen. Die Ausgabe von Bitcoin-Transaktionen sind tatsächlich Skripte anstelle der oben gezeigten statischen Adressen und Werte. Funktional funktionieren sie für die meisten Ausgaben gleich, obwohl aus Platzgründen der Hash des öffentlichen Schlüssels und nicht die Adresse in der Ausgabe verwendet wird. Alle Blöcke haben einen erforderlichen TX namens Coinbase, der keinen Input hat, da der Output die Blocksubvention und die an die Miner gezahlten Gebühren sind. Alle Werte im Bitcoin-Netzwerk sind ganze Zahlen in Satoshis (1E-8 BTC), also würden technisch gesehen alle Zahlen in diesem Beitrag mit 1E8 multipliziert.

Eine einzelne Bitcoin-Transaktion kann viele Ausgaben haben. Im Feld vout können Sie angeben, welche Ausgabe Sie ausgeben möchten.

Sehen Sie sich diese Transaktion an . Angenommen, Sie haben den 1EZ5-Schlüssel, aber nicht den 199N-Schlüssel. Sie müssen dem Bitcoin-Netzwerk klarstellen, welchen Output Sie ausgeben möchten.

Ich bin mir nicht sicher ob ich das verstehe. Warum möchten Sie keine in der Transaktion enthaltene Ausgabe ausgeben? Können Sie ein Beispiel zur Veranschaulichung geben? Vielen Dank!
Es ist nicht so, dass Sie die Ausgabe nicht ausgeben möchten, sondern dass Sie den Schlüssel dazu nicht haben.
Eine schnelle und auf den Punkt gebrachte Erklärung für diejenigen, die bereits über die Grundlagen des Protokolls Bescheid wissen (im Gegensatz zur Antwort von @DeathAndTaxes). Vielen Dank!

Zusammenfassend bezieht sich vout auf den Index der betreffenden Ausgangsadresse. Der Index beginnt bei 0. Wenn ein TX beispielsweise 10 Ausgangsadressen hat, wären die Vouts für die Adressen von 0-9.

In vin list vout können Sie angeben, welche Ausgabe Sie an wen ausgeben möchten. Jeder vout hat seine eigene tx_id. und die Summe der Werte dieses vout ist gleich der gesamten BTC, die wir für die Transaktion haben; Und wenn

wenn vout < vin dann ist die Differenz dieser Betragsgebühr an den Minderjährigen zu zahlen.

sonst vout > vin dann ist tx_id ungültig.

Kurz gesagt könnte vout als Identifikator der Ausgabe innerhalb einer vorherigen Transaktion betrachtet werden.

Denken Sie daran, dass die Eingaben, die Sie in Ihre Transaktion einbeziehen möchten, die Ausgaben einer vorherigen Transaktion sind, also kehren Sie zur empfangenen Transaktion zurück und wählen aus, welche Ausgabe als Eingabe in Ihre neue Transaktion aufgenommen werden soll. Wenn Sie sich jedoch nicht darum kümmern, wird der Bitcoin-Client dies an Ihrer Stelle tun.