Glossar / Adressen und Schlüssel
NUMS-Punkt
- Was ist ein NUMS-Punkt?
- Ein NUMS-Punkt ist ein öffentlicher Schlüssel, für den niemand den privaten Schlüssel besitzt, und wird als interner Taproot-Schlüssel verwendet, wenn der kooperative Ausgabepfad unmöglich sein soll.
Spezifiziert im BIP-341.
"Nothing Up My Sleeve" ist die Eigenschaft: Der Punkt stammt aus einem öffentlichen, wiederholbaren Rezept, sodass niemand einen geheimen Schlüssel dafür beanspruchen kann. BIP-341 veröffentlicht einen solchen Punkt, die x-Koordinate 0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0, die durch Hashing der standardmäßigen unkomprimierten Kodierung des secp256k1-Basispunkts G erzeugt wird. Für eine Wallet ist das der Weg, auf dem eine Taproot-Ausgabe rein skriptbasiert wird: ausgeben lässt sie sich über ihren Baum von Bedingungen und sonst nichts.
So funktioniert es
Ein NUMS-Punkt beginnt als Hash, nicht als Schlüssel.
Ein gewöhnlicher öffentlicher Schlüssel ist der Generator G multipliziert mit einer geheimen Zahl, und wer diese Zahl gewählt hat, kann signieren. Ein NUMS-Punkt wird rückwärts gebaut: Man nimmt eine feste öffentliche Zeichenfolge, hasht sie und liest den 32 Byte langen Hashwert als x-Koordinate. Das Beispiel in BIP-341 hasht die standardmäßige unkomprimierte Kodierung von G selbst, was dem Autor keine Freiheit lässt, die Eingabe zu manipulieren. Wird dieser Wert zu einem Kurvenpunkt erhoben, ergibt sich ein öffentlicher Schlüssel, der in jeder Hinsicht gültig ist, außer in einer: Signieren dafür würde das Lösen eines diskreten Logarithmus bedeuten, und BIP-341 nennt 1 zu 2 hoch 128 als die Sicherheitsgrenze des Entwurfs.
Taproot liefert den Rest. Ein Taproot-Ausgabeschlüssel ist der interne Schlüssel P, der entlang der Kurve um einen Tweak verschoben wird, der sich auf die Merkle-Wurzel des Skriptbaums festlegt: BIP-341 setzt t = hash_TapTweak(p || merkle_root) und dann Q = P + int(t)G. Das Signieren für Q auf dem Schlüsselpfad erfordert den privaten Schlüssel hinter P. Ist P ein NUMS-Punkt, ist dieser Pfad geschlossen, und der Skriptpfad ist der einzige Zugang. Ein solcher Ausgabevorgang offenbart ein Blatt plus einen Kontrollblock von 33 + 32m Byte, wobei m die Anzahl der Geschwister-Hashes ist und BIP-341 sie auf 128 begrenzt.
Ein Leck sollte man kennen. Ein bekannter NUMS-Punkt ist auf den ersten Blick erkennbar, sodass seine bloße Veröffentlichung in einem Kontrollblock ankündigt, dass der Schlüsselpfad von Anfang an tot war. BIP-341 rät davon ab: Man solle eine frische ganze Zahl r gleichmäßig zufällig aus dem Bereich 0 bis n minus 1 wählen und stattdessen H + rG verwenden, was von einem gewöhnlichen internen Schlüssel nicht zu unterscheiden ist. Behält man r, kann man einem Mitunterzeichner weiterhin beweisen, dass der Punkt NUMS war, indem man es ihm zur Nachrechnung übergibt.
Wo er auftritt
Ein NUMS-Punkt erscheint nie in einer Adresse, nur im Witness eines Ausgabevorgangs über den Skriptpfad.
On-Chain ist die Ausgabe 34 Byte groß, OP_1 gefolgt von einem 32 Byte langen Push, nicht anders als jede andere Taproot-Ausgabe. Der interne Schlüssel umfasst die 32 Byte nach dem ersten Byte des Kontrollblocks; er tritt also zutage, sobald jemand über den Baum ausgibt. Eine Ausgabe, die finanziert und nie über das Skript ausgegeben wird, offenbart ihn nie.
Deskriptoren machen die Wahl ausdrücklich. BIP-386 verlangt, dass jeder Schlüsselausdruck unter tr() x-only ist, und stellt den internen Schlüssel in tr(KEY, TREE) an die erste Stelle. Ein NUMS-Punkt dort ist also die Art, wie ein Deskriptor angibt, dass kein Schlüsselpfad existiert. Der umgekehrte Fall ist tr(KEY) ohne Baum; hier zitiert BIP-386 den Rat von BIP-341, dass eine Ausgabe ohne Skriptpfad dennoch einen nicht ausgabefähigen Skriptpfad festschreiben sollte.
Ein interner NUMS-Schlüssel macht die Wiederherstellung vom Deskriptor-String statt allein von den Seed-Phrasen abhängig: Die Seeds erzeugen die Blattschlüssel neu, und nichts in ihnen hält den Baum oder den Punkt darüber fest. Der Multisig-Ablauf von Sparrow weist Sie an, den Deskriptor aufzubewahren, und diese Anweisung wiegt hier schwerer als bei einer gewöhnlichen Wallet mit Schlüsselpfad.
NUMS-Punkt vs. Null-Data-Transaktion
Ein NUMS-Punkt schließt einen Ausgabepfad, während eine Null-Data-Transaktion eine Ausgabe rundheraus nicht ausgabefähig macht. Eine OP_RETURN-Ausgabe ist konstruktionsbedingt nachweislich tot: Nodes entfernen sie aus dem UTXO-Set, und jeder ihr zugewiesene Wert wird verbrannt. Bitcoin hinter einem internen NUMS-Schlüssel sind nicht verbrannt: Jede Bedingung im Skriptbaum lässt sich weiterhin normal ausgeben. Das Wort, das beide teilen, ist nicht ausgabefähig und umfasst im einen Fall eine ganze Ausgabe und im anderen einen einzelnen Zweig.