Adresse
95 Zeichen: ein Netzwerk-Präfix, zwei öffentliche Schlüssel und eine Prüfsumme in einem besonderen Base58
Eine Standard-Monero-Adresse = Base58( prefix ‖ B ‖ A ‖ checksum ). Das Präfix gibt Netzwerk und Adresstyp an, B und A sind der öffentliche Spend Key und View Key, und die Prüfsumme sind die ersten 4 Bytes von Keccak-256 über alles davor.
Aufbau
Netzwerk-Präfix
Das Präfix wird als Varint geschrieben (ein Byte für kleine Zahlen). Wegen der Funktionsweise von Base58 bestimmt das Präfix das erste Zeichen der Adresse:
| Netzwerk | Standard | Integriert | Subadresse |
|---|---|---|---|
| Mainnet | 18 → 4… | 19 → 4… | 42 → 8… |
| Stagenet | 24 → 5… | 25 → 5… | 36 → 7… |
| Testnet | 53 → 9…/A… | 54 → A… | 63 → B… |
Prüfsumme
Enthält die Adresse einen Tippfehler, passt die Prüfsumme nicht, und die Wallet verweigert das Senden.
Monero-Base58 ist nicht das von Bitcoin
Gleiches Alphabet (ohne 0 O I l), andere Kodierung. Bitcoin macht aus der ganzen Nachricht eine große Zahl und wandelt sie in die Basis 58 um. Monero zerlegt die Daten in 8-Byte-Blöcke und kodiert jeden Block einzeln in genau 11 Zeichen (den letzten, unvollständigen Block laut Tabelle in weniger).
| Bytes im Block | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| Zeichen | 2 | 3 | 5 | 6 | 7 | 9 | 10 | 11 |
69 Bytes = 8 volle Blöcke (88 Zeichen) + 5 Bytes (7 Zeichen) = 95 Zeichen. Der Vorteil: Die Adresslänge ist immer gleich, und die Kodierung läuft in linearer Zeit.
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 innerhalb eines Blocks
let s = '';
while (n > 0n) { s = ALPHABET[Number(n % 58n)] + s; n /= 58n; }
return s.padStart(ENC_BLOCK[block.length], '1');
}
Integrierte Adresse
Eine integrierte Adresse (Präfix 19) = eine Standardadresse + eine 8-Byte-Payment ID (106 Zeichen). Die Payment ID wird in der Transaktion verschlüsselt und hilft einem Shop zu erkennen, welche Bestellung bezahlt wurde. Heute werden stattdessen Subadressen empfohlen: eine neue Subadresse pro Bestellung.
Was die Adresse nicht enthält
Wichtig: Die Adresse wird nie in die Blockchain geschrieben. Der Sender verwendet A und B, um eine Einmal-Adresse zu bauen, und nur diese gelangt auf die Blockchain.