The Curve: Ed25519 & Monero's Keys
The twisted-Edwards group Monero is built on, scalars mod ℓ, points, and how spend/view keypairs and addresses are actually derived.
Most lessons explain Monero with analogies. This course throws them out. We're going to the actual mathematics and protocol β the stuff that's "too easy" elsewhere. If you've found Monero explanations shallow, start here: everything in Monero is built on one elliptic-curve group, and once you're fluent in it, stealth addresses, ring signatures and RingCT all fall out naturally.
The Group: Ed25519
Monero's cryptography lives on the twisted-Edwards curve Ed25519 (the same curve as EdDSA signatures), defined over the prime field π½_q with q = 2Β²β΅β΅ β 19. We work in its prime-order subgroup of order:
β = 2Β²β΅Β² + 27742317777372353535851937790883648493
Two kinds of objects matter, and keeping them straight is everything:
- Scalars β integers taken modulo
β. Private keys are scalars. - Points β elements of the curve group. Public keys are points. There is a fixed base point
Gthat generates the subgroup.
The only operations you need: adding two points, and scalar multiplication (a scalar times a point, i.e. repeated addition), written xG. Scalar multiplication is a one-way trapdoor: given x and G you can compute xG easily, but recovering x from xG is the elliptic-curve discrete log problem β believed infeasible. That asymmetry is public-key cryptography.
Two Hash Functions You'll See Everywhere
Monero (from CryptoNote) uses Keccak (the original SHA-3 submission) to build two helpers:
- Hash-to-scalar, written
Hs(x): hash some bytes and reduce moduloβto get a scalar. - Hash-to-point, written
Hp(P): deterministically map bytes/a point to a curve point nobody knows the discrete log of. Used for key images and the second commitment generator.
Your Keys Are Two Scalars
A Monero account is built from two private scalars and their public points:
- Private spend key
b(scalar) β public spend keyB = bG. - Private view key
a(scalar) β public view keyA = aG. By defaulta = Hs(b), which is why your 25-word seed (which encodesb) is enough to derive everything.
This split is the source of Monero's "view-only" superpower: hand someone a (and B) and they can detect and decode your incoming funds but cannot spend them, because spending needs b.
How an Address Encodes the Keys
A standard address is not random text β it's a structured blob in CryptoNote Base58 (a base-58 variant that encodes in 8-byte blocks β 11 characters each). Concatenated and encoded:
[network byte] β [public spend key B] β [public view key A] β [4-byte Keccak checksum]
The network byte is why mainnet addresses start with 4 (and integrated/subaddresses differ). The checksum catches typos. So an address is literally your two public points wrapped with a tag and a check β decode one and you can read B and A straight out.
The 25th Word
Your mnemonic encodes the 256-bit spend key b as 24 words (each word β 11 bits over a 1626-word list); the 25th word is a checksum derived from the first 24. From b the wallet derives a = Hs(b), then B = bG and A = aG β your whole identity from one scalar.
That's the foundation: a prime-order group, scalars vs points, two hashes, and a four-key account. Every privacy feature is now just clever arithmetic on top. Next we use it to make addresses that never appear on-chain β Stealth Addresses: The Math.
Comments
Log in or create a free account to comment.
No comments yet β be the first.