Zum Inhalt springen
buybitcoinsmart

Glossar / Lightning und Layer 2

Payment-Hash

Was ist ein Payment-Hash?
Ein Payment-Hash ist der SHA-256-Hashwert eines 32 Byte großen Geheimnisses, das der Empfänger erzeugt hat, und er ist sowohl das Schloss einer Lightning-Zahlung als auch der Name, unter dem alle es bezeichnen.

Jeder Hop auf einer Lightning-Route sieht denselben Payment-Hash, und dieser identifiziert die Zahlung gegenüber jedem von ihnen. BOLT 11 verlangt genau einen davon pro Rechnung, geschrieben als 52 bech32-Zeichen, die 256 Bits tragen. Das passende Geheimnis zu zeigen ist der einzige Weg, das Geld zu beanspruchen, und dieses Geheimnis danach aufzubewahren ist Ihr Beleg.

So funktioniert es

Ein Payment-Hash beginnt sein Leben als sein Gegenteil: Der Empfänger wählt 32 zufällige Bytes, Payment Preimage genannt, und veröffentlicht nur deren SHA-256.

Dieser Wert kommt in die Rechnung unter dem Tag p, den BOLT 11 auf einen data_length von 52 festlegt und genau einmal verlangt. Von dort wandert er die Route entlang innerhalb von update_add_htlc, Nachrichtentyp 128, dessen Felder die Kanal-ID, ein 64-Bit-Zähler, der Betrag in Millisatoshi, der payment_hash selbst, ein CLTV-Ablauf und eine 1366-Byte-Zwiebel sind. In dieser Nachricht hat er eine Doppelfunktion: Er wird auch der Zwiebelkonstruktion als assoziierte Daten zugeführt, sodass die HMACs auf jedem Hop ihn einbeziehen. Ein altes Zwiebelpaket gegen einen anderen Payment-Hash erneut zu senden scheitert daher am ersten Node, der prüft.

Die Abwicklung läuft den Hash rückwärts. Der Empfänger gibt das Preimage in update_fulfill_htlc zurück, Nachrichtentyp 130, als reinen Wert von 32 Bytes, und jeder Node stromaufwärts reicht es über dieselben Kanäle zurück. Ein Node, dem ein Preimage übergeben wird, das nicht per SHA-256 den Hash ergibt, den er hält, ignoriert es nicht einfach: BOLT 2 sagt, dass er entweder eine Warnung senden und die Verbindung schließen oder einen Fehler senden und den Kanal scheitern lassen muss, weil es keine harmlose Erklärung gibt.

On-Chain wird der Hash gekürzt. Das Skript des HTLC-Outputs enthält den Wert von 32 Bytes überhaupt nicht; es führt einen OP_HASH160-Vergleich gegen RIPEMD160(payment_hash) aus, ein Commitment von 20 Bytes, und der Ausgebende liefert das Preimage im Witness. Zwei angebotene HTLCs mit demselben gerundeten Betrag und demselben Payment-Hash erzeugen byte-identische Outputs, selbst wenn ihre Ablaufzeiten abweichen, weshalb BOLT 3 eine Ordnungsregel für sie festlegen muss.

Eine Anforderung wirkt seltsam, bis man den Angriff dahinter sieht. Ein Node muss mehrere HTLCs mit demselben Payment-Hash annehmen, und BOLT 2 nennt den Grund: Würden Duplikate abgelehnt, könnte ein Angreifer mit einem bekannten Hash sondieren und erfahren, ob dieser Node diese Zahlung bereits hielt. Die separate 64-Bit-ID existiert, um die Duplikate auseinanderzuhalten.

Warum das beim Bitcoin-Kauf zählt

Zwei der 63 hier bewerteten Kryptobörsen dokumentieren eine Lightning-Auszahlung in ihren Gebührenhinweisen: Strike, dessen Auszahlungshinweis besagt, dass Wallet-Auszahlungen über Lightning und On-Chain unterstützt werden, und Coinbase, dessen Gebührentabelle eine Lightning-Sendung mit 0,2 % des gesendeten Betrags bepreist.

