Was ist die Beziehung zwischen scriptSig und scriptPubKey?

Szenario: A sendet 1 BTC an B.

scriptSig erscheint im Eingabeskript.

scriptSig = <sig> <pubKey>
  1. Hier ist der öffentliche Schlüssel der öffentliche Schlüssel des Absenders A. (dies ist der öffentliche Schlüssel, der seiner Bitcoin-Adresse entspricht, die einige nicht ausgegebene Transaktionen enthält).

Was ist der Sig-Teil von scriptSig?

scriptPubKey

scriptPubKey = OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

pubKeyHash = Hash des öffentlichen Schlüssels des Empfängers (in unserem Fall B).

  1. Der Absender (A) hat nur die Bitcoin-Adresse des Empfängers (B), also wie bekommt er den pubKeyHash von seiner Bitcoin-Adresse?

Nun, das ist mein bisheriges Verständnis:

  1. Das Eingabeskript trägt Informationen über die "vorherige Transaktion" des Absenders und zeigt unter Verwendung eines Indexes auf den entsprechenden "Ausgabe"-Teil der "vorherigen Transaktion". Die Ausgabe der vorherigen Transaktion ist das gesamte verfügbare Guthaben für den Absender (A), das beansprucht werden kann, um Bitcoins an den Empfänger (B) zu senden.

  2. Dieses Eingabeskript wird auch verwendet, um zu überprüfen, ob der Absender (A) der tatsächliche Eigentümer der Bitcoins ist, die in der referenzierten Ausgabe der vorherigen Transaktion enthalten sind.

  3. Das Ausgabeskript teilt uns mit, wie viele Bitcoins der Absender an den Empfänger übertragen möchte, und es erwähnt auch die Bitcoin-Adresse des Empfängers.

Fragen:

  1. Der öffentliche Schlüssel in scriptSig unterscheidet sich vom öffentlichen Schlüssel in scriptPubKey?

  2. Wie können die signierten Informationen des Absenders vom Empfänger verifiziert werden, wenn sie nicht denselben öffentlichen Schlüssel haben?

  3. Ich habe versucht, das im Wiki angegebene Beispiel zu verstehen, das zeigt, wie das Skript stapelbasiert ausgeführt wird, konnte es aber nicht verstehen.

Ich habe noch einige Fragen, aber ich denke, ich werde sie in einer anderen Frage stellen, anstatt sie hier zusammen zu stellen.

Vielen Dank.

Sie können sich das Video von Matt Thomas auf YouTube ansehen, er erklärt es brillant, youtube.com/watch?v=ir4dDCJhdB4 .

Antworten (6)

Zunächst werden zwei übereinstimmende Skripte in zwei verschiedenen Transaktionen verwendet, eines, das Gelder an eine Adresse überweist (Transaktion A ) und eines, das diese Gelder ausgibt (Transaktion B ). Die scriptPubKeywird von dem Benutzer erstellt, der Transaktion A erstellt . Es fügt der Ausgabe, die erstellt wird, im Grunde eine Anspruchsbedingung hinzu. Ein Benutzer darf die mit der Ausgabe verbundenen Bitcoins nur beanspruchen und somit ausgeben, wenn er nachweisen kann, dass er die Ausgabe besitzt.

Hier kommt Transaktion B und die scriptSigins Spiel. Angenommen, ein Benutzer möchte irgendwo Geld senden. Er erstellt eine neue Transaktion und fügt ihr Ausgaben hinzu, bis er genug hat, um den gewünschten Betrag abzudecken. Jetzt muss er beweisen, dass er diese Ausgaben besitzt, was er tut, indem er die Ausgabe bereitstellt, die benötigt wird, um sie zu beanspruchen, dh den öffentlichen Schlüssel, der zur Adresse passt, und die Signaturen mit dem passenden privaten Schlüssel.

Der Absender von Transaktion A kennt den öffentlichen Schlüssel noch nicht, kennt aber einen Hash des öffentlichen Schlüssels, weil er die Adresse kennt, an die er senden möchte. Die Adresse ist nichts anderes als der Hash des öffentlichen Schlüssels . Der Absender weiß also jetzt alles, was er braucht, um das Geld an den Empfänger senden zu können.

Wenn der Empfänger das Geld wieder ausgeben möchte, liefert er die Eingabe an die scriptPubKey. Wie Sie sehen können, scriptPubKeybesteht der Vorgang darin, den öffentlichen Schlüssel zu nehmen, der auf den Stack geschoben wurde, ihn zu duplizieren, zu hashen und mit dem Hash des öffentlichen Schlüssels zu vergleichen, für den die Ausgabe bestimmt war. Wenn sie übereinstimmen, haben wir immer noch sowohl die Signatur als auch den öffentlichen Schlüssel auf dem Stack, die von verwendet werden, um OP_CHECKSIGzu sehen, ob der Eingabe eine gültige Signatur beigefügt wurde.

