Nur Signatur prüfen vs. P2PKH

Mir ist klar, warum es potenziell unsicher ist, nur ein Häkchen bei == in scriptPubKey zu verwenden. Zum einen bedeutet das Nichtverifizieren einer Signatur im Einlösungsskript, dass sich jemand als der Einlöser ausgeben könnte. Aus dem Bitcoin-Entwicklerhandbuch :

Dadurch kann das Pubkey-Skript überprüfen, ob Bob den privaten Schlüssel besitzt, der den öffentlichen Schlüssel erstellt hat.

Bobs secp256k1-Signatur beweist nicht nur, dass Bob seinen privaten Schlüssel kontrolliert; Es macht auch die Nicht-Signaturskript-Teile seiner Transaktion manipulationssicher, sodass Bob sie sicher über das Peer-to-Peer-Netzwerk übertragen kann.

Warum wäre es unsicher, nur eine Prüfung auf V(sigA, pkA, m={txprev_txid, txprev_outid, txprev_scriptPK, tx_scriptPubKey, tx_amount}_skA) == 1 zu verwenden? Es scheint, als ob wir dies in Multisig tun. Dh, haben Sie eine ScriptSig, die nur aus (einer) Signatur (en) besteht, anstatt aus sig und pk wie in P2PKH.

Warum prüfen wir nicht einfach Signaturen, anstatt sowohl pkhash als auch eine Signatur zu prüfen?

Antworten (2)

Fangen wir von vorne an.

p2pk

Wenn Sie sich die ersten Blöcke in der Kette ansehen, werden Sie feststellen, dass die Coinbase-Transaktionsausgabe an ein Pay-to-Pubkey-Sperrskript geht (auch bekannt als Ausgabe oder Belastung).

Ein p2pk-Sperrskript ist einfach PUSH <pubkey> OP_CHECKSIG. Um diese Ausgabe auszugeben, muss man lediglich eine gültige Unterschrift leisten. Das scriptsig würde enthalten PUSH sig, was in Kombination mit dem Locking - Skript erzeugt wird PUSH sig PUSH <pubkey> OP_CHECKSIG. Wenn die bereitgestellte Signatur für den angegebenen Pubkey gültig ist, können Sie sowohl den Besitz von Coins als auch die Absicht nachweisen, sie in einem einzigen Zug auszugeben.

p2pkh

p2pk wurde durch Pay-to-Pubkey-Hash ersetzt (vielleicht nicht der richtige Begriff, da Bitcoin 0.1 sowohl p2pk als auch p2pkh unterstützte). Dies hat einige Vorteile gegenüber dem Vanilla p2pk. Zum einen wurde die Größe des Sperrskripts reduziert. Da das utxo-Set das Sperrskript zu Validierungszwecken enthalten muss, führt dies zu einer direkten Platzersparnis. Zum anderen fügt das Hashen des öffentlichen Schlüssels eine Schutzebene gegen zukünftige ecdsa-Schlüsselwiederherstellungsangriffe hinzu, die möglicherweise entwickelt werden, da Sie auch die HASH160-Operation unterbrechen müssten, um den öffentlichen Schlüssel zuerst wiederherzustellen.

Die Verwendung von p2pkh bringt zusätzliche Komplexität mit sich. Das Sperrskript hat jetzt die Form von OP_DUP OP_HASH160 PUSH <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG. Da wir den eigentlichen öffentlichen Schlüssel nicht mehr im Skript haben, muss ein Entsperrskript zwei Dinge beweisen:

  1. Dass es den richtigen privaten Schlüssel enthält
  2. Dass es beabsichtigt, die Münzen auszugeben

Für 1 müssen wir beweisen, dass der Hash des öffentlichen Schlüssels im Skript dem Hash des öffentlichen Schlüssels des Schlüssels entspricht, der zum Ausführen der Signatur verwendet wurde. Für 2 müssen wir überprüfen, ob die Signatur gegen diesen öffentlichen Schlüssel gültig ist.

Um dies zu erreichen, hat das Entsperrskript die Form PUSH sig PUSH pubkey. In Kombination mit dem Sperrskript ergibt diesPUSH sig PUSH pubkey OP_DUP OP_HASH160 PUSH <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG

Bei der Auswertung wird nun der Pubkey dupliziert. Das Duplikat wird gehasht und mit dem im Sperrskript gespeicherten Hash verglichen. Wenn der Hash gültig ist, wird die Signatur gegen den bereitgestellten öffentlichen Schlüssel validiert. Dieser Ablauf stellt sicher, dass derselbe öffentliche Schlüssel für die Signaturprüfung und den Vergleich mit dem Hash im Sperrskript verwendet wird, wodurch beide Anforderungen erfüllt werden.

p2sh

pay-to-script-hash wurde entwickelt, um eine standardisierte Methode zur Verwendung fortgeschrittenerer Bitcoin-Skripte bereitzustellen. Konzentrieren wir uns für dieses Beispiel auf die Multisig p2sh. Das Sperrskript einer typischen 1-von-2-Multisig-p2sh-Ausgabe ähnelt OP_HASH160 PUSH <hash> OP_EQUAL. Dies enthält keine öffentlichen Schlüssel oder sogar einen Operationscode zur Signaturprüfung, also was ist hier los?

