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:
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
Schritt-für-Schritt-Beschreibung:
Wir beginnen mit der Erstellung einer neuen Transaktion, die wir hashen und signieren.
01000000
01
be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
00000000
19
76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
(Schauen Sie in die untere Zeile auf https://blockchain.info/tx/96534da2f213367a6d589f18d7d6d1689748cd911f8c33a9aee754a80de166be?show_adv=true )ffffffff
01
23ce010000000000
19
76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac
( Dies überträgt Geld zurück an die Adresse 1FromKBPAS8MWsk1Yv1Yiu8rJbjfVioBHc )00000000
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
Jetzt verdoppeln wir diese gesamte Struktur mit einem SHA256-Hash, was den Hash ergibt1cde0239b55717cca8003104abc2ec2673d4f6fabea0b74351940e382e88486f
Jetzt sollten wir eine ECDSA-Signatur erstellen ... 1MBngSqZbMydscpzSoehjP8kznMaHAzh9y
ist 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: 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e
An diese Signatur hängen wir den Ein-Byte-Hashcodetyp an: 01
. Der öffentliche Schlüssel für 1MBngSqZbMydscpzSoehjP8kznMaHAzh9y lautet:042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
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)
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
Und wir ersetzen das eigentliche scriptSig durch die in Schritt 16 erstellte Datenstruktur.
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
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 .
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
Der doppelte SHA256-Hash davon wird von bx
as 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
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
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.
Nick Odell
Morsecoder
Zauberer von Ozzie
Zauberer von Ozzie
Morsecoder
Zauberer von Ozzie
Zauberer von Ozzie
David A. Harding
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 vonk
in den Anweisungen bereitgestellt wird, oder dass die deterministische RFC6979- Generierung vonk
verwendet wird.