Indirizzo
95 caratteri: un prefisso di rete, due chiavi pubbliche e un checksum in uno speciale Base58
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
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:
| Rete | Standard | Integrato | Subaddress |
|---|---|---|---|
| mainnet | 18 → 4… | 19 → 4… | 42 → 8… |
| stagenet | 24 → 5… | 25 → 5… | 36 → 7… |
| testnet | 53 → 9…/A… | 54 → A… | 63 → B… |
Checksum
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 blocco | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| caratteri | 2 | 3 | 5 | 6 | 7 | 9 | 10 | 11 |
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.