Das Geheimnis liegt im Erlösungsskript. Jede p2sh-Adresse wird von einem Einlösungsskript unterstützt, und der hashWert im Sperrskript ist ein Hash dieses Einlösungsskripts.

Wenn Sie von einer p2sh-Adresse ausgeben, müssen Sie ein Entsperrskript bereitstellen, das mit dem Einlösungsskript und dem Einlösungsskript selbst validiert wird. Für unsere 1of2-Multisig-Adresse sieht ein Einlösungsskript wie folgt aus OP_1 PUSH pubkey1 PUSH pubkey2 OP_2 OP_CHECKMULTISIG. Dieses gesamte Skript wird für das Sperrskript gehasht. Da die in diesem Skript enthaltenen Pubkeys bereits als Teil des gesamten Redeem-Skripts gehasht sind, müssen wir sie nicht separat hashen, wie wir es bei p2pkh tun.

Bei der Ausgabe der Ausgabe würden wir dann Folgendes bereitstellen: OP_0 PUSH sig PUSH redeemscript. Dies führt zu einem endgültigen Skript von OP_0 PUSH sig PUSH redeemscript OP_HASH160 PUSH <hash> OP_EQUAL. Während der Auswertung:

  1. Das Entsperrskript und das Sperrskript werden kombiniert. Dies führt dazu, dass die Signaturen und das serialisierte Einlöseskript auf den Stack gepusht werden. Beachten Sie, dass, da PUSH redeemscriptdas Einlösungsskript als normale Daten behandelt wird, die Operationscodes innerhalb des Einlösungsskripts in diesem Schritt nicht als Operationscodes interpretiert werden.
  2. Das serialisierte Einlösungsskript wird gehasht und anhand des Sperrskripts validiert
  3. Die Signaturen werden gegen den Popped Stack validiert, der das serialisierte Einlösungsskript ohne seinen Push-Op-Code enthält und es somit korrekt als Bitcoin-Skript interpretiert.

Das Befolgen dieser Reihenfolge der Operationen bietet die gleiche Garantie wie die p2pkh-Ausgabe - dass die Transaktion beabsichtigt, die Coins auszugeben, und dass die beteiligten Schlüssel die gleichen Schlüssel sind, auf die während des Sperrens der Coins festgelegt wurde.

Wenn Sie bei einer Eingabe, die eine P2PKH-Ausgabe ausgibt, nur überprüfen würden, ob die Signatur eine gültige Signatur mit dem öffentlichen Schlüssel in der Eingabe ist, dann könnte ein Angreifer seinen eigenen öffentlichen Schlüssel verwenden und eine gültige Signatur und damit eine gültige Transaktion unter diesem erzeugen Modell. Der öffentliche Schlüssel wird weder aus dem Ausgabeskript abgerufen noch von der Ausgabe bereitgestellt; vielmehr wird es in der Eingabe bereitgestellt. Daher müssen Sie sicherstellen, dass der bereitgestellte öffentliche Schlüssel tatsächlich der richtige öffentliche Schlüssel ist, daher die Überprüfung, ob sein Hash mit dem in der Ausgabe bereitgestellten Hash übereinstimmt.

Bei Multisig werden zusätzlich zu den Signaturen die öffentlichen Schlüssel in der Eingabe bereitgestellt. Sie befinden sich im Einlöseskript. Um die gleichen Probleme zu vermeiden (dass der Angreifer seine eigenen öffentlichen Schlüssel bereitstellt), wird das einlösenScript gehasht und der Hash befindet sich im Ausgabeskript. Dort gibt es einen Vergleich, um sicherzustellen, dass das einlösenScript das richtige Skript ist.

Es gibt einen Ausgabetyp, bei dem Sie nur eine Signatur bereitstellen. Dieser Ausgabetyp ist ein Skript, bei dem sich der öffentliche Schlüssel in der Ausgabe befindet, sodass der öffentliche Schlüssel nicht in der Eingabe bereitgestellt werden muss. Es wird nur die Unterschrift benötigt. Dies wird als Pay to Pubkey (P2PK)-Ausgabe bezeichnet. Diese werden nicht häufig verwendet, da die öffentlichen Schlüssel groß sind und dies ihre Herausgabe erschwert.

Ich verstehe. Ich glaube, ich war durch den Bitcoin Developer Guide verwirrt . Ich verstehe, dass P2SH Multisig die pk's in der RedeemScript-Eingabe hat. Ich war durch diesen Abschnitt verwirrt, der es so aussehen lässt, als ob das scriptSig nur Signaturen enthält: Pubkey script: <m> <A pubkey> [B pubkey] [C pubkey...] <n> OP_CHECKMULTISIG; Signaturskript: OP_0 <A-Sig.> [B-Sig.] [C-Sig....]. Bedeutet dies, dass diese scriptPK und scriptSig in der Praxis nicht verwendet werden? Aber eher das P2SH Multisig?
In der Praxis wird P2SH Multisig verwendet. Das Multisig in der Ausgabe (bekannt als Bare Multisig) wurde fast nie verwendet.