Zum Inhalt springen
buybitcoinsmart

Glossar / Transaktionen und Gebühren

Signatur-Hash

Auch bekannt als Sighash.

Was ist der Signatur-Hash?
Der Signatur-Hash ist der Hashwert, den eine Wallet tatsächlich signiert: eine neu zusammengesetzte Kopie der Transaktion, gekürzt nach dem für diesen Input gewählten Flag und anschließend zweimal mit SHA-256 gehasht.

Spezifiziert im BIP-143.

Keine Signatur deckt die Transaktion so ab, wie sie im Netzwerk erscheint. Jeder Input erhält seinen eigenen Hashwert, der nach einem Verfahren gebildet wird, das zweimal neu geschrieben wurde: das ursprüngliche aus 2009, BIP143 für Segwit-Inputs und BIP341 für Taproot. Was der Hashwert auslässt, kann ein Angreifer frei ändern.

So funktioniert es

Einen Signatur-Hash zu bilden heißt, eine veränderte Kopie der Transaktion zu erstellen und diese zu hashen, nicht die Transaktion, die Sie gerade übertragen wollen.

Das ursprüngliche Verfahren läuft so ab. Nehmen Sie die Transaktion, leeren Sie das entsperrende Skript jedes Inputs, fügen Sie das Skript, das ausgegeben wird, in den einen Input ein, den Sie signieren, und behalten, leeren oder verwerfen Sie dann die Outputs je nach Flag. Hängen Sie das Flag als Vier-Byte-Zahl an, wenden Sie SHA-256 zweimal auf das Ganze an und signieren Sie die 32 Bytes, die dabei herauskommen.

Dieses Design hatte einen Preis, den niemand bemerkte, bis die Transaktionen größer wurden. Weil jeder Input die gesamte Transaktion neu zusammensetzt und erneut hasht, wächst der Aufwand mit dem Quadrat der Anzahl der Inputs. BIP143 nennt Zahlen: Die Prüfung eines gewöhnlichen Blocks von 1 MB dauert etwa 2 Sekunden, während eine einzelne gezielt gebaute Transaktion von 1 MB mit 5.569 Signaturvorgängen 25 Sekunden dauern kann. Eine Transaktion, die alle Nodes im Netzwerk so lange blockiert, ist eine Dienstblockade, die nur darauf wartet, in industriellem Maßstab eingesetzt zu werden.

BIP143 schrieb das Verfahren für Segwit-Inputs der Version 0 neu und behob zwei Probleme zugleich. Drei Teil-Hashes, die die Outpoints, die Sequenznummern und die Outputs abdecken, werden einmal berechnet und für jeden Input wiederverwendet, was den Aufwand linear macht. Wichtiger für alle, die Bitcoin halten: Der Hashwert bindet nun den Wert des Inputs, der signiert wird. Zuvor musste einem Signiergerät gesagt werden, was ein Input wert war, ohne dass es das prüfen konnte, sodass ein bösartiges Programm die Inputs zu niedrig angeben und eine Hardware-Wallet dazu bringen konnte, eine enorme Gebühr zu genehmigen.

BIP341 schrieb das Verfahren ein drittes Mal neu, für Taproot. Der Taproot-Hashwert ist ein getaggter Hash, dem eine Domänenzeichenkette vorangestellt wird, damit er niemals mit einem Hashwert eines anderen Protokolls verwechselt werden kann, und er bindet die Beträge und die Sperrskripte jedes ausgegebenen Inputs, nicht nur des signierten. Außerdem führt er einen Standardwert von null für das Flag ein, der alles abdeckt, was die Standardregel abdeckt, aber niemals in die Signatur geschrieben wird.

Wo er auftritt

Der Signatur-Hash begegnet Ihnen indirekt, nämlich als Grund dafür, warum sich Ihre Hardware-Wallet so verhält, wie sie es tut.

Das Signieren eines Legacy-Inputs erfordert, dass dem Gerät die vollständige vorherige Transaktion übergeben wird, weil es nur so den Wert des Inputs selbst feststellen kann. Sparrow und Electrum übertragen diese Transaktionen vor dem Signieren an eine Trezor oder Ledger, und bei einer Wallet voller alter Bitcoin ist dieser Schritt der Grund, warum eine Ausgabe spürbar länger dauert als erwartet. Ein Segwit-Input benötigt nur den Betrag, den die PSBT bereits enthält.

Direkt zeigt er sich als letztes Byte einer Legacy- oder Segwit-Signatur in einem Block-Explorer. Eine Signatur, die auf 01 endet, wurde nach der Regel erstellt, die alles abdeckt. Jeder andere Wert ist es wert, verstanden zu werden, bevor Sie sich auf die Transaktion verlassen.

Signatur-Hash vs. SIGHASH_ALL

Der Signatur-Hash ist der Hashwert; SIGHASH_ALL ist eine der Regeln für seine Bildung. Jede Signatur hat einen Signatur-Hash, auch Taproot-Signaturen, die gar kein Flag-Byte tragen. Was sich unterscheidet, ist, welche Teile der Transaktion in den Hashwert eingegangen sind, und das Flag ist nur die Bezeichnung für diese Wahl. Zu sagen, eine Transaktion „nutzt SIGHASH_ALL“, beschreibt eine Regel; zu sagen, sie hat einen Signatur-Hash, beschreibt etwas, das jede Bitcoin-Signatur der Geschichte hatte.

Nicht zu verwechseln mit

Häufig gestellte Fragen

Warum dauert das Signieren einer alten Transaktion auf meiner Hardware-Wallet so lange?

Weil der Legacy-Signatur-Hash den Wert des Inputs nicht bindet, muss dem Gerät jede vorherige Transaktion vollständig übermittelt werden, damit es die Beträge selbst ermitteln kann. Segwit-Inputs ersparen das, weshalb moderne Bitcoin in Sekunden signiert werden.

Ist der Signatur-Hash dasselbe wie die Transaktions-ID?

Nein. Die Transaktions-ID ist der Hash der Transaktion so, wie sie übertragen wird. Ein Signatur-Hash deckt eine veränderte Kopie ab, die für jeden Input und jedes Flag anders ist, und er erscheint nirgends in der Blockchain.

Verwandte Begriffe

Mehr zum Thema Transaktionen und Gebühren

Diese Seite auf Englisch lesen