Schritt-für-Schritt-Beispiel zum Einlösen einer Rohtransaktion erforderlich

Ich suche insbesondere nach einer Schritt-für-Schritt-Beispieltransaktion zum Senden von Bitcoin, die eine tatsächliche Transaktion verwendet ( How To Redeem A Basic Txn , von vor einigen Jahren, leistet hervorragende Arbeit, um die meisten Schritte zum Senden eines Roh-Txn zu skizzieren, tut es aber keine echte TxID verwenden ).

Ich habe sowohl mit der Python-Pybitcointools-Bibliothek, der SX-Bibliothek als auch mit der JSON-Ausgabe des Bitcoin Core-Clients (Bitcoin-QT, Bitcoin-cli, Bitcoin-Daemon) herumgespielt, muss aber noch eine tatsächliche Schritt-für-Schritt-Anleitung finden, die die Rohtransaktionsausgabe verwendet ( Single Input / Single Output Bitcoin txn, dh nicht Multisig).

Hoffentlich bringt das Kopfgeld eine Schritt-für-Schritt-Beispieltransaktion (mit privaten Schlüsseln für die Absenderadresse), die eine Antwort bringt, die zeigt, wie es gemacht wird, und insbesondere:

  • wie das ScriptPubKey-Element in das Roh-TXN passt
  • wie das ScriptSig-Element in das Roh-TXN passt
  • wie der txn signiert ist (mit DER-Codierung).

BEARBEITEN: Ich denke, die beste Ressource sind Ken Shirriffs Bitcoins auf die harte Tour: Verwenden des rohen Bitcoin-Protokolls , aber auch hier gibt es keine einzige Quelle online, die meine Frage beantwortet, ohne Bereiche wie scriptPubKey, Signieren usw. zu überfliegen.

Wenn ich das Kopfgeld aktiviere und Sie dies beantworten können, beziehen Sie sich auf diesen Tx , da er als tatsächliches Beispiel dienen kann (d. h. ich werde ~ $ 1 in BTC und private Schlüssel für 1From/1 MBngSqZbMydscpzSoehjP8kznMaHAzh9y bereitstellen, falls interessiert)

EDIT 2: The RoyalFork Blog: Deconstructing Txns bietet eine unglaublich gute Referenz für die interaktive Txn-Erstellung

Suchen Sie Schritt für Schritt mit RPC-Aufrufen oder Schritt für Schritt mit Byte-Manipulation von Hand?
@NickODell - ja, das habe ich gesehen, Nick, und du hast Recht, es ist eine fantastische Ressource! Das Problem bleibt jedoch auch nach dem Lesen des Python-Codes bestehen ... Ich verstehe einfach nicht den gesamten ScriptPubKey / scriptSig- Teil und jede Ressource, die ich lese, ist an diesem Teil sehr undurchsichtig. Ich werde die Frage bearbeiten, um mehr Klarheit zu schaffen, sobald ich das Kopfgeld aufstellen kann
@StephenM347 Streben Sie ein Schritt-für-Schritt-Beispiel an, das dem am nächsten kommt, wie ich eine Bitcoin-Transaktion mit Bleistift und Papier erstellen würde? (ähnlich wie: bitcoin.stackexchange.com/q/808/9382 ). Ich vermeide sicherlich RPC-Aufrufe, die sozusagen "die Arbeit erledigen".
Interessiert es Sie, dass es genau die von Ihnen erwähnte txid verwendet? Ich denke nur, es wäre einfacher, es mit einem tx zu tun, den ich besitze. Ich würde den privaten Schlüssel nicht preisgeben, aber ich würde die Signaturen bekannt machen, die er berechnet.
@ stephenm347 es muss nicht dieser tx sein. Wenn Sie auf Ihre eigene txn verweisen möchten, ist das auch in Ordnung, aber ich habe dies eingerichtet, weil die Ausgaben von 1From stammen und die 1-MB-Adresse eine Brainwallet ist, die zufällig auf die gleichen Referenzbuchstaben wie 1 MB verweist (daher ist der private Schlüssel einfach zu verknüpfen). die Adresse)
@StephenM347 Für das Kopfgeld brauche ich die privaten Schlüssel, damit ich den Vorgang selbst wiederholen kann. Sogar Nicks Vorschlag, „Bitcoin auf die harte Tour“ auszuprobieren, bezieht sich auf den Stack-Austausch How To Redeem A Raw TX, sodass es online keine kanonische Antwort darauf gibt; github.com/shirriff/bitcoin-code/blob/master/txnUtils.py
Beachten Sie, dass selbst wenn Sie den bereitgestellten Vorgang wiederholen, die erzeugte Signatur möglicherweise nicht mit der in der Anleitung identisch ist. Das liegt daran, dass DSA/ECDSA-Signaturen mit einem geheimen Wert (oft als k) erzeugt werden müssen und eine Methode zum Erzeugen eines geheimen Werts eine einmalige Zufallszahl ist. Wenn Sie perfekt reproduzierbare Schritte wünschen, sollten Sie entweder angeben, dass der Wert von kin den Anweisungen bereitgestellt wird, oder dass die deterministische RFC6979- Generierung von kverwendet wird.

