Subadressen
Beliebig viele nicht verknüpfbare Adressen aus einem Schlüsselpaar
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.
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
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:
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
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.
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.