Glossar / Lightning und Layer 2
Commitment-Transaktion
- Was ist eine Commitment-Transaktion?
- Eine Commitment-Transaktion ist die signierte, noch nicht im Netzwerk verbreitete Bitcoin-Transaktion, die jede Seite eines Lightning-Kanals vorhält und die den Finanzierungsausgang nach der aktuellen Aufteilung des Guthabens ausgibt.
Jede Lightning-Zahlung ersetzt die Commitment-Transaktionen beider Seiten durch ein neues Paar, und das alte Paar wird widerrufen statt gelöscht. BOLT 3 legt das erwartete Gewicht einer Commitment-Transaktion eines Anchor-Kanals auf 1.124 Gewichtseinheiten plus 172 für jede noch unterwegs befindliche Zahlung fest. Eine zu halten bedeutet, einen Ausstieg zu halten, den Sie allein nehmen können, zu einer Gebühr, der Ihr Peer Wochen zuvor zugestimmt hat.
So funktioniert es
Eine Commitment-Transaktion hat genau eine Eingabe, den 2-von-2-Finanzierungsausgang des Kanals, und ihre Ausgaben sind die aktuelle Aufteilung dieses Geldes.
Zu jedem Zeitpunkt existieren zwei davon, eine pro Peer, und sie sind bewusst nicht dieselbe Transaktion. Jede Kopie verzögert die Auszahlung an ihren eigenen Halter hinter einer OP_CHECKSEQUENCEVERIFY-Sperre von to_self_delay Blöcken, während sie die andere Seite früher auszahlt, sodass derjenige wartet, der sie sendet. Unter option_anchors ist nicht einmal die andere Seite sofort dran: die Ausgabe to_remote trägt eine CSV-Sperre von einem Block, hinzugefügt, damit kein Peer das Commitment blockieren kann, indem er billige Kindtransaktionen daran hängt.
Die Transaktion verbirgt ihren eigenen Zähler. BOLT 3 setzt das Versionsfeld auf 2, nimmt die 48-Bit-Commitment-Nummer, verknüpft sie per XOR mit den unteren 48 Bits von SHA256 über die beiden Werte payment_basepoint aus open_channel und accept_channel und verteilt das Ergebnis dann auf zwei Felder: die oberen 24 Bits gehen in die Sequenz der Eingabe hinter dem Byte 0x80, die unteren 24 in das Locktime hinter 0x20. Beide Peers berechnen sie sofort neu. Wer sonst die Chain beobachtet, sieht zwei willkürlich wirkende Zahlen und kann nicht zählen, wie viele Zahlungen der Kanal transportiert hat.
Der Finanzierer bezahlt den Ausstieg. Bevor eine Ausgabe angelegt wird, wird die Grundgebühr von der Seite abgezogen, die den Kanal finanziert hat, und mit option_anchors werden zwei feste Anchor-Ausgaben von je 330 Satoshi ebenfalls von derselben Seite getragen. Die Ausgaben werden dann nach Wert sortiert, kleinste zuerst, dann nach scriptPubKey byteweise verglichen, dann nach cltv_expiry bei HTLC-Ausgaben, sodass beide Peers zu einer byteidentischen Transaktion gelangen, ohne sie sich jemals gegenseitig zu senden.
Was zu klein ist, um es aufzuschreiben, wird nicht aufgeschrieben. BOLT 3 nennt diese "trimmed outputs": ein HTLC, dessen Betrag abzüglich der Gebühr, die seine eigene Transaktion der zweiten Stufe kosten würde, unter das dust_limit_satoshis seines Eigentümers fällt, erhält überhaupt keine Ausgabe, und das Geld wird Miner-Gebühr statt Guthaben von jemandem. Die Schwellen, die BOLT 3 aufführt, sind die von Bitcoin Core: 330 Satoshi für Pay-to-Witness-Script-Hash, 294 für Pay-to-Witness-Pubkey-Hash, 240 für Pay-to-Anchor. Das ist eine Untergrenze und nicht die Einstellung selbst, und BOLT 3 weist Anchor-Kanäle an, darüber zu liegen, weil auf diesen Kanälen die Transaktion der zweiten Stufe keine Gebühr zahlt und daher gar nicht mehr zum Trimmen beiträgt.
Die neueste Form der Transaktion wirft die eingebaute Gebühr weg. Wo zero_fee_commitments gilt, wird das Versionsfeld zu 3, feerate_per_kw wird auf 0 festgelegt und eine gemeinsame Anchor-Ausgabe shared_anchor mit dem pay to anchor Script OP_1 <0x4e73> wird an dieser Grenze von 240 Satoshi hinzugefügt. Jeder kann sie ausgeben, sodass das Commitment per child pays for parent in einen Block gelangt, zu dem Preis, den der Gebührenmarkt an dem Tag verlangt, und nicht zu dem, den er kostete, als das Paar signiert wurde.
Warum das wichtig ist, wenn Sie Bitcoin kaufen
Die Commitment-Transaktion ist der Punkt, an dem ein Lightning-Guthaben aufhört, eine Zahl auf einem Bildschirm zu sein, und zu Satoshi minus Gebühren wird, und zwei ihrer Regeln kosten echtes Geld.
Die erste ist das Trimmen. Kleine Beträge innerhalb eines Kanals werden nicht gerundet, sie werden gelöscht, und das eigene durchgerechnete Beispiel der Spezifikation übergibt dem Miner 1.800 Satoshi an unterwegs befindlichen Zahlungen, weil jede unter das Dust-Limit plus ihre Kosten der zweiten Stufe fiel. Das setzt eine Untergrenze dafür, was überhaupt wert ist, auf Lightning bewegt zu werden. Phoenix, die ACINQ-Wallet in unseren Bewertungen, verlangt 1.000 Satoshi für das Erstellen eines Kanals und gibt an, dass die Wiederherstellung nach einem Force Close ungefähr 720 Blöcke dauert, etwa fünf Tage. Ein Kanal, der mit ein paar tausend Satoshi finanziert wurde, ist eine Rechnung, die nie aufgeht.
Die zweite ist, dass die Gebühr innerhalb einer Commitment-Transaktion gewählt wurde, als sie signiert wurde. Das Guthaben des Finanzierers wurde zum damaligen feerate_per_kw gekürzt, und wenn sich der Mempool seither bewegt hat, kann die Transaktion in Ihrer Wallet zu dem Preis, den sie trägt, möglicherweise nicht bestätigt werden. Anchors existieren genau deswegen, und zero_fee_commitments existiert, um die Entscheidung stattdessen auf den Zeitpunkt der Übertragung zu verlegen.
Keine der beiden Regeln erreicht Sie, wenn jemand anderes den Kanal hält. Strike, in unseren Börsenbewertungen mit 4,6 bewertet, ist Lightning-nativ und verwahrend, solange Ihr Guthaben in der App liegt, und Coinbase bepreist seine Lightning-Auszahlungen bei kleinen Beträgen unter einer On-Chain-Überweisung und bei großen darüber. Was Sie dafür aufgeben, ist in den Wallet-Bewertungen dokumentiert: Wallet of Satoshi, mit 2,7 bewertet und mit dem Hinweis Vorsicht versehen, bediente am 23. November 2023 keine Kunden in den USA mehr und zog später seinen verwahrenden Lightning-Dienst in der gesamten Europäischen Union zurück, als die MiCA-Übergangsfristen ausliefen. Es existierte keine Commitment-Transaktion von Ihnen, auf die Sie hätten zurückgreifen können.
Durchgang durch das Gebührenbeispiel von BOLT 3
BOLT 3 veröffentlicht eine durchgerechnete Gebührenberechnung, und wenn man sie bis zum Ende verfolgt, zeigt sich, wohin das Geld eines Kanals tatsächlich fließt.
Die Ausgangslage ist ein feerate_per_kw von 5.000, ein dust_limit_satoshis von 546 und vier Zahlungen unterwegs: angebotene HTLCs von 5.000 und 1.000 Satoshi, empfangene HTLCs von 7.000 und 800 Satoshi. Bei diesem Gebührensatz kostet eine HTLC-Timeout-Transaktion 3.315 Satoshi und eine HTLC-Success-Transaktion 3.515.
Das Gewicht beginnt bei 724, dem Wert für einen Kanal ohne option_anchors, die Form, die dieses ganze Beispiel annimmt. Das angebotene HTLC von 5.000 Satoshi überschreitet 546 plus 3.315, erhält also eine Ausgabe, und das Gewicht steigt auf 896. Das angebotene HTLC von 1.000 Satoshi überschreitet das nicht und wird getrimmt. Das empfangene HTLC von 7.000 Satoshi überschreitet 546 plus 3.515, erhält also eine Ausgabe, und das Gewicht steigt auf 1.068. Das empfangene HTLC von 800 Satoshi wird getrimmt.
Die Grundgebühr ist 5.000 multipliziert mit 1.068 und geteilt durch 1.000, also 5.340 Satoshi, allein aus der Ausgabe des Finanzierers entnommen. Die Gebühr, die ein Miner tatsächlich einnimmt, beträgt 7.140 Satoshi, weil die beiden getrimmten HTLCs obendrauf kommen. Von 13.800 Satoshi unterwegs hören 1.800 auf, als Guthaben von jemandem zu existieren, und die Summe kann weiter steigen, wenn die eigene Ausgabe des Finanzierers unter das Dust-Limit fällt, sobald die Gebühr davon abgezogen ist.
Commitment-Transaktion vs. Penalty-Transaktion
Eine Commitment-Transaktion zahlt eine Aufteilung aus, die beide Peers signiert haben; eine Penalty-Transaktion nimmt einem Peer, der eine bereits widerrufene Aufteilung veröffentlicht hat, den gesamten Kanal.
Die beiden geben unterschiedliche Dinge aus. Eine Commitment-Transaktion gibt den Finanzierungsausgang aus. Eine Penalty-Transaktion gibt die Ausgaben einer Commitment-Transaktion aus, die sich als veraltet erwiesen hat, und nutzt dafür den Widerrufsschlüssel, den ihr Halter aushändigte, als dieser Zustand ersetzt wurde. Das Script to_local schreibt beide Zukunftsmöglichkeiten in eine Ausgabe: der eine Zweig braucht nach to_self_delay Blöcken den verzögerten Schlüssel, der andere braucht eine Widerrufssignatur und funktioniert ganz ohne Verzögerung.
Commitment-Transaktion vs. Force Close
Eine Commitment-Transaktion ist ein Objekt, das Sie halten; ein Force Close ist das Ereignis, dass jemand eine sendet.
Der Unterschied ist wichtig, weil Sie nicht derjenige sein müssen, der handelt. Wenn Ihr Peer mit einem aktuellen Zustand einen Force Close durchführt, zahlt seine Kopie Ihre Seite aus, ohne dass Sie etwas tun müssen, allein gebunden an die CSV-Sperre von einem Block, die Anchor-Kanäle auf die Ausgabe to_remote legen. Ihre eigene Kopie ist der Rückfall für einen Peer, der verstummt ist, und sie ist die Kopie, die Sie die Verzögerung aussitzen lässt. Eine Commitment-Transaktion zu halten ist normal, fortlaufend und kostenlos; sie zu senden ist ein Ereignis, das Sie lieber nie erleben würden.