Documentation · Protocol
Post-quantum networking for Minerva nodes (design, no code yet)
network/docs/architecture/pq-networking.md · commit e561109 · 2026-10-23
Status: design for review. Nothing in this document is implemented; the devp2p stack is upstream CoreGeth (secp256k1 node keys, RLPx with ECDH over secp256k1, discovery v4/v5). The account layer is already post-quantum; this is the plan for the transport and node identity, kept separate because it is a protocol change for every client and must not block the account layer.
1. What is at risk and what is not
| Surface | Today | ECDSA/ECDH break |
|---|---|---|
| Account authorization | ML-DSA-65 native transactions, registry-enforced | unaffected |
| Block ordering | Proof-of-Work | unaffected (hash based) |
| Node identity (enode id) | secp256k1 public key | an attacker can impersonate a bootnode or a known peer |
| Transport confidentiality | RLPx ECDH over secp256k1, AES/MAC | a recorded session can be decrypted later (harvest now, decrypt later) |
| Discovery records (ENR) | secp256k1 signatures | forged records, eclipse attacks become cheaper |
Consequences of a break on the network layer are eclipse and censorship, not theft: funds still need ML-DSA signatures. That ordering sets the priority: account layer first (done), transport second.
2. Node identity: ML-DSA-65 node certificates
- Each node generates an ML-DSA-65 key pair (
minerva-geth nodecert new), kept next to the secp256k1 node key. The certificate isMINERVA_NODE_CERT_V1 || chainId || enodeId (secp256k1 pubkey) || notBefore || notAfter || mldsaPublicKeysigned with the ML-DSA key over the whole record (contextMINERVA_NODE_CERT_V1). - Binding the secp256k1 enode id into a PQ-signed record means a peer that proves possession of the ML-DSA key during the handshake (section 3) has also claimed that enode id; forging the secp256k1 key alone does not let an attacker present someone else's identity.
- Bootnode operators publish
enode://...plus the certificate hash inbootnodes.json(nodeCertHash); the launch material generator fills it once the command exists. - Certificates are short lived (90 days) and rotated with the same tooling; no revocation list, expiry does the job.
3. Handshake: minerva/1 capability
RLPx hello already negotiates capabilities. minerva/1 adds two messages right after hello:
CertExchange { cert, nonce }: each side sends its certificate and a fresh 32-byte nonce.CertProof { signature }: ML-DSA-65 signature overpeerNonce || ownNonce || rlpxSessionSecretHash(contextMINERVA_NODE_PROOF_V1). Binding the RLPx session secret hash into the proof ties the PQ identity to this particular transport session, so a certificate cannot be replayed on another connection.
Peer policy per fork block minervaNodeIdentity (new chain-config field, same mechanism as the
account forks):
- before: optional; nodes record which peers proved a certificate (
admin_peersshows it); - after: a peer without a valid proof is disconnected within the handshake; bootnodes are required to have proved certificates before their ENRs are trusted.
Size: certificate about 2.1 KB, proof 3.3 KB, once per connection. Negligible against block propagation.
4. Transport: hybrid key agreement
RLPx's auth/ack run ECDH on secp256k1. The upgrade adds ML-KEM-768 (FIPS 203):
authcarries an ML-KEM-768 encapsulation key (1,184 bytes) in a new field;ackcarries the ciphertext (1,088 bytes);- session keys are derived as
KDF(ecdhSecret || mlkemSharedSecret), so the session is secure as long as either primitive holds (hybrid, as in TLS 1.3 X25519MLKEM768).
Same fork-block gate; before activation a node that does not send the field gets a classical session, after activation the field is required. Discovery packets stay classical for now (ENR signatures are 64 bytes; an ML-DSA ENR is a separate proposal), which is why node identity is proved in-band in section 3 rather than through ENRs.
5. Tooling and operations
minerva-geth nodecert new|show|rotate;minerva doctorgains anode-identitycheck (certificate present, not expired, matches the enode id).minerva_networkInforeports the identity and transport activation blocks.- Operators publish certificate hashes with the release (signed
SHA256SUMScovers the manifest).
6. Rollout
- Prototype
minerva/1on the devnet behind--minerva.nodeidentity=optional; no consensus change (handshake only). - Hybrid key agreement on the devnet; measure handshake latency and failure rates.
- Testnet: optional for one release, then required at a published fork block.
- Mainnet genesis: both active from block 0 if the testnet run is clean.
7. Open questions for review
- Whether to carry the ML-DSA public key in the ENR (v5 record size limit is 300 bytes; it does not fit) or keep the in-band proof only: this design keeps it in-band.
- ML-KEM key reuse: fresh per connection (simplest, 1 keygen per dial) or cached per hour.
- Interaction with the Engine API and light clients: out of scope; Minerva runs PoW with full nodes only.
