Ich versuche, Informationen über eine Rohtransaktion in Hex zu erhalten, bevor sie gesendet wird. Dieser Befehl mehrere Elemente im JSON-Format. Ich hätte gerne eine einfachere Erklärung für sie:
txid - Hash der Transaktion selbst
Hash - Hash der Transaktion selbst. Wenn die Transaktion kein Segwit ist, ist txid == Hash, andernfalls ist der Transaktions-Hash in Segwit-Transaktionen anders.
Version - das ist offensichtlich, was es ist, aber wie sollte interpretiert werden?
size - Größe der Transaktion in Byte
vsize - gewichtete Größe für Segwit-Transaktionen
locktime - Sperrzeit dieser Transaktion entweder in Blockhöhe oder in Unix-Zeit. OP_CLTV ist nur aus dem Redescript ermittelbar, nicht aus diesem Feld.
vin - diese Teilmenge enthält alle ausgegebenen Eingaben.
vout - diese Teilmenge enthält alle Ausgaben der Transaktion:
Weitere Fragen:
Ihr Beitrag ist etwas lang, beim Stack-Tausch bevorzugen wir Shotrt, einfach zu beantwortende Fragen - siehe hier: https://bitcoin.stackexchange.com/help/how-to-ask
Sie haben wahrscheinlich ein Beispiel für eine JSON-Interpretation als Referenz. Von wo hast du es? Da jeder eine Rohtransaktion interpretieren kann, denke ich, dass es am besten ist, auf die ursprüngliche Rohtransaktion von bitcoin.org zu verweisen . Dies ist eindeutig. Es würde so aussehen (Nicht-Segwit, um es einfach zu halten. Segwit nur auf Anfrage :-)
VERSION
TX_IN COUNT (how many input this tx has)
TX_IN[0...n]
OutPoint hash (the previous tx where funds come from)
OutPoint index (the n'th TX_IN)
Script Length (the length of the following Script Sig)
Script Sig (signature)
Sequence (a sequence field, originally intended to disable lock-time)
TX_OUT COUNT (how many outputs this tx has)
TX_OUT[0...n]
Value (the value in Satoshis)
PK_Script Length (length of the following script)
pk_script (the script, which defines the condition, under which the funds can be spent)
LOCKTIME (earliest time or earliest block when that transaction may be added to the block chain)
Der Zusammenbau eines zu sendenden TX wurde durch die Antwort von @amaclin hier ziemlich gut erklärt .
Wie kann die Menge jeder Eingabe innerhalb der vin-Teilmenge bestimmt werden?
Die Wallet-Software müsste die Werte nachschlagen, wenn sie eine neue TX ausgeben möchte. Dazu ist ein Verweis auf einen vorherigen tx erforderlich, in dem v_in zu finden ist. Wenn dies für den aktuellen Verbrauch nicht ausreicht, wird ein anderes v_in oder sogar ein anderes tx mit seinem v_in verwendet (der TX_IN-Zähler würde erhöht).
Wie kann die scriptSig validiert werden, z. B.: Ist die Eingabe CLTV oder CSV gesperrt?
Ich verstehe nicht, was Sie damit meinen. Scriptsig und CLTV/CSV sind nicht direkt mit scriptsig verknüpft. CLTV und CSV kamen beide durch BIP-68 und BIP-112 ins Spiel. CLTV (wie auch locktime) sind beides absolute Timelocks, bei CSV sprechen wir von relativen Timelocks. Sie definieren also, wann die Ausgabe einer Transaktion ausgegeben werden kann. Vielleicht lohnt es sich, in den BIPs nachzuschlagen. Es gibt auch viel im Forum hier und in Bitcointalk.
Scriptsig (im Allgemeinen) wird mit dem Hash und dem Pubkey validiert. Ken Shirrifs Blog (Link unten) erklärt sehr gut. Scriptsig beweist, dass Sie den privaten Schlüssel ("Sie sind der rechtmäßige Eigentümer") hatten, um diese Transaktion auszugeben. Der Privkey signiert einen Hash des tx, dem der Pubkey folgt. Da kann noch mehr sein, aber ich will allgemein bleiben. Hier ist ein Beispiel, wie Sie eine Signatur in der Unixoide-System-Shell mit openssl verifizieren können (Bitcoin verwendet immer hex-codierte Daten, um Hashes zu erstellen, und openssl benötigt einen PEM-formatierten Schlüssel):
sig=30450221009a29101094b283ae62a6fed68603c554ca3a624b9a78d83e8065edcf97ae231b02202cbed6e796ee6f4caf30edef8f5597a08a6be265d6601ad92283990b55c038fa
pk=03F5D0FB955F95DD6BE6115CE85661DB412EC6A08ABCBFCE7DA0BA8297C6CC0EC4
hash=4eb4dccd727e81315a9ff801c205efc62635471cf8668e42c1c8aebfb51500a3
printf $( echo $hash | sed 's/[[:xdigit:]]\{2\}/\\x&/g' ) > tmp_utx_dsha256.hex
echo "MDYwEAYHKoZIzj0CAQYFK4EEAAoDIgAD9dD7lV+V3WvmEVzoVmHbQS7GoIq8v859oLqCl8bMDsQ=" > cat pubkey.pem
printf $( echo $sig | sed 's/[[:xdigit:]]\{2\}/\\x&/g' ) > tmp_sig.hex
openssl pkeyutl <tmp_utx_dsha256.hex -verify -pubin -inkey pubkey.pem -sigfile tmp_sig.hex
Wird das RedeemScript (falls p2sh) als wahr validiert (z. B. erforderliche Anzahl verfügbarer Zeichen, andere IF/ELSE-Regeln erfüllt)?
Das Einlöseskript ist im Grunde ein Hash von "etwas". Es hat den Vorteil, dass „versteckt“ wird, was beabsichtigt ist, wenn die Finanzierungstransaktion in die Blockchain geschürft wird. Wenn Sie Ihre Ausgabentransaktion erstellen, werden die Daten Ihres p2sh-Skripts angezeigt. Die übliche Verwendung ist ein Multisig-Skript. Aber Sie können jede Art von Code hineinstecken, der die Bedingung definiert, unter der Gelder ausgegeben werden können (neben Multisig, jede Art von Smart Contracts, ...). Es gibt Einschränkungen. Die verwendbaren OPCODES werden hier erklärt . In bitcoin.org gibt es auch Erklärungen zu p2sh.
All das habe ich aus 2 weiteren Referenzen gelernt: dem unglaublich gut geschriebenen Buch „Mastering Bitcoin“ von Andreas, und einer sehr guten Erklärung zu Transaktionen von Ken Shirrif .
txid - Hash der Transaktion selbst
In der Tat. Es ist der Hash der Transaktion ohne enthaltene Zeugendaten (falls vorhanden).
Hash - Hash der Transaktion selbst. Wenn die Transaktion kein Segwit ist, ist txid == Hash, andernfalls ist der Transaktions-Hash in Segwit-Transaktionen anders.
In der Tat. Es ist der Hash der Transaktion mit eingeschlossenen Zeugendaten (falls vorhanden). Die Serialisierung, über die dies berechnet wird, ist in BIP144 definiert .
Version - das ist offensichtlich, was es ist, aber wie sollte interpretiert werden?
Es meldet den Inhalt des Transaktionsfeldes nVersion
.
Derzeit sind zwei Transaktionsversionsnummern definiert:
nSequence
Felder gemäß den neuen Regeln interpretiert, die in BIP68 festgelegt sind.size - Größe der Transaktion in Byte
In der Tat. Es ist die Größe der Serialisierung der Transaktion.
vsize - gewichtete Größe für Segwit-Transaktionen
In der Tat. Es ist die Größe der Serialisierung, bei der Witness-Daten um den Faktor 4 abgezinst werden, wie in BIP141 angegeben .
locktime - Sperrzeit dieser Transaktion entweder in Blockhöhe oder in Unix-Zeit. OP_CLTV ist nur aus dem Redescript ermittelbar, nicht aus diesem Feld.
In der Tat. Es meldet den Wert des Transaktionsfelds nLocktime
. Es ist die Zeit oder Höhe, bis zu der die Transaktion nicht in einen Block aufgenommen werden kann. So kann beispielsweise eine Transaktion mit locktime
700000 nur in Blöcke mit einer Höhe von 700001 oder höher aufgenommen werden.
Der OP_CHECKLOCKTIMEVERIFY
Opcode (auch bekannt als OP_CLTV
; definiert in BIP65nLocktime
) bietet eine Möglichkeit, Einschränkungen im Feld der Ausgabentransaktion von innerhalb von Skripten und damit indirekt für die Zeit, in der die Ausgabe ausgegeben werden kann, durchzusetzen . Es ist in allen Skriptkonstruktionen (bare, P2SH, P2WSH, ...) verfügbar, wäre aber in nackten nicht standardisiert.
vin - diese Teilmenge enthält alle ausgegebenen Eingaben.
Dies ist ein Array, das Informationen über alle Eingaben der Transaktionen enthält, die in seinem vin
Feld gespeichert sind.
- txid - txid der ausgegebenen Eingabe.
Genauer gesagt ist es der hash
Wert des Felds der Transaktionseingabe prevout
, das die txid der Transaktion enthält, die das von dieser Eingabe ausgegebene UTXO erzeugt hat.
- vout - was ist das?
Es ist der n
Wert des Felds der Transaktionseingabe prevout
. vout
Es meldet, welcher Index im Array der erstellenden Transaktion ausgegeben wird.
- scriptSig - asm / hex - dies beinhaltet die Signatur(en) und das Einlöseskript dieser bestimmten Eingabe. Gibt es einen Unterschied zwischen asm und hex?
In der Tat. Der Hex-Wert ist genau das, was in der Transaktion gespeichert wird. Der asm-Wert ist eine besser lesbare Dekodierung dieser Daten.
- Reihenfolge - wie ist das zu interpretieren? Wie kann man feststellen, ob die Eingabe entweder CSV-gesperrt oder durch Gebühr (RBF) ersetzbar ist?
Es ist der Wert des Transaktionsfelds nSequence
.
Seine moderne Bedeutung ist zweifach:
nVersion
2 oder höher hat und der nSequence
Wert kleiner als 2 2 ist , gelten die BIP68- Regeln, die einschränken, wie lange die ausgegebene Ausgabe zurückliegen muss, bevor diese Transaktion gültig ist (in Höhe oder Zeit). Der BIP112- Opcode OP_CHECKSEQUENCEVERIFY
(auch bekannt als OP_CSV
) bietet im Skript eine Möglichkeit, den Wert einzuschränken nSequence
(und damit indirekt die relative Zeit, die die Ausgabe verbringen kann).nSequence
Wert nicht 0xFFFFFFF oder 0xFFFFFFFE ist. Dies ist der Fall für alle Transaktionseingaben, die eine relative Sperrzeit verwenden, wie im obigen Aufzählungspunkt beschrieben. Beachten Sie, dass moderne Knoten zum Zeitpunkt des Schreibens die BIP125-Richtlinienregeln nicht genau implementieren , wenn auch nicht in einer Weise, die diese Beschreibung ungültig macht.vout - diese Teilmenge enthält alle Ausgaben der Transaktion:
Dies ist ein Array, das Informationen über alle Ausgaben der Transaktionen enthält, die in seinem vout
Feld gespeichert sind.
- Wert - Betrag dieser Ausgabe.
In der Tat.
- n - das sieht aus wie die Anzahl / Reihenfolge der Ausgänge?
Es ist das Analogon des vout- Feldes in den Eingängen. Wenn eine Eingabe ein bestimmtes UTXO ausgibt, das von dieser Ausgabe erstellt wurde, muss sie auf die txid und das Feld dieser Transaktion verweisen n
.
- scriptPubKey - Skript oder Pubkeyhash der Ausgabe
Es enthält das Sperrskript des zu erstellenden UTXO, das die Bedingungen definiert, unter denen es ausgegeben werden kann. Für P2PKH-Ausgaben ist dies ein Skript, das eine Signatur durch einen öffentlichen Schlüssel erfordert, dessen Hash ein bestimmter Wert ist, aber es ist immer noch ein Skript.
- reqSigs - wie kann dies dem Absender im Voraus bekannt sein, nur indem er die Adresse hat?
Dies ist möglich, jedoch nur für bloße Multisig-Skripte (bei denen das vollständige Skript direkt in der Ausgabe gespeichert wird und nicht über ein Einlöseskript), die als veraltet und nicht standardmäßig geschrieben werden. Das reqSigs-Feld wird aus diesem Grund jetzt auch als veraltet markiert. Es ist nur verwirrend.
- Typ - wie kann man das auch im Voraus wissen?
Es ist die Art der Ausgabe . zB kann es den Unterschied zwischen einer P2PKH- oder P2SH-Ausgabe erkennen. Es kann nicht wissen, was das Skript der P2SH-Ausgabe ist, bis es ausgegeben wird.
- Wie kann die Menge jeder Eingabe innerhalb der vin-Teilmenge bestimmt werden?
Es wird in der UTXO-Set-Datenbank zum Zeitpunkt des Verbringens nachgeschlagen, indem die Felder txid
und verwendet werden vout
, die in der RPC-Ausgabe gemeldet werden. Diese beiden eindeutigen identifizieren eine Transaktionsausgabe (Nummer vout
der Transaktion, deren txid txid
) ist, und der UTXO-Satz merkt sich seine amount
und scriptPubKey
-Felder.
- Wie kann die scriptSig validiert werden, z. B.: Ist die Eingabe CLTV oder CSV gesperrt? Wird das RedeemScript (falls p2sh) als wahr validiert (z. B. erforderliche Anzahl verfügbarer Zeichen, andere IF/ELSE-Regeln erfüllt)?
Die Ausführung läuft grob wie folgt ab:
scriptSig
wird die ausgeführt. Der endgültige Stack-Zustand wird gespeichert. Wenn dies fehlschlägt, ist die Transaktion ungültig.scriptPubKey
wird die ausgegebene Ausgabe ausgeführt, mit dem vorherigen Endzustand des Stacks als Anfangszustand. Dies scriptPubKey
wird in der oben aufgeführten UTXO-Datenbank nachgeschlagen. Was dies effektiv bewirkt, ist das Ausführen des Sperrskripts mit der scriptSig
Eingabe as; Wenn dies fehlschlägt, ist die Transaktion ungültig.scriptPubKey
der Vorlage BIP16 (P2SH) übereinstimmt , wird eine zusätzliche Regel ausgelöst: Das letzte scriptSig-Element wird als ein anderes Skript behandelt und mit allen außer dem letzten scriptSig-Element als Eingabe ausgeführt.Ähnliche Regeln gelten für P2WSH (BIP141)- und P2TR (BIP341)-Ausgaben.
Mit Bitcoin-Core würden Sie verwendendecoderawtransaction
https://en.bitcoin.it/wiki/Raw_transactions#decoderawtransaction_.3Chex_string.3E
Beispiel mit meinem Knoten
decoderawtransaction 01000000000101502c5d0d5e7e869ff1b40cc1542695fb35830355861f61932645fa1b1a149a5d0e000000171600149a1c78a507689f6f54b847ad1cef1e614ee23f1effffffff01c8f703000000000017a914691ad0b9182c753a26bed191e470b85236b67a878702483045022100817d7d87af9568c025e5dac8bc2b27bdac7181779b81ed5dc8a468f970c33124022059e09b0b5f48516b01ed2262084c8ba1a58a250b3f2e39a69b890f68237e8cb5012103a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd00000000
{
"txid": "1c5cb1487867459952d78624577788723f7d11d8ba39d211e524a9527d683152",
"hash": "a660d4e8f9f9fc18866a38bac30f25ceef5ecfc8eaf640fc93004b3ea8763d9f",
"version": 1,
"size": 216,
"vsize": 134,
"weight": 534,
"locktime": 0,
"vin": [
{
"txid": "5d9a141a1bfa452693611f8655038335fb952654c10cb4f19f867e5e0d5d2c50",
"vout": 14,
"scriptSig": {
"asm": "00149a1c78a507689f6f54b847ad1cef1e614ee23f1e",
"hex": "1600149a1c78a507689f6f54b847ad1cef1e614ee23f1e"
},
"txinwitness": [
"3045022100817d7d87af9568c025e5dac8bc2b27bdac7181779b81ed5dc8a468f970c33124022059e09b0b5f48516b01ed2262084c8ba1a58a250b3f2e39a69b890f68237e8cb501",
"03a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd"
],
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.00260040,
"n": 0,
"scriptPubKey": {
"asm": "OP_HASH160 691ad0b9182c753a26bed191e470b85236b67a87 OP_EQUAL",
"hex": "a914691ad0b9182c753a26bed191e470b85236b67a8787",
"reqSigs": 1,
"type": "scripthash",
"addresses": [
"3BGkzr6ioLszJjqX2msqXjqDAFdUVtBY2T"
]
}
}
]
}