Nehmen Sie zum Beispiel diese Transaktion . Es beansprucht eine Ausgabe , indem es den öffentlichen Schlüssel und die passende Signatur bereitstellt. Anschließend erstellt es zwei neue Ausgaben und legt die Bedingungen fest, unter denen der nächste Benutzer sie beanspruchen kann.

@cdecker Warum muss der Absender in Transaktion B überhaupt den HASH160 des Pubkey mit dem pubKeyHash vergleichen? Reicht die Signatur, die, wenn sie korrekt ist, sicherstellt, dass der Absender Zugriff auf den privaten Schlüssel der Adresse der Ausgabe hat, von der sie sendet, nicht aus, um zu bestätigen, dass sie von dieser Ausgabe senden kann? Es scheint unnötig, den Pubkey bereitzustellen und seine Hash-Übereinstimmungen zu überprüfen, da der Pubkey schnell aus dem privaten Schlüssel abgeleitet werden kann.
Bei der Finanzierung des Absenders von Transaktion B kennt der Aussteller von Transaktion A nicht den öffentlichen Schlüssel, sondern nur seinen Hash, der in der Adresse verschlüsselt ist. Der Ersteller von Transaktion B muss den öffentlichen Schlüssel zeigen, zeigen, dass er tatsächlich mit dem Hash in der Adresse übereinstimmt, und dann eine gültige Signatur damit bereitstellen. Wenn sie den öffentlichen Schlüssel nicht hinzufügen und zeigen würde, dass er zum Hash passt, dann fehlt uns eine wichtige Information, nämlich der öffentliche Schlüssel, und wir können die Signatur nicht verifizieren.
Ich denke, im 2. Absatz "Er erstellt eine neue Transaktion und fügt Ausgaben hinzu", sollte es "Fügt Eingaben hinzu" lauten. Der Benutzer fügt Eingaben zu einer Transaktion hinzu
Ich habe versucht, die Einführung von Eingaben überhaupt zu vermeiden, da es sich lediglich um Verweise auf zuvor erstellte Ausgaben handelt, aber es könnte verwirrend sein, dass Sie Recht haben.
Könnte etwas spät sein, aber sollte nicht der zweite Satz im letzten Absatz lauten "Es beansprucht eine Eingabe, indem es ... bereitstellt"?

Ich hatte auch die gleiche Frage und habe ewig versucht, sie zu verstehen, und habe sie schließlich geknackt.

"Der Absender (A) hat nur die Bitcoin-Adresse des Empfängers (B), wie bekommt er also den pubKeyHash von seiner Bitcoin-Adresse?"

Der Schlüssel ist, dass Absender (A) den pubKeyHash nicht von "seiner" Bitcoin-Adresse erhalten muss, da er nicht relevant ist. (Dasselbe habe ich mich auch gefragt!)

Denken Sie zuerst daran, dass scriptPubKey passiert. A erstellt dies mit der Bitcoin-Adresse von B anstelle von <pubKeyHash>. Das ist A's Job erledigt. Was A gesagt hat, ist "1 BTC gehört jetzt B, aber .... nur wenn B beweisen kann, dass er der wahre Eigentümer der Bitcoin-Adresse ist, die B mir zur Verfügung gestellt hat". Nehmen Sie nun A aus dem Bild heraus.

B kommt vorbei und in seiner Brieftasche sieht er diesen Betrag von 1 BTC auftauchen. Also technisch „besitzt“ es B. Aber damit B es ausgeben, d. h. an jemand anderen senden kann, muss B beweisen, dass die Bitcoin-Adresse, die er A gegeben hat, tatsächlich seine war. Hier kommt scriptSig ins Spiel . Das liegt also in <sig> <pubKey>der Verantwortung von B und B kennt all diese Informationen sowieso.

Nachdem Sie viele Artikel dazu gelesen haben, erklärt die Dokumentation des Entwicklers es am besten. https://bitcoin.org/en/developer-guide#transactions Man muss es nur ein paar Mal langsam lesen.

Die Entwicklerdokumentation beantwortet auch Ihre andere Frage "Was ist der Sig-Teil von scriptSig?"

... Daten, die Bob signiert, umfassen die txid und den Ausgabeindex der vorherigen Transaktion, das Pubkey-Skript der vorherigen Ausgabe, das von Bob erstellte Pubkey-Skript, mit dem der nächste Empfänger die Ausgabe dieser Transaktion ausgeben kann, und die Menge an Satoshis, die an den nächsten Empfänger ausgegeben werden sollen .

Diese Antwort ist weniger verwirrend als die akzeptierte Antwort.

Bitte schauen Sie sich das Dokument des Entwicklers an. Es ist viel klarer. https://bitcoin.org/en/developer-guide#transactions

Ich stimme zu, das Entwicklerdokument hat eine klarere Erklärung.
scriptSig = <sig> <pubKey>

Was ist der Sig-Teil von scriptSig?