Antworten (2)

Schritt-für-Schritt-Beschreibung:

Wir beginnen mit der Erstellung einer neuen Transaktion, die wir hashen und signieren.

  1. Vier-Byte-Versionsfeld hinzufügen:01000000
  2. Ein-Byte-Variante, die die Anzahl der Eingänge angibt:01
  3. 32-Byte-Hash der Transaktion, von der wir eine Ausgabe einlösen möchten (umgekehrte Reihenfolge):be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
  4. Vier-Byte-Feld, das den Ausgabeindex angibt, den wir aus der Transaktion mit dem obigen Hash einlösen möchten (Zählung von Null):00000000
  5. Jetzt kommt die scriptSig. Diese wird zwecks Signierung der Transaktion temporär mit dem scriptPubKey der einzulösenden Ausgabe gefüllt. Zuerst schreiben wir eine Ein-Byte-Variante, die die Länge des scriptSig angibt (0x19 = 25 Bytes):19
  6. Dann schreiben wir die eigentliche scriptSig (das ist der scriptPubKey der Ausgabe, die wir einlösen möchten): 76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac(Schauen Sie in die untere Zeile auf https://blockchain.info/tx/96534da2f213367a6d589f18d7d6d1689748cd911f8c33a9aee754a80de166be?show_adv=true )
  7. Dann schreiben wir ein Vier-Byte-Feld, das die Sequenz bezeichnet. Diese ist aktuell immer auf 0xffffffff gesetzt:ffffffff
  8. Als nächstes kommt eine Ein-Byte-Variante, die die Anzahl der Ausgaben in unserer neuen Transaktion enthält. Wir werden dies in diesem Beispiel auf 1 setzen:01
  9. Dann schreiben wir ein 8-Byte-Feld (64-Bit-Integer, Little-Endian), das den Betrag enthält, den wir von der angegebenen Ausgabe einlösen möchten. Ich werde dies auf den Gesamtbetrag setzen, der in der Ausgabe verfügbar ist, abzüglich einer Gebühr von 0,0001 BTC (128307 - 10000):23ce010000000000
  10. Dann beginnen wir mit dem Schreiben der Ausgabe unserer Transaktion. Wir beginnen mit einer Ein-Byte-Variante, die die Länge des Ausgabeskripts angibt (0x19 oder 25 Bytes):19
  11. Dann das eigentliche Ausgabeskript: 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac( Dies überträgt Geld zurück an die Adresse 1FromKBPAS8MWsk1Yv1Yiu8rJbjfVioBHc )
  12. Dann schreiben wir das Vier-Byte-Feld "Sperrzeit":00000000
  13. Und zum Schluss schreiben wir einen vier Byte langen „Hash-Code-Typ“ (in unserem Fall 1):01000000

OK, das Ergebnis ist

01000000
01
be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
00000000
19 76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
ffffffff
01
23ce010000000000
19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac
00000000
01000000
  1. Jetzt verdoppeln wir diese gesamte Struktur mit einem SHA256-Hash, was den Hash ergibt1cde0239b55717cca8003104abc2ec2673d4f6fabea0b74351940e382e88486f

  2. Jetzt sollten wir eine ECDSA-Signatur erstellen ... 1MBngSqZbMydscpzSoehjP8kznMaHAzh9yist eine Brainwallet von "mrbubbymrbubbymrbubby!" , die zufällig eine Adresse codiert, die mit 'MB' beginnt (was das Verknüpfen der 2 ziemlich einfach macht; siehe @WizardOfAussie-Kommentar unten für Phrasenursprünge). Privater Schlüssel im WIF:5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3

In Hex ist der private Schlüssel 0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d. In jeder Kryptobibliothek gibt es eine Zeichenmethode (Schlüssel, Digest). Es wird ein Array von Bytes zurückgegeben. Dieses Array ist nicht größer als 72 Bytes und beginnt mit dem Hexadezimalcode 30. Stellen wir uns vor, die Signatur lautet: 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180eAn diese Signatur hängen wir den Ein-Byte-Hashcodetyp an: 01. Der öffentliche Schlüssel für 1MBngSqZbMydscpzSoehjP8kznMaHAzh9y lautet:042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9

  1. Wir konstruieren das endgültige scriptSig durch Verketten: <Ein-Byte-Skript-OPCODE, der die Länge der DER-codierten Signatur plus den Ein-Byte-Hashcodetyp enthält>|< Die eigentliche DER-codierte Signatur plus den Ein-Byte-Hashcodetyp>| < Ein-Byte-Skript-OPCODE, der die Länge des öffentlichen Schlüssels enthält>|<Der eigentliche öffentliche Schlüssel>

scriptSig wird sein

49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01
41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9

Die erste Zeile ist 'Push-Signatur verkettet mit 01', die zweite Zeile ist 'Push Pubkey'. Die Länge von scriptSig beträgt 140 Bytes (0x8c in Hex)

  1. Wir ersetzen dann das Ein-Byte-Variant-Längenfeld aus Schritt 5 durch die Länge der Daten aus Schritt 16. Die Länge beträgt 140 Bytes oder 0x8C-Bytes:8c

  2. Und wir ersetzen das eigentliche scriptSig durch die in Schritt 16 erstellte Datenstruktur.

  3. Zum Schluss entfernen wir den 4-Byte-Hashcodetyp, den wir in Schritt 13 hinzugefügt haben, und erhalten am Ende den folgenden Bytestrom, der die letzte Transaktion darstellt:

    01000000 01 be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396 00000000 8c 49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01 41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9 ffffffff 01 23ce010000000000 19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac 00000000

Sind das nicht die Schritte, die im Link in der Frage beschrieben sind? Ich glaube nicht, dass dies für das Kopfgeld qualifiziert ist. @wizardofozzie Eine Sache, die Sie über Bitcoin verstehen müssen, ist, dass das Testen von Transaktionen anders ist als jedes andere Computerprogramm in der Geschichte: Es ist unmöglich, dieselbe Situation zweimal zu replizieren, wie es normalerweise beim Testen der Fall ist. dh Sie können nie wieder genau dieselbe Situation wiederholen.
Ich verlange kein Kopfgeld. Ich habe gerade eine Frage beantwortet. Und ja, die meisten meiner Antworten sind reines Kopieren und Einfügen. Kann sehr kleine Ergänzungen sein. Englisch ist nicht meine Muttersprache und es fällt mir schwer, die ganze Antwort selbst zu schreiben :)
Ich verstehe jetzt! @amaclin Wenn Sie möchten, dass die privaten Schlüssel Ihre Antwort bearbeiten, kann ich sie bereitstellen (oder ich kann die Antwort bearbeiten und den Privkey geben). Zu Ihrer Information, es war die DER-Codierung (der Teil, der mit einem 0x30-Byte beginnt), die ich für mein ganzes Leben nicht platzieren konnte. Ich wusste, dass es den öffentlichen Schlüssel mit 130 Zeichen gibt, der mit 0x04 im Byte-Array beginnt, aber ich konnte den ersten Teil nicht platzieren. Ich verstehe, dass es jedes Mal anders signiert wird (man würde hoffen!), Aber das ist genau die Klarstellung, die ich brauchte. Ich werde wahrscheinlich warten müssen, bis ich die iOS-App nicht mehr verwende, um das Kopfgeld zu vergeben, aber amaclin, danke!
Sie sollten Ihre privaten Schlüssel nicht veröffentlichen. Sie sollten mir nicht einmal Ihre Schlüssel schicken (meine E-Mail ist im Profil). Ich denke, dass meine Antwort vollständig genug ist, niemand braucht, dass das Ergebnis eine korrekte Transaktion in der Blockchain ist.
Ich schätze, worauf Sie hinauswollen (und die fabelhafte Antwort!), aber die Adressen enthalten keine BTC. Der springende Punkt dabei war, eine kanonische Antwort zu haben, die nicht testnet oder regtest oder abstrakt ist. Also werde ich Ihre Antwort bearbeiten, da ich den TXN erfolgreich signiert und übermittelt habe. blockchain.info/tx/…
Ich werde eine Antwort hinzufügen, die den Prozess mit SX-Tools skizziert, aber für diejenigen, die daran interessiert sind, ist die Brainwallet für 1 MB ... "mrbubbymrbubbymrbubby!" (keine Anführungszeichen) => 1MBngSqZbMydscpzSoehjP8kznMaHAzh9y ... falls Sie sich fragen, was die Nachbarin jede Nacht schreit, um ihre Katze anzurufen. Es passiert einfach so, Hash auf 1 MB zu haben :)
Warten auf Ihre nächste Frage: Wie man zwei Ausgaben in einem TX einlöst (wie man Transaktionen mit mehr als einer Eingabe erstellt und signiert)
@amaclin Fand diese FANTASTISCHE Referenz; Dieser Blog ist unglaublich gut für visuelle Leute wie mich ... royalforkblog.com/2014/11/20/txn-demo/…
Das ist toll! Wie wird jedoch die Rohtransaktion konstruiert, wenn mehr als eine Eingabe / Ausgabe vorhanden ist?
Gibt es einen BIP, der das oben beschriebene beschreibt?
Es ist ein toller Beitrag. Vielen Dank. Ich habe einen Code geschrieben, der auf Ihrer großartigen Antwort basiert, aber mein Code wird nicht ausgeführt. Könnten Sie helfen, einen Blick auf bitcoin.stackexchange.com/questions/92005/… zu werfen ? Danke vielmals.

