Dies sind mein Verständnis oder Annahmen.
Das Signieren eines Dokuments erfordert nur einen geheimen Schlüssel und eine Nachricht wie unten
SignDocument(secret key, message) => signature
Und die Überprüfung der Signatur erfordert den öffentlichen Schlüssel, die Signatur und die Nachricht wie unten
VerifySignature(signature, message , public key)
Zweck von scriptPubKey ist ein Skript zur Validierung der Signatur für P2PKH-Transaktionen.
Es ist klar, dass wir einen öffentlichen Schlüssel benötigen, um die Transaktion zu validieren, aber vorhandene Transaktionsdaten haben keine öffentlichen Schlüsseldaten, sondern nur einen Hash des öffentlichen Schlüssels.
Ich kann die Pay-to-Public-Key-Transaktion leicht verstehen, da der öffentliche Schlüssel Teil der Transaktionsdaten ist.
Wenn der öffentliche Schlüssel nicht in der Blockchain gespeichert ist, wie ist es dann möglich, die P2PKH-Transaktion ohne öffentlichen Schlüssel zu validieren?
http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html erklärt das manuelle Signieren einer Transaktion und hat mir sehr geholfen (neben dem online lesbaren Buch „Mastering Bitcoin“ von Andreas ). Betrachtet man den Beispiel-TX von zuvor: https://blockchain.info/rawtx/e46a88ed211c1ee7f34f0f4828611da52404c3282416ae1e3b7096f9dddc6c4e?format=hex kann man das Sigscript in diesem Abschnitt sehen:
483045022100B8E264B50017806D4095740E5523188C78884DCFCBA3AA7C1E608F28A1A763AF0220159680F7870BE5B46B6CD3110629AEAB221E6D658DD396AE319B071E0D2B339601210214A307355361CC5571154EEBA68E7F4799F5520656E1AA6BA5E80BA65C6AA190
beim zerlegen sieht das so aus:
48: OP_DATA_0x48: push hex 48 (decimal 72) bytes on stack
30: OP_SEQUENCE_0x30: type tag indicating SEQUENCE, begin sigscript
45: OP_LENGTH_0x44: length of R + S
02: OP_INT_0x02: type tag INTEGER indicating length
21: OP_LENGTH_0x20: this is SIG R (33 Bytes)
00B8E264B5001780:6D4095740E552318
8C78884DCFCBA3AA:7C1E608F28A1A763
AF
02: OP_INT_0x02: type tag INTEGER indicating length
20: OP_LENGTH_0x20: this is SIG S (32 Bytes)
159680F7870BE5B4:6B6CD3110629AEAB
221E6D658DD396AE:319B071E0D2B3396
01: OP_SIGHASHALL: this terminates the ECDSA signature (ASN1-DER structure)
21: OP_DATA_0x21: length compressed Public Key (X9.63 form, 33 Bytes)
0214A307355361CC:5571154EEBA68E7F
4799F5520656E1AA:6BA5E80BA65C6AA1
90
Diese letzte(n) Zeile(n) nach OP_DATA_0x21 ist der Pubkey, mit dem die Signatur überprüft werden kann. Die entsprechende Bitcoin-Adresse lautet: 1FNtjbmxmGyt3MvHpWjhoR4ztTabUox3vp.
Diese ganze Struktur ist Teil der "Eingabe" einer Transaktion. Es zeigt, dass der Besitzer den richtigen privaten Schlüssel hatte, um die tx zu signieren, also darf er das Geld ausgeben. Nun wird die Angabe „Pay 2 Public Key Hash“ ausgegeben, alias „wohin sollen die Gelder gehen“. Und das ist Teil der Ausgabestruktur in dieser Transaktion. Diese Zeichenfolge:
76A914E1315C0FA59687EF4E035C184151CFCB096BE4EE88AC
lässt sich so zerlegen:
76: OP_DUP
A9: OP_HASH160
14: OP_Data14 (= decimal 20)
E1315C0FA59687EF:4E035C184151CFCB
096BE4EE
88: OP_EQUALVERIFY
AC: OP_CHECKSIG
This is a P2PKH script
die nach OP_DATA_14 den Public-Key-Hash enthält . Sie können diesen Wert base58check-codieren, was diese Bitcoin-Adresse zurückgibt: 1MXiAjDmJzySYm6Re6vV3WgSP7rVc57LMh
Um auf Ihre Frage zurückzukommen ("Wie ist es möglich, eine bestehende Pay-to-Public-Key-Hash-Transaktion ohne öffentlichen Schlüssel zu validieren?"): Ich denke, es ist so formuliert, dass es nicht in die Logik von Bitcoin passt. Sie müssen mit der Unterschrift nachweisen, dass Sie die Mittel ausgeben können, und dies geschieht im Eingabeteil der tx. Und ja, dafür braucht man den Pubkey, und dieser Pubkey wird normalerweise nach der Signatur angehängt. Die Formulierung „p2pkh tx“ spezifiziert eine leistungsbezogene Art der Verwendung der Mittel. Sie können auch für ein Multisig oder sogar für einen Smart Contract TX ausgeben. Dies ändert nichts an den Regeln des Eingabe-/Signatur-/Pubkey-Teils.
Eine Transaktion, die von einer P2PKH-Ausgabe ausgeht, stellt sowohl die Signatur als auch den öffentlichen Schlüssel im Eingabeskript bereit. Der öffentliche Schlüssel ist also Teil der Transaktionsdaten, nur die Ausgabentransaktion, nicht die Transaktion, die die Ausgabe erzeugt.
Und die Überprüfung der Signatur erfordert einen öffentlichen Schlüssel, eine Signatur und eine Nachricht wie unten VerifySignature (Signatur, Nachricht, öffentlicher Schlüssel)
... und der öffentliche Schlüssel selbst kann aus Signatur und Nachricht abgeleitet werden :)
Frisches Blut
pebwindkraft