Es ist die von A mit seinem privaten Schlüssel erstellte Signatur des Inhalts der Transaktion, die er erstellt, mit Ausnahme des scriptSigTeils (der nicht rekursiv sein soll). Es besteht aus <hash of the transaction from which an output is being used> <the index of this output in that transaction> <pubKey> <the current transaction output = <scriptPubKey> <1 BTC> >.

sciptPubKey = OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
  1. Der Absender (A) hat nur die Bitcoin-Adresse des Empfängers (B), also wie bekommt er den pubKeyHash von seiner Bitcoin-Adresse?

Sie können die <pubKeyHash>aus der Adresse finden, da die abschließenden Operationen der Adresserstellung die Eingabe nicht verschleiern. Es ist lediglich eine Base58-Codierung des pubKeyHash, der mit einigen Daten aufgefüllt wird, dh address = base58_encode(<pubKeyHash> || <padding>)also pubKeyHash = base58_decode(address) ^^ <padding>.

Ihr Verständnis stimmt bis auf einen Teil:

  1. Das Eingabeskript trägt Informationen über die "vorherige Transaktion" des Absenders und zeigt unter Verwendung eines Indexes auf den entsprechenden "Ausgabe"-Teil der "vorherigen Transaktion". Die Ausgabe der vorherigen Transaktion ist das gesamte verfügbare Guthaben für den Absender (A), das beansprucht werden kann, um Bitcoins an den Empfänger (B) zu senden.

Das Eingabeskript ist scriptSig und enthält keinen Verweis auf die ausgegebene Ausgabe. Diese Informationen befinden sich in der Eingabe der aktuellen Transaktion, aber nicht formal im Entsperrskript.

Fragen:

  1. Der öffentliche Schlüssel in scriptSig unterscheidet sich vom öffentlichen Schlüssel in scriptPubKey?

Ja, sie sind anders, pubKeyHash = ripemd160(sha256(pubKey)).

  1. Wie können die signierten Informationen des Absenders vom Empfänger verifiziert werden, wenn sie nicht denselben öffentlichen Schlüssel haben?

scriptSig ist in der Eingabe der Transaktion enthalten (zusammen mit dem Hash der vorherigen Transaktion und dem Index der Ausgabe, die ausgegeben wird), sodass jeder Zugriff auf pubKey hat, um zu überprüfen, ob dies <sig>für gültig ist <pubKey>.

  1. Ich habe versucht, das im Wiki angegebene Beispiel zu verstehen, das zeigt, wie das Skript stapelbasiert ausgeführt wird, habe es aber nicht geschafft.

Nun, es gibt nicht viel, was ich anders erklären könnte als jede andere Dokumentation, wenn Sie hier keine Einzelheiten angeben.

Lassen Sie es 2 Transaktionen geben, Transaktion A ( Coinbase) & Transaktion B. ScriptPubkey- Um Transaktion A an einen öffentlichen Schlüssel zu binden. ScriptSig- Wird in Transaktion B verwendet, um Transaktion A zu entsperren

Da Transaktion A Coinbase ist (von einem Miner abgebaut), gibt es keine ScriptSig. ScriptPubkey von Transaktion A ist das Public-Key-Skript des Miners (d. h. an den Public Key des Miners gebunden, sodass er in Zukunft mit seinem privaten Schlüssel [d. h. ScriptSig] entsperren kann)

Der Miner kann diese Bitcoin-Transaktion an Alice ausgeben, indem er ScriptSig (signiert mit dem privaten Schlüssel des Miners) in der Eingabe von Transaktion B bereitstellt. Denken Sie daran, dass der öffentliche Schlüssel des Miners aus seinem privaten Schlüssel generiert wird, es ist möglich, dass das Bitcoin-Programm ScriptPubkey verifiziert von Transaktion A aus ScriptSig von Transaktion B, dann wird, falls gültig, Transaktion B zur Blockchain hinzugefügt.

Der ScriptPubkey der Transaktion B wird der öffentliche Schlüssel von Alice sein, sodass in Zukunft nur Alice diesen Bitcoin mit ScriptSig in Transaktion C ausgeben kann.

Einfache und weniger technische Erklärung für Neulinge: Lassen Sie Alice den Sender und Bob den Empfänger sein. Alice erstellt einen ScriptPubKey, der den privaten Schlüsseln von Bobs Wallet entspricht. Sie überträgt dann diesen ScriptPubKey zusammen mit Satoshis in das Bitcoin-Netzwerk und die Satoshis erscheinen als Guthaben in der Brieftasche von Bob. ScriptPubKey wirkt also wie ein „Schloss“.

Damit Bob diese Satoshis ausgeben kann, muss er die Bedingungen erfüllen, die Alice in den ScriptPubKey gestellt hat. Also erstellt er scriptSig (oder Signaturskript) als Lösung, die die Bedingungen von ScriptPubKey erfüllt, um diese Satoshis auszugeben. Hier fungiert scriptSig wie Schlüssel für die ScriptPubKey-Sperre.