Technique › Clés et adresses

Adresse

95 caractères : un préfixe de réseau, deux clés publiques et une somme de contrôle dans un Base58 particulier

En bref

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

12 B — clé publique de dépense A — clé publique de visu. contrôle 1 octet 32 octets 32 octets 4 octets 69 octets → Base58 de Monero → 95 caractères

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éseauStandardIntégréeSous-adresse
mainnet18 → 4…19 → 4…42 → 8…
stagenet24 → 5…25 → 5…36 → 7…
testnet53 → 9…/A…54 → A…63 → B…

Somme de contrôle

checksum = Keccak256( prefix ‖ B ‖ A )[0..4]

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 bloc12345678
caractères2356791011

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.