Zum Inhalt springen
buybitcoinsmart

Glossar / Transaktionen und Gebühren

SIGHASH_ALL

Was ist SIGHASH_ALL?
SIGHASH_ALL ist das Flag, das eine Signatur an jede Eingabe und jede Ausgabe einer Transaktion bindet, sodass an der Zahlung nach dem Signieren nichts mehr geändert werden kann.

Dieses Flag verwendet Ihre Wallet, und es ist der Grund, warum die Freigabe einer Transaktion auf dem Bildschirm einer Hardware-Wallet etwas bedeutet. Sein Wert ist 1, und Sie können ihn auf einem Block-Explorer als letztes Byte fast jeder Signatur sehen. Taproot hat den Standard in SIGHASH_DEFAULT umbenannt und schreibt das Byte gar nicht mehr, was ein Byte pro Signatur spart.

Wie es funktioniert

Unter SIGHASH_ALL umfasst der Digest die Transaktionsversion, jeden ausgegebenen Outpoint, jede Sequenznummer, jeden Ausgabebetrag, jedes Ausgabeskript und die Locktime.

Ändern Sie einen einzigen Satoshi einer einzigen Ausgabe, und jede Signatur der Transaktion wird ungültig. Fügen Sie eine Eingabe hinzu, löschen Sie eine Ausgabe, ordnen Sie sie um, verschieben Sie die Locktime geringfügig: dasselbe Ergebnis. Das meinen Leute, wenn sie sagen, eine signierte Bitcoin-Transaktion sei im Inhalt endgültig, noch bevor sie überhaupt verbreitet wird. Die einzige Entscheidung, die noch bleibt, ist, ob sie gesendet wird.

Eine Sache ist bewusst ausgenommen: die Entsperrskripte der anderen Eingaben. Würde der Digest diese umfassen, müsste bei einer Transaktion mit zwei Unterzeichnern jede Signatur nach der anderen erstellt werden, was zirkulär und unmöglich ist. Dass sie ausgelassen werden, erlaubt es unabhängigen Parteien, dieselbe Transaktion in beliebiger Reihenfolge zu signieren.

Die Kodierung hängt vom Eingabetyp ab. Bei einer Legacy- oder SegWit-Eingabe der Version 0 wird das Byte 01 an die DER-kodierte Signatur angehängt, woher die bekannte Gesamtzahl von 71 oder 72 Bytes stammt. Bei einem Taproot-Key-Path-Spend definiert BIP341 den Wert null als SIGHASH_DEFAULT, was identische Abdeckung ohne geschriebenes Byte bedeutet, sodass die Signatur genau 64 Bytes umfasst. 01 ausdrücklich bei einer Taproot-Eingabe zu schreiben, ist weiterhin gültig und erzeugt denselben Digest, kostet aber ein zusätzliches Byte für nichts.

Wo es vorkommt

SIGHASH_ALL wird fast überall verwendet: Bitcoin Core, Electrum, Sparrow, jede Hardware-Wallet und jede Auszahlungs-Engine einer Börse signieren standardmäßig so, und keine davon bietet eine Einstellung, um das zu ändern.

Die praktische Folge ist die, die Sie bei einer hängenden Zahlung spüren. Da die Gebühr das ist, was zwischen den Eingaben und den Ausgaben übrig bleibt, und alle Ausgaben signiert sind, können Sie nicht ein paar Tausend Satoshi von einer Ausgabe abziehen, um die Gebühr zu erhöhen. Die Transaktion muss neu erstellt und von Anfang an erneut signiert werden, was nur die Wallet mit den Schlüsseln kann. Deshalb ist Replace-by-Fee eine Funktion der sendenden Wallet und nicht etwas, das eine Börse oder ein Block-Explorer in Ihrem Namen ausführen kann, und deshalb gibt es Child-Pays-for-Parent als Notausgang, wenn der Absender nicht erreichbar ist.

Es ist außerdem das, was den Bildschirm einer Hardware-Wallet in einen Vertrag statt in einen Vorschlag verwandelt. Das Gerät zeigt das Ziel, den Betrag und die Gebühr an, und weil die danach erzeugte Signatur alle drei umfasst, kann keine nachgelagerte Software eines davon ändern, ohne diese Signatur zu verwerfen. Geben Sie frei, was auf dem Bildschirm steht, und nichts anderes kann geschehen.

SIGHASH_ALL vs. SIGHASH_NONE

SIGHASH_ALL bindet sich an die vollständige Ausgabenliste; SIGHASH_NONE bindet sich an nichts davon. Der Abstand zwischen beiden ist der Abstand zwischen einer Zahlung und einer bloßen Ermächtigung, eine Coin an einen unbestimmten Ort zu bewegen. Die beiden Flags liegen einen Wert auseinander, sodass eine Signaturbibliothek, die das Flag als ganzzahligen Parameter annimmt, einen Tippfehler davon entfernt ist, eine Kundenauszahlung in eine Coin zu verwandeln, die jeder umleiten kann, der den Mempool beobachtet. Produktiver Signaturcode sollte den Wert fest im Code hinterlegen, statt ihn als Eingabe anzunehmen.

Nicht zu verwechseln mit

Häufig gestellte Fragen

Muss ich jemals ein Sighash-Flag auswählen?

Nein. Endkunden-Wallets signieren mit SIGHASH_ALL und legen die Wahl nicht offen, was die richtige Voreinstellung ist. Die anderen Flags existieren für Protokollentwickler, die Transaktionen gemeinschaftlich zusammenstellen, nicht für gewöhnliche Zahlungen.

Wie kann eine Gebühr erhöht werden, wenn alles signiert ist?

Sie kann nicht bearbeitet werden. Replace-by-Fee baut eine völlig neue Transaktion, die dieselben Coins mit einer höheren Gebühr ausgibt, und signiert sie erneut, weshalb nur die Wallet mit den privaten Schlüsseln eine Gebühr erhöhen kann.

Weiterlesen

Verwandte Begriffe

Mehr zum Thema Transaktionen und Gebühren

Diese Seite auf Englisch lesen