Wie ist es möglich, bestehende Pay-to-Public-Key-Hash-Transaktionen ohne öffentlichen Schlüssel zu validieren?

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?

Antworten (3)

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.

Vielen Dank für die sehr ausführliche Antwort. Ich werde dies und die Artikel immer wieder lesen. Eine Frage, können Sie mir bitte sagen, wie Sie scriptSig decodieren, das in Ihrem Beispiel dieses 4830 ........ ist
effektiv habe ich eine Reihe von (OpenBSD/MacOS/Linux) Shell-Skripten, die dies für mich erledigen. Ich habe sie basierend auf dieser Seite hier erstellt: en.bitcoin.it/wiki/Script .

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.

Es ist Pay 2 Public Key Hash, daher wird erwartet, dass es nur Public Key Hash gibt. Ich kann nur scriptSig und Public Key Hash sehen, aber keinen Public Key. Können Sie mir bitte ein Beispiel aus Blockexplorer geben?
Die zweite Ausgabe von blockchain.info/tx/… ist eine P2PKH-Ausgabe. Die einzige Eingabe von blockchain.info/tx/… gibt diese Ausgabe aus. In diesem Eingabeskript gibt es zwei Pushdatas, das erste ist die Signatur, das zweite der öffentliche Schlüssel.
Ich sehe dort Skriptdaten, aber nicht scriptPubKey. Es wird erwartet, dass dort scriptPubKey vorhanden sein sollte, wenn es sich um eine P2PKH-Transaktion handelt. Liege ich falsch ?
Der scriptPubKey ist das Ausgabeskript

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 :)

Kannst du das beweisen? Können Sie mir wenigstens einen Artikel zeigen? Ich habe meine Tage damit verbracht, diese Details zu verstehen: (
bitcointalk.org/index.php?topic=6430.0 Hinweis: Dies wird in Bitcoin nicht verwendet