Every XE account is an ed25519 key pair. The public key, hex-encoded (64 hex chars / 32 bytes), is the account address. No prefixes, no checksums.
Key Generation
kp, err := core.GenerateKeyPair() // random
kp := core.KeyPairFromSeed(seed) // deterministic from 32-byte seedBlock Signing
- Canonical encoding via
MarshalBlockCanonical() SHA-256(networkID ‖ canonical ‖ aux)→b.Hash— the aux tail (MarshalBlockAux) is the certificate hash plus timekeeper attestations, empty for non-lease blocks; genesis is hashed with the network-ID prefix cleareded25519.Sign(privateKey, hashBytes)→b.Signature
Multisig Accounts
- Address =
sha256(canonical(keyset))(hash-derived) - Opened with
multisig_openblock - Rotated via
multisig_updateblocks - Spending: M-of-N threshold; Receiving: 1-of-N
Delegation
Each block includes an optional Representative field. Empty means keep current delegation. Delegation weight is the account's XE balance in micro-XE — XUSD is mintable by authorized minters and must not mint consensus weight, so it contributes nothing.