Technik › Schlüssel & Adressen

Adresse

95 Zeichen: ein Netzwerk-Präfix, zwei öffentliche Schlüssel und eine Prüfsumme in einem besonderen Base58

Kurz gesagt

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

12 B – öffentlicher Spend Key A – öffentlicher View Key Prüfs. 1 Byte 32 Bytes 32 Bytes 4 Bytes 69 Bytes → Monero-Base58 → 95 Zeichen

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:

NetzwerkStandardIntegriertSubadresse
Mainnet18 → 4…19 → 4…42 → 8…
Stagenet24 → 5…25 → 5…36 → 7…
Testnet53 → 9…/A…54 → A…63 → B…

Prüfsumme

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

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 Block12345678
Zeichen2356791011

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.