Wenn eine dieser Auszahlungen hängt, gibt es keine Transaktions-ID zum Nachschlagen, weil nichts die Blockchain erreicht hat. Der Payment-Hash ist die einzige Zeichenfolge, die Ihr Wallet-Protokoll und das Backoffice der Börse beide haben, also kopieren Sie ihn vom Bildschirm mit den Zahlungsdetails, bevor Sie ihn schließen. Ein Support, der nach der "Transaktions-ID" einer Lightning-Auszahlung fragt, fragt nach diesem Wert.

Der Fehler, den Sie zurückbekommen, wird Ihnen nicht viel sagen, und das ist Absicht. BOLT 4 fasst fünf verschiedene Probleme in einen Fehlercode zusammen, incorrect_or_unknown_payment_details, nummeriert PERM|15: Der Hash ist dem letzten Node unbekannt, das Payment Secret passt nicht dazu, der Betrag für diesen Hash ist zu niedrig, der Ablauf liegt zu nah an der aktuellen Blockhöhe, oder erforderliche Zahlungsmetadaten fehlen. Die Spezifikation erklärt die Zusammenlegung. Die älteren getrennten Codes ließen einen weiterleitenden Node erraten, wohin eine Zahlung ging, indem er denselben Hash mit einem viel niedrigeren Wert weitersandte und die Antwort las. Ihre Wallet verbirgt Ihnen den Grund nicht, ihr wurde er nie mitgeteilt, also ist das erneute Erzeugen der Rechnung und erneutes Bezahlen die praktische Antwort.

Derselbe Wert bleibt von Ihrem Node bis zum Empfänger identisch, auch über jeden Teil einer mehrteiligen Zahlung hinweg, die nach BOLT 4 einen einzigen Payment-Hash teilen muss. Wer ihn zweimal sieht, weiß, dass er eine einzige Zahlung vor sich hat. Unsere Bewertung von Phoenix zitiert die eigene FAQ von ACINQ, die einräumt, dass sie das endgültige Ziel und den Betrag von Zahlungen kennt, die über die Wallet abgewickelt werden, was die unverblümte Version derselben Exposition ist, vom Anbieter genannt und nicht von dieser Website abgeleitet.

Eine Rechnung wiederzuverwenden ist aus einem verwandten Grund schlimmer als nutzlos. BOLT 4 lässt einem letzten Node, dem ein bereits bezahlter Hash übergeben wird, die Freiheit, ihn entweder als unbekannt zu behandeln oder das Geld anzunehmen, sodass das Ergebnis eines erneut veröffentlichten QR-Codes davon abhängt, welche Implementierung der Empfänger zufällig betreibt.

Den Payment-Hash im BOLT 11-Spenden-Testvektor dekodieren

Die BOLT 11-Spezifikation enthält eine ausgearbeitete Spendenrechnung, und der darin enthaltene Payment-Hash ist ein fester Testwert, den keine Wallet jemals erzeugen sollte.

Das Beispiel trägt die Überschrift "Please make a donation of any amount using payment_hash 0001020304050607080900010203040506070809000102030405060708090102", und die Zeichenfolge beginnt mit lnbc1pvjluez. Nach dem Präfix lnbc und dem bech32-Trenner ist pvjluez der Zeitstempel, 1496314658 Sekunden seit dem Beginn von 1970. Als Nächstes kommt das Feld für das Payment Secret, danach das Tag p und dann p5, die Länge: In bech32 ist p gleich 1 und 5 gleich 20, also umfasst das Feld 1 * 32 + 20 = 52 Zeichen. Diese Zeichen, qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypq, dekodieren zu dem in dieser Überschrift genannten Hash.

Daran ist nichts privat. Die Spezifikation veröffentlicht den privaten Schlüssel, mit dem ihre Beispiele signiert sind, e126f68f7eafcc8b74f54d269fe206be715000f94dac067d1c04a8ca3b2db734, und sagt, dass jede Rechnung in jenem Abschnitt das Payment Secret 1111111111111111111111111111111111111111111111111111111111111111 trägt, sofern nichts anderes vermerkt ist, sodass diese Zeichenfolgen Parser-Fixtures und keine Zahlungsanforderungen sind. Wenn eine Wallet oder ein Diagnosewerkzeug Ihnen jemals diesen Hash außerhalb einer Testsuite zeigt, gibt etwas die Spezifikation wieder, statt Ihre Zahlung zu melden.

