Quantum Readiness Score (QRS) — methodology v0.4 (2026-10-20)
QRS rates chains against a cryptographically relevant quantum computer (CRQC): one large enough to break today's elliptic-curve cryptography (ECC). Post-quantum (PQ) mechanisms resist that threat. Every rating needs public evidence or a repeatable on-chain measurement. score.py implements these rules.
Design rules
- Stage comes first. Every requirement must pass; high scores or good documentation cannot offset failures.
- Plans earn at most
planned. Only usable mainnet code earnslive-*; full credit needs production support and non-experimental code (seelive-experimental). - Live U requires no ECC key that can move funds, re-key or upgrade the account (
hold). Contract/program PQ accounts and vaults must be immutable or upgradeable only by their own PQ key or another PQ-controlled authority. ECC-controlled timelocks only delay forged upgrades; they do not qualify. - The weakest required slice limits the stage. For L2s, this includes proofs and upgrade keys controlling funds.
- Every state above
unknownneeds a URL. So does every stage gate and everyn/a, except P on L1s. Missing evidence meansunknownor an unmet gate. - Exposure probes are published with a pinned block and hash. They affect scores only once they cover the full chain state.
Rosette — 6 slices
The rosette shows six areas of risk. L1s are base chains; L2s settle on another chain.
| Slice | Weight | What it measures |
|---|---|---|
| U — User keys | 25 | Can users keep idle funds safe (hold) and spend with a PQ mechanism, with or without a signature (state), on mainnet? |
| C — Consensus | 20 | PQ or hybrid validator/sequencer signatures and finality (PoW chains: n/a, see below) |
| P — Proof system | 10 | Quantum resistance of L2 validity/fraud proofs. KZG/pairing = exposed; STARK/FRI/hash-based = ok |
| B — Bridges & messaging | 15 | PQ signatures on canonical bridges and interop |
| A — Admin & upgrade keys | 15 | Upgrade/freeze powers: PQ keys, or timelocks with a PQ override |
| M — Migration & recovery | 15 | A credible PQ migration path for exposed accounts, existing contracts and stored state, plus an ECC sunset |
Why these weights
Weights affect only the secondary 0–100 score, never stages.
- U 25: users need a safe place to hold and spend before any other fix can help them. Stealing from a user also takes just one key, with no protocol failure.
- C 20 covers catastrophic validator-signature forgery: double spends, rewritten finality and censorship. Attacks need a large stake share and are public, leaving time to react.
- B 15 covers canonical bridges, historically the most attacked component, pooling value behind few keys or a verifier.
- A 15 covers few but powerful keys that can replace any contract. Stages reward timelocks and exit windows that neutralize them.
- M 15: on most chains, most value already sits under revealed ECC keys. Migration decides whether that value can be rescued.
- P 10 mainly applies to L2s; more weight mostly reorders them. Most L1s have no proof system (
n/a, excluded).
scripts/sensitivity.py tests each weight at 50%, 75%, 125% and 150%, rescaling others to total 100, plus equal weights. Spearman's rank correlation measures agreement with the published ranking, for capped and raw scores; ties use average ranks. The methodology page publishes data/sensitivity.json, regenerated by the site build. A test rejects stale committed results. Weights cannot change stages.
U — hold and state
U rates holding and spending separately. hold rates the best option a user has on mainnet today. The note says when the default account is weaker.
pqmeans no ECC key can move funds, re-key or upgrade the account. Hybrid accounts that need both a PQ and an ECC signature qualify. Threshold/multisig accounts qualify only if ECC keys alone cannot form a quorum. All value-sending ECC keys must be removable and removed, including limited/function-call keys that send value through contracts.hidden-until-spendmeans a hash hides the ECC public key until the first spend, when it becomes exposed. Examples: Bitcoin P2WPKH and an Ethereum externally owned account (EOA) that has never sent a transaction. Safe at rest only.exposedmeans the controlling ECC public key is on-chain from the start, as the address or in account state/a key registry.unknown.
state rates spending with an approved PQ mechanism. Signature-less methods count: transaction-bound hash commitment/reveal or hash-based STARK proofs of secret knowledge.
hold and state rate the same account type. On L2s, hold looks at the account only. System upgrade keys (security councils, core contract admins) belong to slice A.
U counts as live only with a live state, an approved mechanism and hold of pq. Otherwise a live state earns at most 6 points and fails stage gates. A revoked or vulnerable U mechanism makes a pq hold that relies on it exposed.
Scope definitions
Live migration (M) must let existing accounts, contracts and stored state move to PQ protection. New PQ accounts alone count under U. Live M needs covers: {accounts, contracts, state}, all true; false or missing fields cap M at 6 points and fail gates. Below live, M is rated on the best published artifact (roadmap, spec or code). M is n/a only with evidence of no past ECC user keys, hence no legacy state.
A canonical bridge is core-team/foundation-operated or endorsed, or holds most of the chain's bridged value. B excludes third-party bridges.
Proof-of-work (Bitcoin, QRL, Abelian) has no block signatures to forge, so C is n/a with evidence. Grover-style mining speed-ups are out of scope.
L2 consensus (C) covers sequencer/proposer signatures. P (proofs), B (bridge) and A (upgrade keys) cover fund safety and gate L2 stages. An L2 cannot rate P as n/a; it is treated as unknown.
States and points
| State | Points | Artifact required |
|---|---|---|
exposed | 0 | ECC only, nothing better on any network |
unknown | 0 | Unresearched or no evidence; treated as worst case |
discussed | 1 | Forum idea, research post, draft or unaccepted proposal/RFC/PR |
planned | 2 | Official core-team/foundation roadmap, or accepted/merged numbered spec (BIP/EIP/AIP/NEP/CAP/ACP) awaiting activation |
in-dev | 4 | Merged core-team code, not enabled on a public network, or devnet only |
testnet | 6 | Enabled on a public testnet |
live-experimental | 6 | Mainnet, but authors label it experimental/unaudited, or no production wallet/SDK support |
live-hybrid | 10 | Production-supported mainnet. PQ AND classical; both must be forged |
live-pq | 10 | Production-supported mainnet, PQ only |
n/a | excluded | Risk does not exist; evidence required except P on L1s |
Hybrid earns PQ-only credit because requiring both signatures is at least as strong as the PQ part. ECC OR PQ is not hybrid: the ECC path means the slice is rated as ECC-only.
Mechanism registry
Every live slice names a mechanism id and its deployed parameter_set where the registry defines sets. If the registry defines sets and the file names none, the slice is non-standard. List all other verification mechanisms in components, including SNARK wrappers and KZG commitments. The weakest component decides. Every component must be an approved registry mechanism; otherwise the slice is non-standard.
For proofs, include every commitment the verifier reads: data-availability commitments and state-trie hashes (e.g. Pedersen). This includes KZG blob proofs checked through Ethereum's point-evaluation precompile. Mentioning KZG, pairings, Groth16, PLONK, Pedersen, BN254 or BLS12-381 in a proof-system description/note without declaring it makes the slice non-standard. Declare the component or reword the description.
The methodology page shows the versioned registry, data/algorithms.json, used to check mechanisms and components. Entries list kind, allowed slices, parameter sets with NIST security levels, and status:
approvedcounts for live states and gates. Signatures include ML-DSA (FIPS 204), SLH-DSA (FIPS 205), XMSS / LMS (SP 800-208) and WOTS+. RFC 8391-only XMSS sets are accepted and marked; standalone WOTS+ has no NIST approval. Signature-less methods include hash commitments and STARK proofs of knowledge. P and proof-secured bridges accept STARK/FRI and Merkle-based fault proofs.candidateis under standardization; non-standard until approved. Falcon / FN-DSA was selected by NIST in 2022; FIPS 206 is not final. Deployed variants differ, including Algorand's deterministic profile and alternative hash-to-point functions. Approval waits for FIPS 206 publication. MAYO is also a candidate.revokedmeans broken or withdrawn: Rainbow in 2022; HAWK in July 2026 after an attack roughly halved its key strength. A dependent slice scores 0 and becomes exposed.vulnerablemeans Shor's algorithm breaks it: KZG and pairing SNARKs such as Groth16, including SNARK proofs of knowledge. Treated as exposed.
Unlisted mechanisms or approved ones outside their allowed slices are non-standard: at most 8 points, no stage gates. A status change re-rates every chain using that mechanism on the next build. The registry keeps a dated changelog.
Parameter sets and caveats are published, not scored in v0.3. Live slices show their deployed set's NIST category (e.g. ML-DSA-44: category 2; ML-DSA-87: category 5). NIST considers category 1 adequate; no penalty applies. XMSS/LMS in SP 800-208, standalone WOTS+ and hash commitments lack standard-assigned categories. The registry labels estimates and explains their basis.
Caveats appear with each mechanism. Falcon / FN-DSA signing needs floating-point arithmetic, complicating side-channel-safe hardware wallets; on-chain verification is unaffected. XMSS/LMS are stateful: each one-time key may sign once, so wallets must track which keys they have used.
Score 0–100 (secondary progress index)
score = Σ W·points / Σ W over in-scope slices (n/a excluded), × 10, then caps:
- ≤ 40 unless U is live, meaning users can hold and spend under a production PQ mechanism on mainnet.
- ≤ 60 unless C is
testnet,n/a, orlive-*with an approved mechanism.
in_scope_weight shows how much of the rosette applies. research_coverage shows the weight of non-unknown slices out of 100. Both flag scores based on limited scope or research.
Stage gates
Each record in the chain file's gates needs ≥ 1 URL:
auditis an independent audit of the deployed PQ signing code with no open high/critical findings. It must be ≤ 3 years old or re-attested within 3 years, measured atas_of.migration_datedrequires a ratified migration plan with an activation date.pq_by_defaultrequires new accounts to be PQ/hybrid by protocol or reference-wallet default.ecc_sunsetrequires no ECC-only path to move material value; PQ-only since genesis qualifies.admin_timelockrecords the upgrade delay indaysand whether a PQ key can override or veto (pq_override). It counts only with at least 30 days and a PQ override.exit_windowrecords thedaysusers have to exit before an L2 upgrade takes effect. It counts only with at least 7 days.
"Live" below means live-hybrid or live-pq with an approved mechanism; U also needs hold: pq.
Stages run from 0 to 7. Each stage requires every lower one. Stages 0–4 track how far PQ user accounts have got, read from the U slice alone. From Stage 5 users are actually protected, and every requirement must pass.
Getting ready (U n/a passes all four):
- Stage 0 — Not started: Stage 1 requirements not met (U
exposed,unknownordiscussed). - Stage 1 — Committed: U at least
planned(official roadmap or accepted spec). - Stage 2 — Code merged: U at least
in-dev. - Stage 3 — Testnet: U
testnetor anylive-*state. - Stage 4 — Live option: U
live-*on mainnet andhold: pq. The mechanism may still be a candidate or non-standard and unaudited; Stage 5 closes those gaps.
Protected:
- Stage 5 — Escape hatch: U live; valid
audit; C at leastin-dev(or n/a). L2s also need P notexposed/unknown, and A live orexit_windowmet. - Stage 6 — Hybrid protected: Stage 5; C and B live (or n/a); A live (or n/a) or
admin_timelockmet. L2s need P live. Migration needs M ≥plannedwithmigration_dated, orecc_sunset, or M n/a. Also requirespq_by_defaultorecc_sunset. - Stage 7 — Quantum-safe: Stage 6; M live (or n/a because no legacy ECC state ever existed);
ecc_sunset.
An L2 names its settlement L1 in settles_on. From Stage 5 up, its stage cannot exceed that L1's stage: forgeable settlement-layer consensus or keys also threaten L2 withdrawals. Stages 0–4 are not capped, because an L2 can ship PQ accounts on its own.
v0.4 (2026-10-20) split the old Stage 0 into Stages 0–4 and renumbered Stages 1–3 as 5–7, with unchanged rules.
Measured exposure and adoption (published, not scored in v0.3)
pct_value_key_revealed is the share of sampled EOA value whose public key is already on-chain. The v0.1 probe samples recently active addresses, making account-chain results close to 100% by construction. Scoring waits for a full-state snapshot or indexer. Each result records chain, block number, block hash, RPC and sampling method.
adoption tracks value (pct_value_pq) and accounts (pct_accounts_pq) held in PQ accounts. Each dated point needs a method, evidence and at least one percentage. Shipping PQ accounts does not prove migration works. Trends matter as much as levels; a few percent after months signals trouble. Trends are published; scoring waits for cross-chain comparability. These measurements are intended for a future Stage 7 adoption threshold.
Process
Chain inputs live in chains/<chain>.json, and verbatim evidence quotes in docs/research/evidence/<chain>.md. scripts/check_evidence.py and scripts/check_quotes.py check URLs and quoted text against cited pages. score.py is deterministic: identical inputs, including as_of, produce identical stages and scores.
Review uses public PRs, a dispute window and per-chain changelogs. Re-run probes weekly; every slice change needs new evidence.
Prior art
qrindex.org (QRI), LayerQu, Hardy Index, Tectonic Quantum Tracker, Verdict, LatticeScan, and ZKNOX's PQbeat (Ethereum ecosystem). Most rate documents and roadmaps. QRS adds on-chain exposure measurements, proof/bridge/admin-key analysis and an open, deterministic scorer.
Mechanism registry 2026-10-13
Source: data/algorithms.json. cat. = standard-assigned NIST security category. est. = our estimate when no standard assigns one; notes explain the basis.
| Mechanism | Kind | Status | Slices | Parameter sets | Notes |
|---|---|---|---|---|---|
| ML-DSA FIPS 204 | signature | approved | U, C, B, A, M | ML-DSA-44 (cat. 2), ML-DSA-65 (cat. 3), ML-DSA-87 (cat. 5) | |
| SLH-DSA FIPS 205 | signature | approved | U, C, B, A, M | SLH-DSA-SHA2-128s (cat. 1), SLH-DSA-SHA2-128f (cat. 1), SLH-DSA-SHAKE-128s (cat. 1), SLH-DSA-SHAKE-128f (cat. 1), SLH-DSA-SHA2-192s (cat. 3), SLH-DSA-SHA2-192f (cat. 3), SLH-DSA-SHAKE-192s (cat. 3), SLH-DSA-SHAKE-192f (cat. 3), SLH-DSA-SHA2-256s (cat. 5), SLH-DSA-SHA2-256f (cat. 5), SLH-DSA-SHAKE-256s (cat. 5), SLH-DSA-SHAKE-256f (cat. 5) | |
| FN-DSA Falcon, selected by NIST for standardization (2022); FIPS 206 (FN-DSA) pending | signature | candidate | U, C, B, A, M | FN-DSA-512 (cat. 1), FN-DSA-1024 (cat. 5), Falcon-512 (cat. 1), Falcon-1024 (cat. 5), Falcon-1024-deterministic (est. 5), Falcon-512-BLAKE2s-h2p (est. 1), Falcon-512-Poseidon-h2p (est. 1) | Deployed Falcon variants differ from each other and the eventual standard. They remain non-standard until FIPS 206 (FN-DSA) is final. Floating-point signing makes constant-time, side-channel-safe hardware wallets and secure elements harder to build. Integer-only verification leaves on-chain verification unaffected. |
| XMSS RFC 8391; NIST SP 800-208 approves a subset (SHA2-256, SHA2-192, SHAKE256 sets) | signature | approved | U, C, B, A, M | XMSS-SHA2_10_256 (est. 5), XMSS-SHAKE256_10_256 (est. 5), XMSS-SHA2_10_192 (est. 3), XMSS-SHAKE256_10_192 (est. 3), XMSS-SHA2_16_256 (est. 5), XMSS-SHAKE256_16_256 (est. 5), XMSS-SHA2_16_192 (est. 3), XMSS-SHAKE256_16_192 (est. 3), XMSS-SHA2_20_256 (est. 5), XMSS-SHAKE256_20_256 (est. 5), XMSS-SHA2_20_192 (est. 3), XMSS-SHAKE256_20_192 (est. 3), XMSS-SHAKE_10_256 (est. 1), XMSS-SHAKE_16_256 (est. 1), XMSS-SHAKE_20_256 (est. 1) | Wallets must track used leaves. Reusing a one-time leaf breaks security. RFC 8391-only sets lack SP 800-208 approval but share its hash-based security argument. We accept them and mark their basis. |
| LMS NIST SP 800-208, RFC 8554 | signature | approved | U, C, B, A, M | LMS_SHA256_M32_H5 (est. 5), LMS_SHAKE_M32_H5 (est. 5), LMS_SHA256_M24_H5 (est. 3), LMS_SHAKE_M24_H5 (est. 3), LMS_SHA256_M32_H10 (est. 5), LMS_SHAKE_M32_H10 (est. 5), LMS_SHA256_M24_H10 (est. 3), LMS_SHAKE_M24_H10 (est. 3), LMS_SHA256_M32_H15 (est. 5), LMS_SHAKE_M32_H15 (est. 5), LMS_SHA256_M24_H15 (est. 3), LMS_SHAKE_M24_H15 (est. 3), LMS_SHA256_M32_H20 (est. 5), LMS_SHAKE_M32_H20 (est. 5), LMS_SHA256_M24_H20 (est. 3), LMS_SHAKE_M24_H20 (est. 3), LMS_SHA256_M32_H25 (est. 5), LMS_SHAKE_M32_H25 (est. 5), LMS_SHA256_M24_H25 (est. 3), LMS_SHAKE_M24_H25 (est. 3) | Wallets must track used leaves. Reusing a one-time leaf breaks security. |
| WOTS+ RFC 8391 component. SP 800-208 approves one-time signatures only within XMSS/LMS, not standalone use. | hash-based one-time signature | approved | U, A, M | WOTS+-SHA2-256-W16 (est. 5), WOTS+-SHAKE256-256-W16 (est. 5), WOTS+-Keccak-256 (est. 5) | Each key may sign once. The protocol or program must enforce this; reorgs or mempool races can cause duplicate signing. |
| hash-commitment Hash preimage resistance (same assumption as SLH-DSA/XMSS) | signature-less authentication | approved | U, A, M | SHA-256 (est. 5), SHA3-256 (est. 5), Keccak-256 (est. 5), BLAKE2s-256 (est. 5), Poseidon | Bind each reveal to its transaction to prevent front-running. Use each commitment once. Move the remaining balance to a fresh commitment in the same atomic transaction, or the account is one-time. Hash-locks with revealed preimages anyone can reuse (e.g. Stellar hash(x) signers) and pre-authorized-transaction signers are not general authentication. |
| STARK-PoK Hash-based STARK proof of knowledge of a secret | signature-less authentication | approved | U, A, M | — | Only transparent, hash-based proofs qualify. Pairing-based SNARK proofs of knowledge (Groth16, KZG-PLONK) are vulnerable. Bind the transaction as a public input to prevent replay and front-running. |
| STARK STARK/FRI (hash-based) | proof system | approved | P, B | — | List every other commitment the verifier reads as a component, including data-availability commitments (KZG blob proofs) and state-trie hashes (Pedersen). |
| hash-based-fault-proof Merkle commitments + interactive one-step fraud proofs | proof system | approved | P, B | — | List every other commitment the verifier reads as a component, including data-availability commitments (KZG blob proofs) and state-trie hashes (Pedersen). |
| KZG Pairing-based polynomial commitment | proof system | vulnerable | P, B | — | Shor's algorithm breaks discrete logarithms in pairing groups. Forged openings can make a verifier accept wrong blob data. |
| Groth16 Pairing-based zkSNARK | proof system | vulnerable | P, B, U, A, M | — | Relies on elliptic-curve pairings (BN254/BLS12-381), which Shor's algorithm breaks. |
| Pedersen Elliptic-curve Pedersen hash (e.g. over the STARK curve) | hash function | vulnerable | U, C, P, B, A, M | — | Elliptic-curve discrete logarithms provide collision resistance. Shor's algorithm finds collisions, allowing forged Merkle proofs. |
| HAWK NIST additional signatures process (round 3); withdrawn | signature | revoked | U, C, B, A, M | HAWK-512 (cat. 1), HAWK-1024 (cat. 5) | Its designer withdrew it in July 2026 after an AI-assisted attack (Anthropic's Mythos). A new way to solve its lattice isomorphism problem roughly halved key strength. Revoked 2026-07. |
| MAYO NIST additional signatures process | signature | candidate | U, C, B, A, M | — | Multivariate scheme still under NIST review; not standardized. |
| Rainbow NIST PQC round 3 finalist (dropped) | signature | revoked | U, C, B, A, M | — | Beullens broke it in 2022: level-1 key recovery takes about a weekend on a laptop. Revoked 2022-02. |
| SIKE NIST PQC round 4 candidate (dropped) | key encapsulation | revoked | — | — | Broken by Castryck and Decru (2022): classical key recovery in hours. Revoked 2022-07. |
Registry changelog
2026-10-13Registry introduced (methodology v0.3): signature-less authentication, parameter sets with NIST categories (estimates marked as such), candidate/revoked/vulnerable entries.2026-10-13Review added vulnerable Pedersen and estimated categories for Falcon variants (deterministic, alternative hash-to-point). Clarified WOTS+, hash-commitment, STARK-PoK and proof-system caveats.2026-10-13XMSS: RFC 8391 SHAKE128 sets (XMSS-SHAKE_h_256) accepted with estimated category 1 and marked as not approved in SP 800-208.2026-10-13FN-DSA / Falcon moved from approved to candidate until FIPS 206 is final.2026-10-13HAWK moved from candidate to revoked: withdrawn in July 2026 after an attack that roughly halved its key strength.
Weight sensitivity
Each weight tested at 50%, 75%, 125% and 150%; others rescaled to total 100. Equal weights tested too, across 21 chains. Lowest ranking agreement with published weights: ρ = 0.927 (before caps: 0.949). Stage changes: none. Reproduce: python3 scripts/sensitivity.py.
| Variant | Spearman ρ | ρ (raw) | Max rank move | Max score change |
|---|---|---|---|---|
| U ×0.5 | 0.927 | 0.949 | 6 | 14.0 |
| U ×0.75 | 0.972 | 0.984 | 4 | 6.8 |
| U ×1.25 | 0.999 | 0.997 | 1 | 6.4 |
| U ×1.5 | 0.994 | 0.993 | 4 | 12.5 |
| C ×0.5 | 0.997 | 0.999 | 4 | 3.6 |
| C ×0.75 | 1.0 | 1.0 | 0 | 1.8 |
| C ×1.25 | 0.976 | 0.99 | 4 | 1.7 |
| C ×1.5 | 0.976 | 0.986 | 4 | 3.3 |
| P ×0.5 | 0.999 | 0.999 | 1 | 1.2 |
| P ×0.75 | 1.0 | 1.0 | 0 | 0.6 |
| P ×1.25 | 0.999 | 0.999 | 1 | 0.6 |
| P ×1.5 | 0.996 | 0.996 | 2 | 1.2 |
| B ×0.5 | 1.0 | 0.997 | 1 | 4.9 |
| B ×0.75 | 1.0 | 0.998 | 1 | 2.4 |
| B ×1.25 | 0.985 | 0.996 | 4 | 2.4 |
| B ×1.5 | 0.975 | 0.989 | 5 | 4.7 |
| A ×0.5 | 0.994 | 0.994 | 2 | 4.1 |
| A ×0.75 | 1.0 | 1.0 | 1 | 2.0 |
| A ×1.25 | 0.998 | 0.998 | 1 | 1.9 |
| A ×1.5 | 0.998 | 0.998 | 1 | 3.8 |
| M ×0.5 | 0.999 | 0.997 | 1 | 3.7 |
| M ×0.75 | 1.0 | 0.999 | 0 | 1.8 |
| M ×1.25 | 0.986 | 0.999 | 4 | 1.8 |
| M ×1.5 | 0.983 | 0.996 | 4 | 3.5 |
| equal weights | 0.966 | 0.982 | 5 | 8.2 |