Tag-Beschreibung fairy-tail
Versuchen, um zu sehen, wie das tx war erfolgreich bestätigt (in 2013) in der blockchain zeigen sollte, das Geheimnis dieses Skript. Die bisherigen Ausführungen geben bereits eine Idee, was das Skript macht, aber nicht alles erklären. Also versuche ich, zu zerlegen weiter. Annahme ist, dass sigscript der Ausgaben tx geht auf den stack, dann folgte auf der Oberseite durch die pubkey-Skript. Um die Signatur zu überprüfen, wird die Vorherige Finanzierung tx werden müssen, umgewandelt in einen unsigned tx, so Entferne ich die sig von orig tx, ersetzen Sie es mit pubkey-Skript, und ändern input script Länge:
01000000 01 A214A2DAF91691AFDD491FD00D894EB3301E35BC18B5554B14E12843037E954C (<-- reverse hex !)
00000000
23 (<-- Länge dezimal 35 Bytes, Umgekehrt, hex 0x23)
2102085C6600657566ACC2D6382A47BC3F324008D2AA10940DD7705A48AA2A5A5E33AC7C2103F5D0FB955F95DD6BE6115CE85661DB412EC6A08ABCBFCE7DA0BA8297C6CC0EC4AC7C5379A820D68DF9E32A147CFFA36193C6F7C43A1C8C69CDA530E1C6DB354BFABDCFEFAF3C875379A820F531F3041D3136701EA09067C53E7159C8F9B2746A56C3D82966C54BBC553226879A5479827701200122A59A5379827701200122A59A6353798277537982778779679A68 (<-- platziert pkscript hier in sigscript Abschnitt)
00000000 (<-- interessant, die Reihenfolge ist nicht FFFFFFFF)
01 C06C3C0000000000 23 21039DC85F5FE062D4EEF0470FA96D4BBCFFF0096C62042333CD05AD491536560443AC DA538652
was wird serialisiert und Doppel-sha256-Hash:
01000000014c957e034328e1144b55b518bc351e30b34e890dd01f49ddaf9116f9daa214a200000000b52102085c6600657566acc2d6382a47bc3f324008d2aa10940dd7705a48aa2a5a5e33ac7c2103f5d0fb955f95dd6be6115ce85661db412ec6a08abcbfce7da0ba8297c6cc0ec4ac7c5379a820d68df9e32a147cffa36193c6f7c43a1c8c69cda530e1c6db354bfabdcfefaf3c875379a820f531f3041d3136701ea09067c53e7159c8f9b2746a56c3d82966c54bbc553226879a5479827701200122a59a5379827701200122a59a6353798277537982778779679a680000000001c06c3c00000000002321039dc85f5fe062d4eef0470fa96d4bbcfff0096c62042333cd05ad491536560443acda53865201000000
4eb4dccd727e81315a9ff801c205efc62635471cf8668e42c1c8aebfb51500a3
Diese Doppel-sha256-hash-Werte, die pubkeys und sig (von der Ausgaben-tx) entspricht mit diesen pubkeys:
ssig1:
30450221009a29101094b283ae62a6fed68603c554ca3a624b9a78d83e8065edcf97ae231b02202cbed6e796ee6f4caf30edef8f5597a08a6be265d6601ad92283990b55c038fa pubkey in HEX: 03F5D0FB955F95DD6BE6115CE85661DB412EC6A08ABCBFCE7DA0BA8297C6CC0EC4 in PEM-pubkey: MDYwEAYHKoZIzj0CAQYFK4EEAAoDIgAD9dd7lv+V3WvmEVzoVmHbQS7GoIq8v859oLqCl8bmdsq= doppelte sha256: 4eb4dccd727e81315a9ff801c205efc62635471cf8668e42c1c8aebfb51500a3ssig2:
3044022045d08719828fbd93e49c9223e63f4d2dab2de6c568e1faa2cccb33adf2575d2c02200c00126cb0105275040a963d91e45460147e40451b590485cf438606d3c784cf pubkey in HEX: 02085C6600657566ACC2D6382A47BC3F324008D2AA10940DD7705A48AA2A5A5E33 in PEM-pubkey: MDYwEAYHKoZIzj0CAQYFK4EEAAoDIgACcfxmagv1zqzc1jgqr7w/MkAI0qoQlA3XcFpIqipaXjM= doppelte sha256: 4eb4dccd727e81315a9ff801c205efc62635471cf8668e42c1c8aebfb51500a3
Schnelle überprüfung mit openssl (daher der pubkey im PEM-format):
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 -prüfen-pubin -inkey pubkey.pem -signierdatei tmp_sig.hex
OK, der Teil für die Unterschrift ist klar. So suchen Sie weiter bei der pkscript, werde ich versuchen, zu entschlüsseln:
pubkey1 21 02085C6600657566ACC2D6382A47BC3F324008D2AA10940DD7705A48AA2A5A5E33 AC 7C
pubkey2 21 03F5D0FB955F95DD6BE6115CE85661DB412EC6A08ABCBFCE7DA0BA8297C6CC0EC4 AC 7C
53 79 A8
hash1 20 D68DF9E32A147CFFA36193C6F7C43A1C8C69CDA530E1C6DB354BFABDCFEFAF3C
87 53 79 A8
hash2 20 F531F3041D3136701EA09067C53E7159C8F9B2746A56C3D82966C54BBC553226
87 9A 54 79 82 77
01 20
01 22
A5 9A 53 79 82 77
01 20
01 22
A5 9A 63 53 79 82 77 53 79 82 77 87 79 67 9A 68
Das problem, das ich sehe, ist, dass deine Aussage irgendwie scheint es nicht zu passen:
wenn (sha256(dat1) == hash1 &&
sha256(dat2) == hash2 &&
Größe(dat1) == 32 oder 33 &&
Größe(dat2) == 32 oder 33) {
if (size(dat1) == size(dat2)) {
zurück checksig(sig2, pk2);
} else {
zurück checksig(sig1, pk1);
}
Der Stapel würde sich nach sigscript:
[ssig2]
[ssig1]
[0x00]
[0x00]
Und auf der Oberseite der pkscript Folgen würde:
21: OP_DATA_0x21: Länge komprimiert Öffentlichen Schlüssel (X9.63 form, 33 Bytes)
02085C6600657566:ACC2D6382A47BC3F:324008D2AA10940D:D7705A48AA2A5A5E:33
entsprechende bitcoin-Adresse ist: 152q849uVmoB5oRcZ4d4tJHyRuB6FPB9hz
AC: OP_CHECKSIG: sig muss ein Gültiger sig für hash-und pubkey
-- dies überprüfen würden pubkey1 gegen ssig2, entfernen pubkey und [ssig2] vom Stapel, und lassen Sie [TRUE] auf stack
7C: OP_SWAP: die beiden obersten Elemente auf dem stack vertauscht
-- dies würde die swap [ssig1][TRUE], so [ssig1] ist auf der Oberseite des Stapels
21: OP_DATA_0x21: Länge komprimiert Öffentlichen Schlüssel (X9.63 form, 33 Bytes)
03F5D0FB955F95DD:6BE6115CE85661DB:412EC6A08ABCBFCE:7DA0BA8297C6CC0E:C4
entsprechende bitcoin-Adresse ist: 1BaJ2fYiAVnZC73MtX1LsyJBtXNZWDSkt6
AC: OP_CHECKSIG: sig muss ein Gültiger sig für hash-und pubkey
-- dies überprüfen würden pubkey2 gegen ssig1, entfernen pubkey und [ssig1] vom stack, und lassen Sie [TRUE] auf stack [0x00][0x00][TRUE][TRUE]
7C: OP_SWAP: die beiden obersten Elemente auf dem stack vertauscht
-- dies würde die swap [TRUE][TRUE], Grund ist unklar
53: OP_3: die Zahl 3 ist auf stack geschoben
-- oberste stack-element "3" [0x00][0x00][TRUE][TRUE][0x53]
79: OP_PICK: item n zurück in den stack kopiert nach oben
-- dies würde pop-1-element aus dem stack, und bringen [0x00] der top of stack: [0x00][0x00][TRUE][TRUE][0x00]
A8: OP_SHA256: Eingabe Hashen mit SHA-256
20: OP_Data: nächsten 32 bytes Daten geschoben werden, auf den stack
D68DF9E32A147CFF:A36193C6F7C43A1C:8C69CDA530E1C6DB:354BFABDCFEFAF3C
87: OP_Equal: Gibt 1 zurück, wenn die Eingaben gleich sind, sonst 0
-- Hash der [0x00] Wert, setzen OP_DATA oben, und vergleichen Sie Sie. OP_EQUAL pops zwei Elemente vom stack. Dies würde es erlauben, [FALSE] auf den stack. Stack-status: [0x00][0x00][TRUE][TRUE][FALSE]
53: OP_3: die Zahl 3 ist auf stack geschoben
79: OP_PICK: item n zurück in den stack kopiert nach oben
-- dies würde den pick [TRUE] Wert ??
A8: OP_SHA256: Eingabe Hashen mit SHA-256
20: OP_Data: nächsten 32 bytes Daten geschoben werden, auf den stack
F531F3041D313670:1EA09067C53E7159:C8F9B2746A56C3D8:2966C54BBC553226
87: OP_Equal: Gibt 1 zurück, wenn die Eingaben gleich sind, sonst 0
-- Hash der [0x00] Wert, setzen OP_DATA oben, und vergleichen Sie Sie. OP_EQUAL poppt zwei Elemente vom stack. Dies würde es erlauben, [FALSE] auf den stack. Stack-status: [0x00][0x00][TRUE][TRUE][FALSE][FALSE]
-- interessant ist, dass diese hash übereinstimmen würden, auf sha256(hash) in die Förderung Texas, wie bereits in den vorherigen Kommentar. Ich stoppen die weitere Auswertung des Skripts hier. Mein Verständnis ist, dass wir gesehen haben die Ausgaben script mit zwei hex 0x00-Werte, gefolgt von sigs. Dies entspricht nicht dem pseudo-code? Vielleicht eher so:
wenn (sig1 == TRUE &&
sig2 == TRUE &&
sha256(dat1) == hash1 &&
sha256(dat2) == hash2 &&
Größe(dat1) == 32 oder 33 &&
Größe(dat2) == 32 oder 33)
...
Allerdings: ich habe irgendwo ein "off by one" in der zweiten hash-Wert (F531F3041D313670...). Es sollte OP_4 oder OP_5 (statt OP_3) zu erreichen, um eines der mitgelieferten hash-Bilder. Mit dem Wert 3 die OP_PICK kopieren würden [TRUE] (aus der sig-Kontrolle) auf der Oberseite, statt der hash-Bild an position 4 oder 5...
Ich wusste nicht, Folgen die nächsten opcodes, gibt es weitere Bedingungen. Auch die Sequenz-Nummer ist "00000000" (nicht "FFFFFFFF"), und LockTime ist "DA538652" (dezimal ), die größer als 500'000'000, also ein unix-timestamp. Dies führt zu einer Termin: Fr 15 Nov 2013 18:03:22 CET. Der tx erschien in der blockchain auf 2013-11-15 17:13:23.
Also zusammenfassend ich denke, das tx war so strukturiert, dass sich jemand gab ein Schlüsselwort mit der tx auf eine zweite party, und Sie benötigt, um in der Lage sein, zu unterzeichnen und zu "wissen" das Schlüsselwort. Eine Art von multisig, ja. Und, es konnte nicht ausgegeben werden, bevor ein bestimmter Punkt in der Zeit (der tx gehalten würden im mempool, aber wir können nicht sehen, diese nicht mehr). Sonst nur der Eigentümer wäre in der Lage zu verbringen die tx...
Es ist wohl mehr dahinter, ich überlasse es den Experten zu entschlüsseln, der restliche Teil :-)