Technik › Schlüssel & Adressen

Subadressen

Beliebig viele nicht verknüpfbare Adressen aus einem Schlüsselpaar

Kurz gesagt

Die Subadresse mit dem Index (i, j) ist das Punktpaar D = B + m·G und C = a·D, wobei m = Hs("SubAddr\0" ‖ a ‖ i ‖ j). Ohne den View Key a kannst du nicht erkennen, dass Subadressen zur selben Wallet gehören.

Warum

Wenn du zwei verschiedenen Leuten dieselbe Adresse gegeben hast, können sie sich austauschen und merken, dass sie denselben Empfänger bezahlt haben. Subadressen lösen das: eine Adresse pro Zahler, während die Wallet eine einzige bleibt und das Durchsuchen nicht langsamer wird.

Subadressen bilden eine zweistufige Hierarchie: das Konto i (Major) und den Index innerhalb des Kontos j (Minor). Die Subadresse (0, 0) ist die Hauptadresse.

Warum beginnt die Adresse (1,0) nicht mit 4?

Eine Wallet hat genau eine Hauptadresse – (0,0), also einfach B und A mit dem Präfix 18. Jeder andere Index, auch die „erste“ Adresse des zweiten Kontos (1,0), ist eine Subadresse: Ihre Schlüssel werden über m = Hs("SubAddr\0" ‖ a ‖ 1 ‖ 0) abgeleitet, und sie wird mit dem Präfix 42 kodiert, daher 8…. Ein Konto ist nur eine Möglichkeit, Subadressen zu gruppieren; eine eigene „Hauptadresse“ hat es nicht.

Wie sie berechnet wird

m = Hs( "SubAddr\0" ‖ a ‖ i ‖ j )
D = B + m·G     C = a·D i und j sind 32-Bit-Zahlen in Little-Endian; "SubAddr\0" sind 8 Bytes mit abschließendem Null-Byte

Eine Subadresse wird wie eine normale Adresse kodiert, aber mit dem Präfix 42 (beginnt im Mainnet mit 8): Base58(42 ‖ D ‖ C ‖ checksum).

Beachte, dass der öffentliche „View Key“ C der Subadresse nicht a·G ist, sondern a·D. Dieser Trick wird zum Senden gebraucht.

An eine Subadresse senden

Beim Senden an eine normale Adresse ist der Transaktionsschlüssel R = r·G. Beim Senden an eine Subadresse verwendet der Sender R = r·D. Dann berechnet der Empfänger das gemeinsame Geheimnis wie gewohnt:

a·R = a·r·D = r·(a·D) = r·C

Der Sender kennt r und C, der Empfänger kennt a und R, und beide erhalten denselben Punkt.

Wie die Wallet ihre Subadressen erkennt

Die Wallet berechnet D für einige Hundert Indizes im Voraus und führt eine Tabelle D → (i, j). Für jeden Output berechnet sie einen Kandidaten

D' = P − Hs(8·a·R ‖ n)·G

und schlägt D' in der Tabelle nach. Gefunden – der Output gehört uns, und wir wissen, an welche Subadresse er ging. Deshalb verlangsamen Subadressen das Durchsuchen nicht: eine Subtraktion und ein Nachschlagen in einer Hashtabelle.

Feinheit: Subadressen und mehrere Outputs

Hat eine Transaktion einen Output an eine Subadresse, verwendet die sendende Wallet für jeden Output einen eigenen Transaktionsschlüssel (zusätzliche Schlüssel in tx_extra). Sonst könnte der Empfänger testen, ob das Wechselgeld des Senders zu einer bestimmten Adresse gehört.