Dies ist eine ausgezeichnete Antwort von Amaclin und Wizard of Ozzie. Ich möchte nur einige weitere Details für die Transaktion des Zauberers von Ozzie auf blockchain.info hinzufügen .

  1. Die korrekte Eingabe für den Signaturprozess für diese Transaktion ist

     01000000
     01
     be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
     00000000
     19 76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
     ffffffff
     01
     23ce010000000000
     19 76 a9 14 2bc89c2702e0e618db7d59eb5ce2f0f147b40754 88 ac
     00000000
     01000000
    
  2. Der doppelte SHA256-Hash davon wird von bxas berechnet

     d304448dff517bcf677cd36f3491e9ef2ccfdf40fb63af5782d9b768640af130
    

aber dies ist aus irgendeinem besonderen historischen Grund in "umgekehrter" Reihenfolge geschrieben (ich habe gehört, es sollte mit M * soft CRAPi kompatibel sein). Wenn Sie dies also mit den sign(key, digest)sinnvollsten Krypto-Toolkits verwenden, müssen Sie möglicherweise den Hash-Wert in die "richtige" Reihenfolge für umkehrenSHA256(SHA256(m))

30f10a6468b7d98257af63fb40dfcf2cefe991346fd37c67cf7b51ff8d4404d3
  1. Die obigen Eingabedaten werden tatsächlich anhand der Signatur validiert, die in der tatsächlichen Blockchain-Transaktion angegeben wird

      3045022100da43201760bda697222002f56266bf65023fef2094519e13077f777baed553b102205ce35d05eabda58cd50a67977a65706347cc25ef43153e309ff210a134722e9e
    

unter Verwendung des angegebenen öffentlichen Schlüssels

042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
  1. Um eine reproduzierbare Signatur über dieselben Daten zu generieren, wurde die folgende Signatur mit der deterministischen Methode von RFC6979 erstellt .

     30450220587ce0cf0252e2db3a7c3c91b355aa8f3385e128227cd8727c5f7777877ad772022100edc508b7c14891ed15ab38c687019d7ebaf5c12908cf21a83e8ae57e8c47e95c
    

unter Verwendung des passenden privaten Schlüssels, der von Wizard of Ozzie bereitgestellt wird

0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d

Diese Signatur validiert auch über die gegebenen Daten mit dem öffentlichen Schlüssel und sollte reproduzierbar sein.