Glossar / Entwicklerreferenz
Punktfunktion
- Was ist die Punktfunktion?
- Die Punktfunktion verwandelt einen privaten Schlüssel in einen öffentlichen Schlüssel, indem sie den Generatorpunkt von secp256k1 mit dieser Zahl multipliziert, und sie ist der Einwegschritt, auf dem jede Bitcoin-Adresse aufbaut.
Spezifiziert im BIP-32.
BIP32 gibt der Operation einen Namen, point(p), weil die hierarchische Schlüsselableitung sie in fast jeder Zeile erwähnt. Multiplizieren Sie den festen Generator der Kurve mit einem 256 Bit großen Geheimnis, und das Ergebnis ist ein Koordinatenpaar, das Sie gefahrlos veröffentlichen können; das Geheimnis aus diesem Paar zurückzugewinnen, bedeutet, einen diskreten Logarithmus über einen 78 Ziffern großen Raum zu lösen. Ihre Wallet führt die Funktion einmal pro Adresse aus und muss sie nie rückwärts ausführen.
So funktioniert es
Die Punktfunktion ist die Multiplikation auf einer elliptischen Kurve, bei der einer der beiden Eingabewerte für immer feststeht.
Bitcoin verwendet die Kurve secp256k1, definiert durch die Gleichung y zum Quadrat gleich x hoch drei plus 7 über einem großen Primkörper und standardisiert im SEC-2-Dokument statt durch NIST. Die Kurve bringt einen Generatorpunkt G mit, den jede Implementierung fest einprogrammiert, sowie eine Gruppenordnung n, deren Wert knapp unter 2 hoch 256 liegt. Ein privater Schlüssel ist jede ganze Zahl von 1 bis n minus 1. Die Funktion addiert G so oft zu sich selbst, wobei sie eine Leiter aus Verdopplungen und Additionen verwendet, was in deutlich unter einer Millisekunde endet und nicht im Alter des Universums.
Der umgekehrte Weg ist die gesamte Sicherheitsannahme. Ist der resultierende Punkt gegeben, so gewinnt keine veröffentlichte Methode den Multiplikator schneller zurück als ungefähr mit der Quadratwurzel der Gruppengröße, was den Aufwand auf etwa 2 hoch 128 Operationen bringt. Daran ändert sich nichts, wenn eine Adresse wiederverwendet, veröffentlicht oder jahrzehntelang gehalten wird.
Eine Eigenschaft macht hierarchische Wallets möglich. Die Punktmultiplikation ist distributiv über der Addition, der Punkt von a plus b ist also gleich dem Punkt von a addiert zum Punkt von b. Addieren Sie einen Tweak zu einem privaten Schlüssel, verschiebt sich der passende öffentliche Schlüssel um den Punkt dieses Tweaks, einen Betrag, den jeder ohne Kenntnis des Schlüssels berechnen kann. Darauf beruht die nicht gehärtete BIP32-Ableitung, und ebenso der Ausgabeschlüssel von Taproot, der ein interner Schlüssel ist, verschoben um eine Festlegung auf einen Skriptbaum.
Wo Sie sie sehen
Die Punktfunktion läuft jedes Mal, wenn eine Wallet Ihnen eine neue Empfangsadresse anzeigt.
Sie ist auch der Grund, warum ein erweiterter öffentlicher Schlüssel für sich nützlich ist. Geben Sie eine xpub an einen Onlineshop oder an ein Smartphone mit Nur-Lese-Zugriff, und diese Maschine kann pro Zahlung eine neue Adresse erzeugen, indem sie einen öffentlichen Schlüssel tweakt, ohne dass irgendwo auf ihr ein privater Schlüssel vorhanden ist. Hardware-Wallets nutzen dieselbe Asymmetrie von der anderen Seite: Das Geheimnis verlässt nie den Chip, und nur der resultierende Punkt kommt über das Kabel zurück.
Die Eigenschaft hat eine scharfe Kante. Weil die Beziehung additiv und öffentlich ist, kann jeder mit einem erweiterten öffentlichen Schlüssel in Kombination mit einem durchgesickerten nicht gehärteten privaten Kindschlüssel den privaten Elternschlüssel und damit den gesamten Zweig zurückgewinnen. Deshalb ist die Ableitung auf Kontoebene gehärtet, und deshalb ist eine durchgesickerte xpub ein Datenschutzdesaster und kein unmittelbarer Diebstahl.
Punktfunktion vs. komprimierter öffentlicher Schlüssel
Die Punktfunktion erzeugt ein mathematisches Objekt; ein komprimierter öffentlicher Schlüssel ist eine Art, dieses Objekt aufzuschreiben. Ein Punkt ist ein Paar von Koordinaten zu je 32 Bytes. Die komprimierte Form verwirft die y-Koordinate und behält ein Präfix von einem Byte, das festhält, ob sie gerade oder ungerade war, was 33 Bytes ergibt. Die unkomprimierte Form schreibt beide Koordinaten über 65 Bytes aus. Die x-only-Form von Taproot behält 32 Bytes und gar kein Präfix. Jede von ihnen beschreibt denselben Punkt, und doch ergibt jede Kodierung einen anderen Adress-Hash, weshalb das Importieren eines alten Schlüssels mit falschem Komprimierungs-Flag einen Kontostand von null anzeigt, während die Bitcoin unberührt auf der anderen Adresse liegen.