Tecnico › Chiavi e indirizzi

Indirizzo

95 caratteri: un prefisso di rete, due chiavi pubbliche e un checksum in uno speciale Base58

In breve

Un indirizzo Monero standard = Base58( prefix ‖ B ‖ A ‖ checksum ). Il prefisso indica la rete e il tipo di indirizzo, B e A sono le chiavi pubbliche di spesa e di visualizzazione, e il checksum sono i primi 4 byte del Keccak-256 di tutto ciò che lo precede.

Struttura

12 B: chiave pubblica di spesa A: chiave pubblica di visual. check 1 byte 32 byte 32 byte 4 byte 69 byte → Base58 di Monero → 95 caratteri

Prefisso di rete

Il prefisso è scritto come varint (un byte per i numeri piccoli). Per il modo in cui funziona Base58, il prefisso determina il primo carattere dell'indirizzo:

ReteStandardIntegratoSubaddress
mainnet18 → 4…19 → 4…42 → 8…
stagenet24 → 5…25 → 5…36 → 7…
testnet53 → 9…/A…54 → A…63 → B…

Checksum

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

Se l'indirizzo contiene un errore di battitura, il checksum non corrisponde e il wallet si rifiuta di inviare.

Il Base58 di Monero non è quello di Bitcoin

Stesso alfabeto (senza 0 O I l), codifica diversa. Bitcoin trasforma l'intero messaggio in un unico grande numero e lo converte in base 58. Monero taglia i dati in blocchi da 8 byte e codifica ogni blocco separatamente in esattamente 11 caratteri (l'ultimo blocco parziale in meno caratteri, secondo la tabella).

byte nel blocco12345678
caratteri2356791011

69 byte = 8 blocchi completi (88 caratteri) + 5 byte (7 caratteri) = 95 caratteri. Il vantaggio: la lunghezza dell'indirizzo è sempre la stessa e la codifica richiede tempo lineare.

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);       // big-endian all'interno di un blocco
  let s = '';
  while (n > 0n) { s = ALPHABET[Number(n % 58n)] + s; n /= 58n; }
  return s.padStart(ENC_BLOCK[block.length], '1');
}

Indirizzo integrato

Un indirizzo integrato (prefisso 19) = un indirizzo standard + un payment ID da 8 byte (106 caratteri). Il payment ID è cifrato all'interno della transazione e aiuta un negozio a capire quale ordine è stato pagato. Oggi si consigliano invece i subaddress: un nuovo subaddress per ogni ordine.

Cosa l'indirizzo non contiene

Importante: l'indirizzo non viene mai scritto sulla blockchain. Il mittente usa A e B per costruire un indirizzo monouso, ed è solo quello ad arrivare sulla blockchain.