Bitcoin-Skripte, die die Offenlegung des privaten Schlüssels erzwingen

Kontext: Ich erstelle einen Beispielcode, der einen atomaren Austausch zwischen Elements und Bitcoin demonstrieren würde, mit dem Ziel, dass die Austauschtransaktionen nicht trivial verknüpft werden können, wie dies bei einfachem HTLC der Fall wäre, in dem Sie nach demselben Hash / Preimage suchen können beide Ketten. Dies liegt daran, dass der offenzulegende Schlüssel tatsächlich eine Summe von Schlüsseln (A + B) ist und um die andere Seite des Swaps zu beanspruchen, ein anderer Summenschlüssel (A + C) verwendet wird. A, B und C sind nur (einem oder beiden) Teilnehmern bekannt.

Ich verwende CHECKSIGFROMSTACK auf der Elementseite, um die Gegenpartei zu zwingen, eine Signatur mit festem R-Wert zu erstellen (das k wäre bekannt, und somit kann die andere Partei den Schlüssel wiederherstellen).

Ich wurde auf https://bitcointalk.org/index.php?topic=321228.msg13072047#msg13072047 verwiesen , wo gmaxwell mitteilt, dass Sie den gleichen Effekt erzielen können, indem Sie die Offenlegung von Privatschlüsseln für nicht modifizierte Bitcoin erzwingen.

Er sagt, dass er zwei Wege kennt, um dies bei unmodifiziertem Bitcoin zu erreichen, einer davon ist:

OP_SIZE 57 OP_LESSTHANOREQUAL OP_VERIFY <P> OP_CHECKSIGVERIFY

Meine Fragen:

  • In dem oben aufgeführten Skript wird die Signatur gezwungen, die Länge kleiner oder gleich 57 zu haben. Dies scheint auf einem bekannten kleinen R-Wert und der Annahme zu beruhen, dass andere R-Werte gleicher oder kleinerer Größe für ein bekanntes k rechnerisch nicht möglich sind finden.

    in diesem Beitrag https://crypto.stackexchange.com/questions/60420/what-does-the-special-form-of-the-base-point-of-secp256k1-allow wird ein R-Wert mit 90 führenden Nullbits angegeben . S müsste <= 29 Byte groß sein mit einer R-Länge von 21 Byte (166 Bit), damit die Signatur in die 57-Byte-Grenze (29 + 21 + 6 + 1 = 57) passt. Um dieses Skript mit diesem bekannten kleinen R zu erfüllen, müsste der Ersteller der Signatur nach der zu signierenden Nachricht suchen, die zu einer Signatur mit len(S) <= 29 führen würde. Wird diese enge Grenze gewählt, um den „Spielraum“ zu verringern? für Brute-Forcing R ?

  • Was ist die zweite Methode, um dies bei unmodifiziertem Bitcoin zu erreichen?

  • Wenn diese Methoden funktionieren, warum wurden sie nicht häufig anstelle von HTLC-Konstrukten verwendet, da diese Methoden (oder zumindest die vorgestellte) nicht viel komplexer in Bezug auf die Implementierung sind, aber privater (weil es keinen öffentlich geteilten Hash gibt). /Vorbild) ? Was sind die Nachteile dieser Methoden gegenüber HTLC?

(Anmerkung: Die obigen Fragen sind eher aus intellektueller Neugier als aus konkretem praktischem Zweck, denn wenn Schnorr-Signaturen auf Bitcoin aktiviert werden (ich hoffe, das wird nicht zu lange dauern), Adapter-Signaturen https://github.com/apoelstra /scriptless-scripts/blob/master/md/atomic-swap.md wäre ein viel besserer Weg, um atomare Swaps ohne triviale Verknüpfung zwischen Transaktionen zu erstellen)

Zusätzlich zu Adaptersignaturen über Schnorr-Signaturen gibt es jetzt eine einfachere Möglichkeit (als zuvor), Adaptersignaturen mit ECDSA zu erstellen: joinmarket.me/blog/blog/schnorrless-scriptless-scripts

Antworten (1)

Ich habe einige Suchen und Recherchen durchgeführt, und ich habe auch Input zum Kanal #elements auf Bitcoincore Slack erhalten, also habe ich das Gefühl, dass ich diese jetzt beantworten kann (BEARBEITEN: Zuerst war ich verwirrt über die CODESEPARATOR-Methode, aber nach einiger Zeit habe ich fragte Anthony Towns und er stellte die Links zu seinen Nachrichten in der Liste der Beleuchtungsentwickler zur Verfügung, um dies zu erklären.)

Es stellt sich heraus, dass ich einen Fehler gemacht habe, als ich dachte, dass CODESEPARATOR alleine für diesen Zweck verwendet werden kann - wenn es zwei Signaturen für einen Pubkey und zwei verschiedene Seufzer gibt, ist die Seite, die die Signaturen erstellt, nicht in der Wahl der Nonces eingeschränkt - keine Möglichkeit für Skript um zu überprüfen, ob sigs das gleiche r haben. Es muss also eine Möglichkeit geben, diese Signaturen zu zwingen, die Nonce wiederzuverwenden – und der einzige Trick, der mir bisher bei unmodifizierten Bitcoins bekannt ist, ist der Größentrick. Die zweite Frage bleibt also leider unbeantwortet.
Fragte Anthony Towns danach, bekam Antwort. Es gibt eine Technik, die zwei Codeseparatoren und drei Checkmultisigs verwendet, so dass die Wiederverwendung von R erzwungen wird . Siehe listen.linuxfoundation.org/pipermail/lightning-dev/2015-November/… dev/2015-November/…