Sous-adresses
Autant d’adresses non reliables qu’on veut à partir d’une seule paire de clés
La sous-adresse d’indice (i, j) est la paire de points D = B + m·G et C = a·D, où m = Hs("SubAddr\0" ‖ a ‖ i ‖ j). Sans la clé de visualisation a, impossible de savoir que des sous-adresses appartiennent au même portefeuille.
Pourquoi
Si vous avez donné une même adresse à deux personnes différentes, elles peuvent comparer leurs notes et comprendre qu’elles ont payé le même destinataire. Les sous-adresses règlent ce problème : une adresse par payeur, tandis que le portefeuille reste unique et que le balayage n’est pas ralenti.
Les sous-adresses forment une hiérarchie à deux niveaux : le compte i (majeur) et l’indice dans le compte j (mineur). La sous-adresse (0, 0) est l’adresse principale.
Un portefeuille a exactement une adresse principale — (0,0), qui n’est autre que B et A avec le préfixe 18. Tout autre indice, y compris la « première » adresse du deuxième compte (1,0), est une sous-adresse : ses clés sont dérivées via m = Hs("SubAddr\0" ‖ a ‖ 1 ‖ 0), et elle est encodée avec le préfixe 42, d’où 8…. Un compte n’est qu’une façon de regrouper des sous-adresses ; il n’a pas d’adresse « principale » propre.
Comment on la calcule
D = B + m·G C = a·D i et j sont des nombres de 32 bits petit-boutistes ; "SubAddr\0" fait 8 octets avec un octet nul final
Une sous-adresse est encodée comme une adresse normale mais avec le préfixe 42 (elle commence par 8 sur le mainnet) : Base58(42 ‖ D ‖ C ‖ checksum).
Notez que la « clé de visualisation » publique de la sous-adresse, C, n’est pas a·G mais a·D. Cette astuce est nécessaire pour l’envoi.
Envoyer vers une sous-adresse
Lors d’un envoi vers une adresse normale, la clé de transaction est R = r·G. Lors d’un envoi vers une sous-adresse, l’expéditeur utilise R = r·D. Le destinataire calcule alors le secret partagé comme d’habitude :
L’expéditeur connaît r et C, le destinataire connaît a et R, et tous deux obtiennent le même point.
Comment le portefeuille reconnaît ses sous-adresses
Le portefeuille précalcule D pour quelques centaines d’indices et conserve une table D → (i, j). Pour chaque sortie, il calcule un candidat
et cherche D' dans la table. Trouvé : la sortie est à nous, et l’on sait sur quelle sous-adresse elle est arrivée. C’est pourquoi les sous-adresses ne ralentissent pas le balayage : une soustraction et une recherche dans une table de hachage.
Si une transaction contient une sortie vers une sous-adresse, le portefeuille expéditeur utilise une clé de transaction distincte pour chaque sortie (clés supplémentaires dans tx_extra). Sinon, le destinataire pourrait tester si la monnaie rendue à l’expéditeur appartient à une certaine adresse.