Payment-Hash vs. Transaktions-ID

Ein Payment-Hash benennt eine Lightning-Zahlung; eine Transaktions-ID benennt eine Transaktion, die auf der Bitcoin-Blockchain existiert. Beide sind 32 Bytes, und beide werden als 64 hexadezimale Zeichen ausgegeben, weshalb sie in den Support-Formularen des jeweils anderen landen. Eine Transaktions-ID wird im Nachhinein aus den Bytes der Transaktion selbst berechnet und kann in jeden Block-Explorer eingefügt werden. Ein Payment-Hash wird vom Empfänger gewählt, bevor die Zahlung existiert, erscheint nie in einem Block, wenn die Zahlung normal abgewickelt wird, und liefert in einem Explorer nichts zurück. Ein leeres Suchergebnis bedeutet meist, dass Sie den richtigen Wert und das falsche Werkzeug haben.

Payment-Hash vs. Payment Secret

Ein Payment-Hash und ein Payment Secret sind zwei verschiedene Werte von 256 Bits in derselben Rechnung, transportiert in den Tags p und s und jeweils als 52 bech32-Zeichen kodiert. Der Hash ist notwendigerweise öffentlich: Jeder Hop muss ihn sehen, um sein HTLC zu bauen. Das Secret wird nur an den letzten Node geliefert, innerhalb der Zwiebel, und BOLT 11 beschreibt seine Aufgabe in einer Zeile, dass es "prevents forwarding nodes from probing the payment recipient" (verhindert, dass weiterleitende Nodes den Zahlungsempfänger sondieren). Ein Leser, der kein s-Feld findet, muss die Zahlung gänzlich scheitern lassen. Der Hash ist das Schloss; das Secret ist der Nachweis, dass der Zahlende die Rechnung von der Person erhalten hat, die sie ausgestellt hat.

Nicht zu verwechseln mit

Häufig gestellte Fragen

Wo finde ich den Payment-Hash einer Lightning-Zahlung?

Im Bildschirm mit den Zahlungsdetails Ihrer Wallet, meist mit payment hash oder einfach hash beschriftet. Kopieren Sie ihn, bevor Sie diesen Bildschirm verlassen, denn eine Lightning-Zahlung hat keine Transaktions-ID, und der Hash ist die einzige Referenz, die der Support einer Börse mit Ihrem Datensatz abgleichen kann.

Ist ein Payment-Hash dasselbe wie eine Transaktions-ID?

Nein, obwohl beide 32 Byte groß sind und als 64 Hexadezimalzeichen ausgegeben werden. Eine Transaktions-ID gehört zu einer Bitcoin-Transaktion auf der Blockchain und lässt sich in jedem Explorer nachschlagen, während ein Payment-Hash zu einer Lightning-Zahlung gehört, die normalerweise überhaupt keine On-Chain-Spur hinterlässt.

Können zwei Zahlungen denselben Payment-Hash tragen?

Ja, und das Protokoll verlangt von Nodes, dies zuzulassen. Jeder Teil einer mehrteiligen Zahlung teilt sich einen Payment-Hash, und BOLT 2 verpflichtet einen Node, Duplikate zu akzeptieren, damit deren Ablehnung nicht dazu genutzt werden kann, auszuloten, was dieser Node bereits hält.

Beweist der Payment-Hash, dass ich gezahlt habe?

Der Hash allein beweist nichts, das dahinterstehende Preimage aber schon. BOLT 11 besagt, dass das Preimage des Payment-Hash den Zahlungsnachweis liefert, eine Wallet, die das Preimage nach einer erfolgreichen Zahlung speichert, hält also einen Beleg, den nur der Zahler vorlegen kann.

Weiterlesen

Verwandte Begriffe

Mehr zum Thema Lightning und Layer 2

Diese Seite auf Englisch lesen