Adresse
95 caractères : un préfixe de réseau, deux clés publiques et une somme de contrôle dans un Base58 particulier
Une adresse Monero standard = Base58( prefix ‖ B ‖ A ‖ checksum ). Le préfixe indique le réseau et le type d’adresse, B et A sont les clés publiques de dépense et de visualisation, et la somme de contrôle correspond aux 4 premiers octets du Keccak-256 de tout ce qui précède.
Disposition
Préfixe de réseau
Le préfixe est écrit sous forme de varint (un octet pour les petits nombres). En raison du fonctionnement de Base58, le préfixe détermine le premier caractère de l’adresse :
| Réseau | Standard | Intégrée | Sous-adresse |
|---|---|---|---|
| mainnet | 18 → 4… | 19 → 4… | 42 → 8… |
| stagenet | 24 → 5… | 25 → 5… | 36 → 7… |
| testnet | 53 → 9…/A… | 54 → A… | 63 → B… |
Somme de contrôle
Si l’adresse contient une faute de frappe, la somme de contrôle ne correspondra pas et le portefeuille refusera d’envoyer.
Le Base58 de Monero n’est pas celui de Bitcoin
Même alphabet (sans 0 O I l), encodage différent. Bitcoin transforme tout le message en un seul grand nombre et le convertit en base 58. Monero découpe les données en blocs de 8 octets et encode chaque bloc séparément en exactement 11 caractères (le dernier bloc incomplet en moins de caractères, selon le tableau).
| octets dans le bloc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| caractères | 2 | 3 | 5 | 6 | 7 | 9 | 10 | 11 |
69 octets = 8 blocs complets (88 caractères) + 5 octets (7 caractères) = 95 caractères. L’avantage : la longueur de l’adresse est toujours la même et l’encodage se fait en temps linéaire.
const ENC_BLOCK = [0, 2, 3, 5, 6, 7, 9, 10, 11];
function encodeBlock(block) {
let n = 0n;
for (const x of block) n = (n << 8n) | BigInt(x); // gros-boutiste à l’intérieur d’un bloc
let s = '';
while (n > 0n) { s = ALPHABET[Number(n % 58n)] + s; n /= 58n; }
return s.padStart(ENC_BLOCK[block.length], '1');
}
Adresse intégrée
Une adresse intégrée (préfixe 19) = une adresse standard + un payment ID (identifiant de paiement) de 8 octets (106 caractères). Le payment ID est chiffré dans la transaction et aide une boutique à savoir quelle commande a été payée. Aujourd’hui, on recommande plutôt les sous-adresses : une nouvelle sous-adresse par commande.
Ce que l’adresse ne contient pas
Point important : l’adresse n’est jamais inscrite sur la blockchain. L’expéditeur utilise A et B pour construire une adresse à usage unique, et seule celle-ci atteint la blockchain.