mirror of
https://github.com/luxfi/proofs.git
synced 2026-10-30 15:21:05 +00:00
Bylines, paper authorship, correspondence addresses and the founder blurb under each post named an individual. They name the organisation that published the work instead: the brand on posts and pages, the research byline on papers, and research@ in place of a personal address. Both are what these repositories already used elsewhere — nothing new was coined. Co-authors are untouched. Where a paper named someone else alongside, they stay named; only the one byline changed. Bibliography entries, running heads, PDF metadata and affiliations move with it, so a citation still resolves to whoever the cited paper names. Sample and fixture data uses the placeholder name these tests already use elsewhere, so no assertion changed meaning. Co-authored-by: Hanzo Dev <[email protected]>
1695 lines
76 KiB
TeX
1695 lines
76 KiB
TeX
|
|
%% ===================================================================
|
|
%% LP-134 canonical naming (2025-12-15):
|
|
%% Per LP-134 (Lux Chain Topology), T-Chain has been split into:
|
|
%% M-Chain — MPC ceremonies for bridge custody of EXTERNAL wallets
|
|
%% (CGGMP21, FROST, Pulsar-general)
|
|
%% F-Chain — FHE compute + TFHE bootstrap-key generation (encrypted EVM)
|
|
%% The legacy name "T-Chain" is retained ONLY for `teleportvm` (LP-6332).
|
|
%% Where this paper says "T-Chain MPC" / "T-Chain threshold governance" /
|
|
%% "T-Chain TFHE" / "T-Chain custody", read as M-Chain (MPC) or F-Chain (FHE).
|
|
%% ===================================================================
|
|
|
|
\documentclass[11pt]{article}
|
|
\usepackage{amsmath,amssymb,amsthm}
|
|
\usepackage{booktabs}
|
|
\usepackage{enumitem}
|
|
\usepackage{hyperref}
|
|
\usepackage[margin=1in]{geometry}
|
|
|
|
\hypersetup{colorlinks=true,linkcolor=black,citecolor=blue,urlcolor=blue}
|
|
|
|
\newtheorem{theorem}{Theorem}
|
|
\newtheorem{lemma}[theorem]{Lemma}
|
|
\newtheorem{corollary}[theorem]{Corollary}
|
|
\newtheorem{definition}{Definition}
|
|
\newtheorem{remark}{Remark}
|
|
|
|
% Theorem numbers in this document are deliberately offset so that the
|
|
% main results are 7.5, 7.6, 7.7, 7.8, matching the LP-020 paper numbering.
|
|
% (Theorems 7.1--7.4 live in LP-020 itself.)
|
|
\setcounter{theorem}{4}
|
|
|
|
\title{QuasarCert Soundness:\\
|
|
{\large Canonical Formal Specification, Quasar 3.0}}
|
|
\author{Lux Research\\
|
|
\textit{Lux Industries, Inc.}\\
|
|
\texttt{[email protected]}}
|
|
\date{Spec freeze: 2025-12-15 \\ Activation: 2025-12-25}
|
|
|
|
\begin{document}
|
|
\maketitle
|
|
|
|
\begin{abstract}
|
|
This note is the canonical formal specification of QuasarCert soundness
|
|
for the Quasar 3.0 chain activation on 2025-12-25. QuasarCert is a
|
|
three-lane finality certificate
|
|
$\mathcal{C} = (\sigma_{\mathrm{BLS}}, \sigma_{\mathrm{RT}},
|
|
\pi_{\mathrm{ZK}})$ with each lane bound to a common
|
|
\emph{certificate subject} that fixes chain id, epoch, round, mode and
|
|
the per-chain root commitments $(P, Q, Z, A, B, M, F)$. We prove four
|
|
results with theorem numbers aligned to LP-020:
|
|
(7.5) classical soundness, requiring an adversary to forge all three
|
|
lanes against three independent hardness assumptions;
|
|
(7.6) parallel-lane liveness, allowing the three lanes to be aggregated
|
|
independently and in parallel;
|
|
(7.7) post-quantum safety, the standalone PQ predicate
|
|
$\mathsf{VerifyPQ} = \mathsf{RT.Verify} \land \mathsf{ZK.Verify}$;
|
|
(7.8) subject-binding replay protection, ruling out cross-epoch reuse of
|
|
any valid cert. We also address the rejection of threshold ML-DSA in
|
|
3.0 (App.~A), the GPU verifier in LP-132 (\S7), and the concrete
|
|
post-quantum parameter analysis (App.~E).
|
|
|
|
This proof establishes soundness of the QuasarCert wire format defined in LP-020, with constituent layers specified in LP-070 (ML-DSA), LP-073 (Pulsar; Corona-derived lattice threshold kernel with key-era lifecycle), and LP-075 (BLS aggregate).
|
|
|
|
\paragraph{Naming evolution (2026-03).} LP-073 was originally titled ``Corona.'' It now describes \textbf{Pulsar}, the Lux production fork at \texttt{github.com/luxfi/pulsar}, which inherits Corona's Sign1/Sign2/Combine math byte-equal but adds a key-era lifecycle (LSS-managed generations, verifiable resharing, activation certificate, rollback) suitable for permissionless validator-set rotation. Throughout this proof, ``Corona'' refers to the lattice signing primitive (the Sign1/Sign2/Combine math); ``Pulsar'' refers to the systems-layer composition that wraps it for dynamic permissionless deployment. Soundness results below derive from the SUF-CMA reduction of the underlying Corona signing scheme; lifecycle additions (resharing, activation, rollback) are orthogonal to the per-signature unforgeability argument and are addressed separately in LP-073's lifecycle section.
|
|
\end{abstract}
|
|
|
|
%% ==================================================================
|
|
\section{QuasarCert}
|
|
\label{sec:cert}
|
|
%% ==================================================================
|
|
|
|
\begin{definition}[Validator set]
|
|
\label{def:val}
|
|
$\mathcal{V} = \{v_1, \ldots, v_n\}$, $|\mathcal{V}| = n$. Stake
|
|
distribution $\mathrm{stk}: \mathcal{V} \to \mathbb{N}$ with total
|
|
stake $S = \sum_i \mathrm{stk}(v_i)$. At most a stake fraction $f < 1/3$
|
|
is Byzantine. Threshold $\tau = 2/3$, i.e.\ a valid quorum collects
|
|
stake $\geq \lceil 2S/3 \rceil$.
|
|
\end{definition}
|
|
|
|
\begin{definition}[Certificate subject -- Def.~6.1 of LP-020]
|
|
\label{def:subject}
|
|
The \emph{certificate subject} is the byte string
|
|
\[
|
|
\mathsf{subj} =
|
|
\mathsf{chain\_id} \,\|\, \mathsf{epoch} \,\|\, \mathsf{round}
|
|
\,\|\, \mathsf{mode}
|
|
\,\|\, P \,\|\, Q \,\|\, Z \,\|\, A \,\|\, B \,\|\, M \,\|\, F
|
|
\,\|\, \mathsf{parent\_*\_hashes}
|
|
\,\|\, \mathsf{gas/fee}
|
|
\]
|
|
where $P$ = \texttt{pchain\_validator\_root}, $Q$ =
|
|
\texttt{qchain\_ceremony\_root}, $Z$ = \texttt{zchain\_vk\_root},
|
|
$A$ = \texttt{achain\_state\_root}, $B$ = \texttt{bchain\_state\_root},
|
|
$M$ = \texttt{mchain\_msg\_root}, $F$ = \texttt{fchain\_state\_root}.
|
|
All three lanes sign or prove against $\mathsf{subj}$.
|
|
\end{definition}
|
|
|
|
\begin{definition}[QuasarCert -- Def.~6.2 of LP-020]
|
|
\label{def:cert}
|
|
For subject $\mathsf{subj}$, a \emph{QuasarCert} is the triple
|
|
\[
|
|
\mathcal{C} = (\sigma_{\mathrm{BLS}}, \sigma_{\mathrm{RT}},
|
|
\pi_{\mathrm{ZK}})
|
|
\]
|
|
where:
|
|
\begin{itemize}[nosep]
|
|
\item $\sigma_{\mathrm{BLS}}$: BLS12-381 aggregate from validators of
|
|
stake $\geq \tau S$ on $\mathsf{subj}$, verified against
|
|
$\mathsf{pchain\_validator\_root}$;
|
|
\item $\sigma_{\mathrm{RT}}$: Corona two-round threshold signature
|
|
aggregating shares of stake $\geq \tau S$ on $\mathsf{subj}$,
|
|
verified against $\mathsf{qchain\_ceremony\_root}$;
|
|
\item $\pi_{\mathrm{ZK}}$: Z-Chain Groth16 proof that $n$ ML-DSA-65
|
|
signatures on $\mathsf{subj}$ verify under the public-key vector
|
|
committed by $\mathsf{zchain\_vk\_root}$.
|
|
\end{itemize}
|
|
$\mathsf{Verify}(\mathcal{C}) = 1$ iff every lane verifies and every
|
|
lane binds the \emph{same} $\mathsf{subj}$.
|
|
\end{definition}
|
|
|
|
\begin{definition}[Hardness assumptions]
|
|
\label{def:assumptions}
|
|
We isolate one assumption per lane.
|
|
\begin{enumerate}[nosep]
|
|
\item \textbf{DL/co-CDH on BLS12-381} (classical). Discrete log /
|
|
co-CDH in $(\mathbb{G}_1, \mathbb{G}_2, \mathbb{G}_T)$. BLS
|
|
aggregate signatures with proof-of-possession are EUF-CMA under
|
|
co-CDH.
|
|
\item \textbf{Module-LWE} (post-quantum). $\mathsf{MLWE}_{q,k,\ell,
|
|
\chi}$ for the Corona / ML-DSA-65 parameter sets in App.~E.
|
|
\item \textbf{Module-SIS} (post-quantum). $\mathsf{MSIS}_{q,k,\beta}$
|
|
for the same parameter sets. Combined with MLWE, gives EUF-CMA for
|
|
ML-DSA-65 (FIPS~204) and SUF-CMA for Corona.
|
|
\item \textbf{KEA / AGM} (auxiliary). Groth16 is knowledge-sound in
|
|
the algebraic group model on BLS12-381.
|
|
\end{enumerate}
|
|
\end{definition}
|
|
|
|
%% ==================================================================
|
|
\section{Adversary Model}
|
|
\label{sec:adv}
|
|
%% ==================================================================
|
|
|
|
\begin{definition}[Adversary]
|
|
\label{def:adv}
|
|
A non-uniform polynomial-time adversary $\mathcal{A}$ controls a
|
|
subset $F \subset \mathcal{V}$ of validators with stake share $< \tau$.
|
|
$\mathcal{A}$ is given:
|
|
\begin{itemize}[nosep]
|
|
\item the public keys of all validators (BLS, Corona, ML-DSA);
|
|
\item signing oracles for the corrupt set $F$;
|
|
\item the public verification key $\mathsf{vk}$ for the Z-Chain
|
|
Groth16 circuit;
|
|
\item the random oracle $H$ (programmable in the proof).
|
|
\end{itemize}
|
|
We consider two variants.
|
|
\begin{description}[nosep]
|
|
\item[$\mathcal{A}_C$ -- classical PPT.] Standard probabilistic
|
|
polynomial time.
|
|
\item[$\mathcal{A}_Q$ -- quantum PPT.] Polynomial-time on a quantum
|
|
Turing machine; can run Shor and Grover, has full quantum random
|
|
oracle access (QROM).
|
|
\end{description}
|
|
$\mathcal{A}$ \emph{wins} the soundness game if it outputs
|
|
$(\mathsf{subj}^\star, \mathcal{C}^\star)$ such that
|
|
$\mathsf{Verify}(\mathcal{C}^\star) = 1$ and $\mathsf{subj}^\star$ was
|
|
not endorsed by any honest stake-weighted quorum.
|
|
\end{definition}
|
|
|
|
\begin{remark}[Static vs adaptive]
|
|
The proofs in Sections~\ref{sec:soundness}--\ref{sec:replay} are stated
|
|
under \emph{static} corruption. Adaptive corruption is handled in
|
|
App.~C via secure-erasure or programmable-RO hybrids, with at most an
|
|
$O(n \cdot Q_H)$ multiplicative loss. All Lux validators perform
|
|
Go-side memory zeroing of Corona signing randomness; HSM-backed
|
|
T-Chain signing on the live network provides hardware-enforced
|
|
erasures, so Cor.~\ref{cor:adaptive-erasure} applies tightly.
|
|
\end{remark}
|
|
|
|
%% ==================================================================
|
|
\section{Soundness}
|
|
\label{sec:soundness}
|
|
%% ==================================================================
|
|
|
|
\begin{theorem}[QuasarCert classical soundness]
|
|
\label{thm:main}
|
|
Under the assumptions of Def.~\ref{def:assumptions}, if
|
|
$\mathcal{C}^\star = (\sigma_{\mathrm{BLS}}^\star,
|
|
\sigma_{\mathrm{RT}}^\star, \pi_{\mathrm{ZK}}^\star)$ verifies against a
|
|
subject $\mathsf{subj}^\star$ that was not endorsed by validators of
|
|
stake $\geq \tau S$, then $\mathcal{A}_C$'s advantage satisfies
|
|
\[
|
|
\mathsf{Adv}^{\mathrm{forge}}_{\mathcal{A}_C}
|
|
\;\leq\;
|
|
\min\!\bigl(
|
|
\epsilon_{\mathrm{BLS}}^{\mathrm{coCDH}},\;
|
|
\epsilon_{\mathrm{RT}}^{\mathrm{MLWE,MSIS}},\;
|
|
\epsilon_{\mathrm{ZK}}^{\mathrm{KEA}} +
|
|
n \cdot \epsilon_{\mathrm{MLDSA}}^{\mathrm{MLWE,MSIS}}
|
|
\bigr)
|
|
\;=\; \mathsf{negl}(\lambda).
|
|
\]
|
|
\end{theorem}
|
|
|
|
\begin{proof}
|
|
We argue per lane and then take the conjunction.
|
|
|
|
\medskip\noindent
|
|
\textbf{Lane 1 (BLS).} $\sigma_{\mathrm{BLS}}^\star$ is a BLS12-381
|
|
aggregate over $\mathsf{subj}^\star$. Proof-of-possession on each
|
|
validator's $\mathsf{pchain\_validator\_root}$ entry rules out
|
|
rogue-key attacks~\cite{boneh2001short}. By EUF-CMA of BLS aggregate
|
|
signatures under co-CDH, a valid $\sigma_{\mathrm{BLS}}^\star$ implies
|
|
that each validator $v_i$ in the aggregator set
|
|
$S_{\mathrm{BLS}}^\star$ produced an individual BLS signature on
|
|
$\mathsf{subj}^\star$. Stake-weighting then gives
|
|
$\mathrm{stk}(S_{\mathrm{BLS}}^\star) \geq \tau S$. Forging without
|
|
$\tau$ stake costs $\epsilon_{\mathrm{BLS}}^{\mathrm{coCDH}}$.
|
|
|
|
\medskip\noindent
|
|
\textbf{Lane 2 (Corona).} $\sigma_{\mathrm{RT}}^\star$ is the
|
|
output of the two-round Corona signing protocol bound to
|
|
$\mathsf{qchain\_ceremony\_root}$ (i.e., the verification key produced
|
|
by the Q-Chain DKG). By the SUF-CMA proof of Corona under MLWE/MSIS,
|
|
a valid $\sigma_{\mathrm{RT}}^\star$ on $\mathsf{subj}^\star$ implies a
|
|
share set $S_{\mathrm{RT}}^\star$ with
|
|
$\mathrm{stk}(S_{\mathrm{RT}}^\star) \geq \tau S$. Forging costs at
|
|
most $\epsilon_{\mathrm{RT}}^{\mathrm{MLWE,MSIS}}$.
|
|
|
|
\medskip\noindent
|
|
\textbf{Lane 3 (Z-Chain Groth16 of ML-DSA).} $\pi_{\mathrm{ZK}}^\star$
|
|
proves that for the public-key vector committed by
|
|
$\mathsf{zchain\_vk\_root}$, there exist valid ML-DSA-65 signatures
|
|
$(\sigma_1^{\mathrm{ML}}, \ldots, \sigma_n^{\mathrm{ML}})$ on
|
|
$\mathsf{subj}^\star$. Knowledge-soundness in the AGM yields an
|
|
extractor $\mathcal{E}$ that recovers these signatures with
|
|
overwhelming probability: any deviation has advantage
|
|
$\epsilon_{\mathrm{ZK}}^{\mathrm{KEA}}$. Each extracted ML-DSA-65
|
|
signature is itself EUF-CMA under MLWE/MSIS, so for any uncorrupted
|
|
$v_i$ a valid extracted signature without $v_i$'s key costs
|
|
$\epsilon_{\mathrm{MLDSA}}^{\mathrm{MLWE,MSIS}}$ (with up to $n$ guessing
|
|
loss for which validator was framed).
|
|
|
|
\medskip\noindent
|
|
\textbf{Conjunction.} $\mathsf{Verify}$ is the AND of the three
|
|
predicates. An attacker who breaks fewer than three lanes still has
|
|
at least one lane verifying only with negligible probability. Hence
|
|
$\mathsf{Adv}^{\mathrm{forge}}_{\mathcal{A}_C}$ is upper-bounded by the
|
|
\emph{minimum} of the per-lane advantages, which is negligible.
|
|
|
|
\medskip\noindent
|
|
\textbf{Cross-lane independence.} The three bounds rely on three
|
|
disjoint problems: discrete log on BLS12-381, MLWE, MSIS. No known
|
|
reduction transfers a break of one to a break of another at the
|
|
parameter sets of Def.~\ref{def:assumptions}; this is exactly the
|
|
hedging argument of pq-finality-no-bls.tex \S3.2. Compromise of any
|
|
one of $\{\mathsf{pchain\_validator\_root}, \mathsf{qchain\_ceremony\_root},
|
|
\mathsf{zchain\_vk\_root}\}$ disables only the corresponding lane.
|
|
\end{proof}
|
|
|
|
%% ------------------------------------------------------------------
|
|
%% DISCHARGED 2026-07-02 (cryptographer audit of luxfi/consensus v1.35.16):
|
|
%% Cor.~\ref{cor:no-conflict} and Rmk.~\ref{rem:epoch-blind-slot} state
|
|
%% the FIXED design --- the vote-once slot is (chain_id, round)/height
|
|
%% alone (epoch-blind), the guard is durable and pruned strictly below
|
|
%% the finalised tip, and accept rejects sibling subtrees transitively.
|
|
%% Verified against shipped code: SlotKey{Height} (engine.go:2095),
|
|
%% strictly-below prune `k.Height < height` (engine.go:2190), durable
|
|
%% decided-height gate `height <= floor => refuse` (engine.go:2098-2104),
|
|
%% Accept-before-Reject in applyBranchFinalization. The durable-floor
|
|
%% machinery the corollary's premise relies on is now FORMALISED and the
|
|
%% no-double-finalization result proved standalone in
|
|
%% \S\ref{sec:nodoublefinal}.
|
|
%% ------------------------------------------------------------------
|
|
\begin{corollary}[No conflicting certificates]
|
|
\label{cor:no-conflict}
|
|
If $\mathcal{C}, \mathcal{C}'$ both verify on subjects $\mathsf{subj},
|
|
\mathsf{subj}'$ that share the per-height slot $(\mathsf{chain\_id},
|
|
\mathsf{round})$ but disagree on the chain-state roots, then
|
|
$\geq S/3$ stake is Byzantine. The slot is deliberately
|
|
\emph{epoch-blind}: $\mathsf{epoch}$ is bound inside $\mathsf{subj}$ for
|
|
verification and replay protection (Thm.~\ref{thm:replay}), but it is
|
|
\emph{not} part of the vote-once slot key.
|
|
\end{corollary}
|
|
|
|
\begin{proof}
|
|
By Lane~1, $\mathrm{stk}(S_{\mathrm{BLS}}) \geq \tau S$ and
|
|
$\mathrm{stk}(S_{\mathrm{BLS}}') \geq \tau S$. Stake-weighted quorum
|
|
intersection gives
|
|
$\mathrm{stk}(S_{\mathrm{BLS}} \cap S_{\mathrm{BLS}}') \geq (2\tau - 1) S
|
|
= S/3$. Each honest validator signs at most one subject in each
|
|
per-height slot $(\mathsf{chain\_id}, \mathsf{round})$: the accept path maintains a
|
|
\emph{durable} per-height vote-once guard that is pruned strictly below
|
|
the finalised tip --- never while a sibling at that height could still
|
|
be signed --- and rejects sibling subtrees transitively, so a decided
|
|
height's siblings are unsignable. Any validator in the intersection
|
|
would therefore have signed two distinct subjects at the same
|
|
$(\mathsf{chain\_id}, \mathsf{round})$, which is detectable
|
|
equivocation; if Byzantine stake is $< S/3$ this is impossible.
|
|
\end{proof}
|
|
|
|
\begin{remark}[The slot must not key on a proposer-chosen axis]
|
|
\label{rem:epoch-blind-slot}
|
|
Soundness of Cor.~\ref{cor:no-conflict} requires the vote-once slot to
|
|
be $(\mathsf{chain\_id}, \mathsf{round})$ alone. Folding a
|
|
proposer-influenced value --- e.g.\ an epoch derived from a
|
|
proposer-selected validator-set height --- \emph{into} the slot key
|
|
would let two honest siblings at one height carry distinct slots, so a
|
|
single honest validator could sign both without equivocating; this is
|
|
precisely the double-finalisation hazard. Epoch therefore lives in
|
|
$\mathsf{subj}$ (bound and verified) but never in the slot. A
|
|
conflicting certificate that is nonetheless observed is treated as a
|
|
fatal, halting event --- the BFT-safe response, since two verified
|
|
certificates at one height are irrefutable evidence of $\geq S/3$
|
|
Byzantine stake.
|
|
\end{remark}
|
|
|
|
%% ==================================================================
|
|
\section{Finality Admission: No Double-Finalization}
|
|
\label{sec:nodoublefinal}
|
|
%% ==================================================================
|
|
|
|
Corollary~\ref{cor:no-conflict} shows that two conflicting certificates
|
|
at one height imply $\geq S/3$ Byzantine stake \emph{given} its premise:
|
|
each honest validator signs at most one subject per per-height slot.
|
|
That premise is exactly what the height-10 devnet storm and the
|
|
1082814 mainnet fork broke. This section formalises the durable
|
|
\emph{decided-height frontier} that restores the premise
|
|
unconditionally --- including across a correlated rolling restart, the
|
|
window a purely in-memory guard leaves open --- and proves that an
|
|
observable double-finalization is unreachable below $S/3$ Byzantine
|
|
stake. The construction is the mechanical analog of avalanchego's
|
|
acceptance frontier (\texttt{topological.go}: a decided height's blocks
|
|
are permanently unsignable via the monotone last-accepted height plus
|
|
\texttt{rejectTransitively}), \emph{lifted onto the Quasar sign path}.
|
|
The canonical statements live in
|
|
\texttt{definitions/finality-definitions.tex}; we restate what the
|
|
proof needs.
|
|
|
|
\begin{definition}[Two finality authorities]
|
|
\label{def:nf-authorities}
|
|
A Lux chain runs two decision machines over one block DAG: the
|
|
\emph{acceptance} machine $\mathcal{A}$ (local preference/accept; admits
|
|
siblings and nondeterminism; never irreversible alone) and the
|
|
\emph{certified-finality} map $\mathcal{F} = \mathsf{byHeight}$, where
|
|
$\mathsf{byHeight}[H]$ is the canonical execution commitment finalized
|
|
at $H$ and is written \emph{only} by folding a $\mathsf{Prism}$-passing
|
|
quorum certificate over the frontier-extending branch (or the bootstrap
|
|
frontier-trust path). The 1082814 break was a path other than a
|
|
verified-QC fold advancing $\mathcal{F}$; the fix makes the verified-QC
|
|
fold its sole writer.
|
|
\end{definition}
|
|
|
|
\begin{definition}[Durable decided-floor]
|
|
\label{def:nf-floor}
|
|
Let $\mathsf{FinHeight}$ be the certified height ($(0,\bot)$ before the
|
|
first cert; the $\mathsf{vm.LastAccepted}$ recovery hint is
|
|
non-authoritative and never sets it --- \emph{PART-A}). Define
|
|
\[
|
|
\varphi \;=\; \max\!\bigl(
|
|
\mathsf{FinHeight},\;
|
|
\mathsf{fsync}(\mathsf{finalizedThrough}),\;
|
|
\mathsf{height}(\mathsf{vm.LastAccepted})\bigr).
|
|
\]
|
|
$\mathsf{finalizedThrough}$ is a monotone height persisted (fsync'd)
|
|
in the vote-guard file at each finalize. $\varphi$ is monotone,
|
|
restart-surviving, and (Lemma~\ref{lem:nf-lowerbound}) a sound lower
|
|
bound on the network's decided height. \textbf{Sign-gate only:}
|
|
$\varphi$ is read by the sign gate and never writes $\mathsf{byHeight}$,
|
|
$\mathsf{FinHeight}$, or the equivocation index, and reads only the
|
|
hint's \emph{height}, never its identity.
|
|
\end{definition}
|
|
|
|
\begin{definition}[Sign admissibility]
|
|
\label{def:nf-admissible}
|
|
An honest validator binds its single accept-signature at height $H$ on
|
|
canonical commitment $C$ only if (i)~$H > \varphi$ (decided-height
|
|
gate), and (ii)~the per-height slot at $H$ is empty or already bound to
|
|
$C$ (idempotent); a different $C$ at an undecided $H$ is refused on the
|
|
single-phase path, or governed by the round-scoped lock rule
|
|
(one precommit per $(H,\mathrm{round})$; cross-round migration only on a
|
|
proof-of-lock) on the view-change path.
|
|
\end{definition}
|
|
|
|
\begin{definition}[Observable double-finalization]
|
|
\label{def:nf-double}
|
|
Two certificates $\mathcal{C}_A, \mathcal{C}_B$ that both verify against
|
|
the active validator set at height $H$'s epoch with canonical
|
|
commitments $C_A \ne C_B$. Certs are keyed on the \emph{canonical
|
|
execution commitment}, so two envelopes wrapping the same $C$ are a
|
|
duplicate alias, never this fault (Rmk.~\ref{rem:nf-canonical}).
|
|
\end{definition}
|
|
|
|
\begin{lemma}[Floor soundness]
|
|
\label{lem:nf-lowerbound}
|
|
$\varphi \le \mathsf{FinHeight}_{\mathrm{network}}$ at all times.
|
|
\end{lemma}
|
|
\begin{proof}
|
|
Each argument of the $\max$ is a height the network has finalized.
|
|
$\mathsf{FinHeight}$ is certified by definition.
|
|
$\mathsf{finalizedThrough}$ is written only by the finalizer
|
|
$\mathsf{acceptWithCertCore}$ after a $\mathsf{Prism}$-passing cert
|
|
commits, and only up to the height the VM actually applied (the
|
|
fail-closed accept: finality advances only to $\mathsf{highestAccepted}$,
|
|
never past the VM's state). $\mathsf{vm.LastAccepted}$ is the node's
|
|
applied head, and a block is VM-applied only inside that same finalizer;
|
|
a state-sync import lands only on an already-finalized frontier. Hence
|
|
every argument is $\le \mathsf{FinHeight}_{\mathrm{network}}$, so is
|
|
their maximum. $\varphi$ therefore never refuses signing at a height the
|
|
network has \emph{not} decided --- it costs no liveness.
|
|
\end{proof}
|
|
|
|
\begin{lemma}[No-window durability]
|
|
\label{lem:nf-nowindow}
|
|
For every height $H$ and at every instant on an honest node, either the
|
|
in-memory slot at $H$ is present, or $\varphi \ge H$ (or both). There is
|
|
no instant at which both are absent.
|
|
\end{lemma}
|
|
\begin{proof}
|
|
The slot at $H$ is created when the node first signs at $H$ and is
|
|
deleted only by $\mathsf{pruneCommittedSlotsBelow}(h)$ with the
|
|
\emph{strict} test $k.\mathsf{Height} < h$. That prune runs inside the
|
|
finalizer, in the same critical section (\texttt{slotMu}) that first
|
|
advances $\varphi \gets \max(\varphi, h)$ and persists both in one
|
|
fsync'd write. So the slot at $H$ can be removed only by a prune with
|
|
$h > H$, and any such prune has already set $\varphi \ge h > H$.
|
|
Conversely, before $H$ is ever finalized the slot persists (no prune
|
|
with $h>H$ has run). The two conditions therefore cover every instant;
|
|
the removal of the slot and the raising of the floor are atomic on disk,
|
|
so a crash between them is impossible. In particular the just-finalized
|
|
tip's own slot is \emph{retained} (strict, not inclusive) until a higher
|
|
height finalizes --- closing precisely the inclusive-prune window that
|
|
admitted the height-10 storm's late sibling.
|
|
\end{proof}
|
|
|
|
\begin{lemma}[Honest one-canonical-per-height, durable]
|
|
\label{lem:nf-oneper}
|
|
An honest validator obeying Def.~\ref{def:nf-admissible} binds its
|
|
accept-signature to at most one canonical commitment at any height $H$,
|
|
and this holds across process restarts.
|
|
\end{lemma}
|
|
\begin{proof}
|
|
Fix $H$ and suppose the validator has bound $C$ at $H$. Consider any
|
|
later sign request $(H, C')$ with $C' \ne C$. By
|
|
Lemma~\ref{lem:nf-nowindow} at least one of two cases holds. \emph{(a)
|
|
The slot at $H$ is present:} it is bound to $C$, so admissibility
|
|
clause~(ii) refuses $C'$ on the single-phase path; on the view-change
|
|
path the lock rule forbids a second precommit at the locked round and
|
|
permits migration only on a proof-of-lock for $C'$, which requires
|
|
$\alpha$ honest-majority prevotes for $C'$ and is itself unique per
|
|
round (so it cannot coexist with a POL for $C$ --- the standard
|
|
Tendermint lock/POL argument, sound when $2\alpha - n > f$). \emph{(b)
|
|
$\varphi \ge H$:} clause~(i) refuses outright. Durability: $\varphi$ is
|
|
reconstructed at boot from the fsync'd $\mathsf{finalizedThrough}$ and
|
|
$\mathsf{vm.LastAccepted}$ before any signing goroutine starts, so a
|
|
restart cannot reset it below a height already decided (the correlated
|
|
rolling-restart window that a memory-only guard leaves open). Hence at
|
|
most one canonical is ever signed at $H$.
|
|
\end{proof}
|
|
|
|
\begin{theorem}[No double-finalization]
|
|
\label{thm:nodoublefinal}
|
|
Assume the accept quorum requires signer stake $\ge \tau S$ with
|
|
$\tau \ge 2/3$, the active validator set at $H$'s epoch is fixed by the
|
|
epoch-bound set-root cross-checked on every incoming cert, and Byzantine
|
|
stake is $< S/3$. If every honest validator obeys
|
|
Def.~\ref{def:nf-admissible} with the durable floor of
|
|
Def.~\ref{def:nf-floor}, then no observable double-finalization
|
|
(Def.~\ref{def:nf-double}) can occur at any height.
|
|
\end{theorem}
|
|
\begin{proof}
|
|
Suppose two certs $\mathcal{C}_A, \mathcal{C}_B$ exist at height $H$ with
|
|
$C_A \ne C_B$, both verifying against the set-root of $H$'s epoch. Since
|
|
both fold the same epoch set-root (enforced by the incoming-cert
|
|
cross-check: a cert whose set-root differs from the one the node
|
|
recomputes at the block's P-chain epoch height is dropped), the two
|
|
signer sets $S_A, S_B$ are drawn from the \emph{same} validator set of
|
|
total stake $S$. Each has stake $\ge \tau S$, so by stake-weighted
|
|
quorum intersection
|
|
$\mathrm{stk}(S_A \cap S_B) \ge (2\tau - 1)S \ge S/3$. As Byzantine
|
|
stake is $< S/3$, the intersection contains an \emph{honest} validator
|
|
$v$, which then signed both $C_A$ and $C_B$ at height $H$. This
|
|
contradicts Lemma~\ref{lem:nf-oneper}. Hence no such pair exists.
|
|
Equivalently: any observed conflicting cert pair is irrefutable evidence
|
|
of $\ge S/3$ Byzantine stake --- now \emph{unconditionally}, without the
|
|
``healthy sequential net'' caveat the pre-fix guard silently required,
|
|
because Lemmas~\ref{lem:nf-nowindow}--\ref{lem:nf-oneper} hold under the
|
|
contested-finality storm and across restarts.
|
|
\end{proof}
|
|
|
|
\begin{corollary}[PART-A non-interference]
|
|
\label{cor:nf-parta}
|
|
The durable floor never advances $\mathcal{F}$: for all reachable
|
|
states, $\mathsf{FinHeight} = (0,\bot)$ until the first
|
|
$\mathsf{Prism}$-passing cert folds, and thereafter $\mathsf{byHeight}$
|
|
is written only by the verified-QC fold.
|
|
\end{corollary}
|
|
\begin{proof}
|
|
By Def.~\ref{def:nf-floor} the sign gate is a pure reader of $\varphi$;
|
|
its only side effects are refusing a signature and (on a first bind)
|
|
persisting the per-height slot --- neither touches $\mathsf{byHeight}$,
|
|
$\mathsf{FinHeight}$, or the equivocation index. The floor reads the
|
|
recovery hint's height only, never its identity, so it cannot synthesise
|
|
a $\mathsf{byHeight}$ entry. Thus the fail-safe can only ever
|
|
\emph{refuse more signing}; it cannot manufacture finality. This is the
|
|
incident-1082814 PART-A invariant, preserved.
|
|
\end{proof}
|
|
|
|
\begin{remark}[Canonical keying]
|
|
\label{rem:nf-canonical}
|
|
Both certs in Def.~\ref{def:nf-double} are compared on their inner
|
|
execution commitment $C = \mathsf{CanonicalID}$, not the proposervm
|
|
outer envelope id. A block with no inner commitment (a bare,
|
|
non-wrapped VM block) degrades to its own outer id, so the scheme is
|
|
inert there and reduces exactly to pre-fix outer-id behaviour. Two
|
|
outer envelopes wrapping the same $C$ (the literal 1082814 evidence:
|
|
$A=2U2pR3D$, $B=wDMUyGy$ both wrapping inner $5DEgMudU$) are a
|
|
\emph{duplicate alias}, and the equivocation detector --- which now runs
|
|
the full verify-before-slash predicate before recording any evidence ---
|
|
never fires on them; only a verified cert over a \emph{different} $C$ is
|
|
recorded as a $\mathsf{DoubleVote}$, and the node rejects the second
|
|
cert and keeps running rather than halting the fleet.
|
|
\end{remark}
|
|
|
|
\begin{remark}[Empirical validation]
|
|
\label{rem:nf-storm}
|
|
The construction was validated on a 5-node contested-finality storm
|
|
(node v1.34.6, consensus v1.35.16): concurrent multi-proposer building
|
|
drove certified finality past the height-10 fault point to height~76
|
|
with exactly one canonical commitment per height fleet-wide, zero
|
|
$\mathsf{reportCertEquivocation}$ events, byte-identical 5/5 convergence,
|
|
and a DEX $\mathtt{0x9999}$ settlement fill at block~74. A
|
|
rolling-restart \emph{mid-storm} reconverged cleanly, exercising the
|
|
durable cross-restart floor of Lemma~\ref{lem:nf-oneper}. The in-repo
|
|
regression is
|
|
\texttt{engine/chain/finalize\_resign\_test.go}
|
|
(\texttt{TestFinalizeThenResign\_DecidedHeightIsUnsignable}), which fails
|
|
on the inclusive-prune / no-gate code and passes on the shipped fix,
|
|
plus the \texttt{storm\_convergence\_test.go} safety assertion with the
|
|
former \texttt{-race} skip removed.
|
|
\end{remark}
|
|
|
|
%% ==================================================================
|
|
\section{Parallel Lane Liveness}
|
|
\label{sec:parallel}
|
|
%% ==================================================================
|
|
|
|
\begin{theorem}[Parallel-lane liveness]
|
|
\label{thm:parallel}
|
|
The three lanes of QuasarCert can be aggregated independently and in
|
|
parallel. Specifically, let $T_{\mathrm{BLS}}, T_{\mathrm{RT}},
|
|
T_{\mathrm{ZK}}$ be the wall-clock durations of the three lane
|
|
aggregations under partial synchrony with bounded delay $\Delta$ and
|
|
honest stake $\geq \tau$. Then there exists an honest schedule that
|
|
produces $\mathcal{C}$ in time
|
|
\[
|
|
T_{\mathrm{cert}}
|
|
\;\leq\;
|
|
\max\!\bigl(T_{\mathrm{BLS}},\; T_{\mathrm{RT}},\; T_{\mathrm{ZK}}\bigr)
|
|
+ \Delta.
|
|
\]
|
|
\end{theorem}
|
|
|
|
\begin{proof}[Proof sketch]
|
|
The three aggregations communicate only through the shared
|
|
$\mathsf{subj}$. Once $\mathsf{subj}$ is fixed for a round (which
|
|
requires only the chain-state roots, all available at round start),
|
|
each lane runs a separate aggregation network:
|
|
BLS aggregator on the P-Chain validator network;
|
|
Corona two-round protocol on the Q-Chain DKG mesh;
|
|
Z-Chain Groth16 prover (epoch-amortised, asynchronous to block
|
|
production). Honest validators contribute to all lanes they hold keys
|
|
for; under stake $\geq \tau$ each lane independently completes within
|
|
its own bound. The certificate is finalised when the last lane lands;
|
|
the extra $\Delta$ accounts for one round of network propagation to
|
|
combine the three artifacts.
|
|
|
|
\medskip\noindent
|
|
The Z-Chain proof, in particular, is generated by the Z-Chain prover
|
|
service over an epoch window and lands asynchronously: the epoch's
|
|
$\pi_{\mathrm{ZK}}$ becomes part of every QuasarCert in that epoch
|
|
once posted. This is the LP-020 Section~6.4 ``epoch ZK landing''
|
|
mechanism and does not block per-block finality of the BLS+Corona
|
|
core.
|
|
\end{proof}
|
|
|
|
%% ==================================================================
|
|
\section{Post-Quantum Safety}
|
|
\label{sec:pq}
|
|
%% ==================================================================
|
|
|
|
\begin{theorem}[Post-quantum safety]
|
|
\label{thm:pq}
|
|
Define the standalone PQ predicate
|
|
$\mathsf{VerifyPQ}(\mathcal{C}) = \mathsf{RT.Verify}(\sigma_{\mathrm{RT}})
|
|
\land \mathsf{ZK.Verify}(\pi_{\mathrm{ZK}})$. Against a quantum
|
|
adversary $\mathcal{A}_Q$,
|
|
\[
|
|
\mathsf{Adv}^{\mathsf{VerifyPQ}}_{\mathcal{A}_Q}
|
|
\;\leq\;
|
|
2 \cdot \max\!\bigl(
|
|
\epsilon_{\mathrm{MLWE}}^{Q},\;
|
|
\epsilon_{\mathrm{MSIS}}^{Q}
|
|
\bigr)
|
|
\;=\; \mathsf{negl}(\lambda).
|
|
\]
|
|
That is: even if $\mathcal{A}_Q$ trivially breaks BLS via Shor, the
|
|
PQ-only predicate remains sound.
|
|
\end{theorem}
|
|
|
|
\begin{proof}
|
|
$\mathcal{A}_Q$ must produce $\sigma_{\mathrm{RT}}^\star$ that verifies
|
|
against $\mathsf{qchain\_ceremony\_root}$ and $\pi_{\mathrm{ZK}}^\star$
|
|
that verifies against $\mathsf{zchain\_vk\_root}$.
|
|
|
|
\medskip\noindent
|
|
\textit{Forging $\sigma_{\mathrm{RT}}$ quantumly} requires breaking
|
|
MLWE or MSIS at the Corona dimension $d = 2048$, modulus
|
|
$\log_2 q = 48$ (App.~E). The best known quantum cost is BDGL sieving
|
|
with Grover speedup, giving $T_{\mathrm{quantum}} \geq 2^{130}$
|
|
operations.
|
|
|
|
\medskip\noindent
|
|
\textit{Forging $\pi_{\mathrm{ZK}}$ quantumly} is delicate: Groth16's
|
|
classical pairing-based knowledge-soundness reduces to discrete log on
|
|
BLS12-381, which is broken by Shor. In the post-quantum setting we
|
|
fall back to the soundness of the underlying ML-DSA-65 signatures it
|
|
proves. A quantum forger of $\pi_{\mathrm{ZK}}$ either (a) extracts
|
|
no real witness and yet the proof verifies (breaks knowledge-soundness
|
|
in the AGM, classical only -- not assumed against $\mathcal{A}_Q$), or
|
|
(b) extracts ML-DSA-65 signatures the adversary did not legitimately
|
|
hold. Case (b) costs $\epsilon_{\mathrm{MLDSA}}^{Q} \geq 2^{128}$ at
|
|
ML-DSA-65 (NIST Cat.~3) per signature, with at most $n$ guessing loss.
|
|
The standalone-PQ guarantee for $\pi_{\mathrm{ZK}}$ thus reduces to the
|
|
PQ unforgeability of ML-DSA-65 signatures committed by
|
|
$\mathsf{zchain\_vk\_root}$.
|
|
|
|
\medskip\noindent
|
|
A guessing reduction picks the targeted lane with probability $1/2$ and
|
|
inherits the corresponding bound; combined with $\mathsf{negl}$ per
|
|
lane this gives the stated $\mathsf{Adv}$.
|
|
|
|
\medskip\noindent
|
|
\textbf{Future-work caveat.} Replacing Groth16 with a STARK-of-pairing
|
|
or hash-based SNARK eliminates the dependence on classical
|
|
knowledge-soundness in $\pi_{\mathrm{ZK}}$. This is tracked as the
|
|
``post-quantum SNARK swap'' in LP-020 \S11 and is out of scope for 3.0
|
|
final.
|
|
\end{proof}
|
|
|
|
\begin{remark}[Combined three-lane PQ guarantee]
|
|
The full QuasarCert remains sound against $\mathcal{A}_Q$ as long as
|
|
\emph{at least one} of $\{$Corona, ML-DSA path$\}$ survives.
|
|
Equivalently: the survival predicate is ``1 of 2 PQ pillars''. This
|
|
matches the pq-finality-no-bls.tex Proposition (Hedged PQ security)
|
|
under the conjunction ``MLWE hard $\lor$ MSIS hard,'' and is the
|
|
operative claim for the 2025-12-25 activation.
|
|
\end{remark}
|
|
|
|
%% ==================================================================
|
|
\section{Subject-Binding Replay Protection}
|
|
\label{sec:replay}
|
|
%% ==================================================================
|
|
|
|
This section is new in 3.0 final. The result formalises why the
|
|
\emph{certificate subject} (Def.~\ref{def:subject}) makes a valid
|
|
QuasarCert from epoch $e_1$ unusable at any other epoch
|
|
$e_2 \neq e_1$.
|
|
|
|
\begin{theorem}[Subject-binding replay protection]
|
|
\label{thm:replay}
|
|
Let $\mathcal{C}$ be a QuasarCert that verifies for subject
|
|
$\mathsf{subj}_1$ at epoch $e_1$. Let $\mathsf{subj}_2$ differ from
|
|
$\mathsf{subj}_1$ in any field of Def.~\ref{def:subject}. Then the
|
|
probability that $\mathcal{C}$ also verifies for $\mathsf{subj}_2$
|
|
under the assumptions of Def.~\ref{def:assumptions} is
|
|
$\mathsf{negl}(\lambda)$. In particular, the cert cannot be replayed
|
|
across distinct $\mathsf{epoch}$ values (or distinct
|
|
$\mathsf{chain\_id}$, $\mathsf{round}$, $\mathsf{mode}$, or any chain
|
|
root in the subject).
|
|
\end{theorem}
|
|
|
|
\begin{proof}
|
|
We show that each lane is collision-resistant on the subject input.
|
|
|
|
\medskip\noindent
|
|
\textbf{BLS.} $\sigma_{\mathrm{BLS}}$ is computed as
|
|
$\prod_i H_{\mathbb{G}_2}(\mathsf{subj})^{sk_i}$ where
|
|
$H_{\mathbb{G}_2}$ is a hash-to-curve. If
|
|
$\sigma_{\mathrm{BLS}}$ verifies for both $\mathsf{subj}_1$ and
|
|
$\mathsf{subj}_2 \neq \mathsf{subj}_1$, then there exists
|
|
$\sigma_{\mathrm{BLS}}$ such that
|
|
$e(\sigma_{\mathrm{BLS}}, g_1) = e(H_{\mathbb{G}_2}(\mathsf{subj}_1),
|
|
\mathsf{apk}) = e(H_{\mathbb{G}_2}(\mathsf{subj}_2), \mathsf{apk})$.
|
|
The pairing equality forces
|
|
$H_{\mathbb{G}_2}(\mathsf{subj}_1) = H_{\mathbb{G}_2}(\mathsf{subj}_2)$
|
|
(in $\mathbb{G}_2$), which is a hash-to-curve collision and hence
|
|
negligible.
|
|
|
|
\medskip\noindent
|
|
\textbf{Corona.} The Corona challenge is
|
|
$c = H(\mathbf{w}, \mathsf{subj})$. If $\sigma_{\mathrm{RT}}$ verifies
|
|
for both subjects with the same commitment $\mathbf{w}$, then
|
|
$H(\mathbf{w}, \mathsf{subj}_1) = H(\mathbf{w}, \mathsf{subj}_2)$,
|
|
again a hash collision. If the commitments differ, this is a fresh
|
|
forgery and reduces to MLWE/MSIS.
|
|
|
|
\medskip\noindent
|
|
\textbf{Groth16.} $\pi_{\mathrm{ZK}}$ encodes $\mathsf{subj}$ as a
|
|
public input bound at SRS preprocessing. Verifying the same proof
|
|
against a different public input with non-negligible probability
|
|
contradicts knowledge-soundness in the AGM (the verifier equation
|
|
$e(A, B) = e(\alpha, \beta) \cdot e(\sum_i \mathsf{subj}[i] \cdot
|
|
\mathsf{IC}_i, \gamma) \cdot e(C, \delta)$ is linear in
|
|
$\mathsf{subj}$ and pinning a single proof to two distinct linear
|
|
combinations is a collision in the AGM extractor).
|
|
|
|
\medskip\noindent
|
|
Each lane's replay probability is therefore $\mathsf{negl}(\lambda)$;
|
|
since $\mathsf{Verify}$ is the AND of the three, replay across
|
|
distinct subjects has at most the minimum of these advantages, which
|
|
remains negligible.
|
|
\end{proof}
|
|
|
|
\begin{remark}[Concrete fields blocked]
|
|
Because $\mathsf{subj}$ contains $\mathsf{epoch}$, $\mathsf{round}$,
|
|
and $\mathsf{chain\_id}$ explicitly, replay across epochs, across
|
|
rounds within an epoch, or across chains (e.g., devnet to mainnet) is
|
|
ruled out individually. The chain-root fields
|
|
$(P, Q, Z, A, B, M, F)$ further block replay against any state
|
|
divergence: even if two distinct epochs share epoch number (impossible
|
|
by P-Chain rules but treated formally), the $A/B/F$ roots disagree as
|
|
soon as any inclusion-list transaction differs.
|
|
\end{remark}
|
|
|
|
%% ==================================================================
|
|
\section{GPU Verifier Refinement (Informal)}
|
|
\label{sec:gpu}
|
|
%% ==================================================================
|
|
|
|
LP-132 specifies the QuasarGPU adapter. Its core entry point is
|
|
\texttt{drain\_cert\_lane(lane, batch)} which produces a verdict
|
|
$\{\mathsf{accept}, \mathsf{reject}, \mathsf{abstain}\}$ for each cert
|
|
in $\mathsf{batch}$. The CPU reference is a sequential loop calling
|
|
the per-lane verifier.
|
|
|
|
\paragraph{Cross-backend equivalence (LP-132 invariant).}
|
|
Let $V_{\mathrm{cpu}}$ and $V_{\mathrm{gpu}}$ denote the verdict
|
|
functions. LP-132 requires
|
|
\[
|
|
V_{\mathrm{gpu}}(\pi(\mathsf{batch})) = \pi(V_{\mathrm{cpu}}(\mathsf{batch}))
|
|
\quad\text{for any canonical-tx-index permutation } \pi.
|
|
\]
|
|
That is, the GPU implementation differs from CPU only by deterministic
|
|
reordering. The reordering is induced by per-warp scheduling, which
|
|
the adapter resolves at output by sorting on the canonical tx index.
|
|
|
|
\paragraph{Argument.}
|
|
Each lane verifier is a pure function on
|
|
$(\mathsf{subj}, \text{lane artifact})$ with no shared state across
|
|
batch elements. GPU parallelism replicates this function across
|
|
threads with thread-local memory; the only global state read is the
|
|
verification key roots (read-only). Hence each per-element verdict is
|
|
identical to the CPU verdict. The output ordering is canonicalised by
|
|
sorting on the tx index, eliminating the only nondeterminism. By
|
|
inspection of the LP-132 reference loop, the GPU adapter produces
|
|
verdict-equivalent output up to permutation, and the canonical sort
|
|
removes the permutation.
|
|
|
|
\paragraph{What this is not.}
|
|
This is an \emph{informal} argument, not a machine-checked proof. A
|
|
machine-checked refinement would require reasoning about CUDA / HIP
|
|
memory models and is tracked in the \texttt{lean/Consensus/} GPU
|
|
refinement task. The cross-backend differential test in LP-132
|
|
\texttt{tests/cross\_backend\_test.go} provides empirical evidence at
|
|
the engineering boundary.
|
|
|
|
%% ==================================================================
|
|
\section{Pulsar Key-Era Lifecycle Lemmas}
|
|
\label{sec:lifecycle}
|
|
%% ==================================================================
|
|
|
|
This section formalises the lifecycle properties of LP-073 Pulsar that
|
|
sit \emph{above} the per-signature SUF-CMA argument. The Corona kernel
|
|
of Pulsar is treated as an oracle that produces a signature
|
|
$\sigma_{\mathrm{RT}}$ verifying under
|
|
$\mathsf{GK} = (\mathbf{A}, \tilde{\mathbf{b}})$ given $\geq t$ shares
|
|
$\{\mathbf{s}_i\}$ that satisfy the Lagrange-recombination identity for
|
|
the master secret $\mathbf{s}$. We prove four lemmas that together
|
|
formalise the ``persistent body, rotating beam'' property of a key era.
|
|
|
|
\begin{definition}[Pulsar share state]
|
|
\label{def:share-state}
|
|
A Pulsar share state at validator $v$ is a tuple
|
|
\[
|
|
\pi_v = \bigl(
|
|
\eta,\; g,\; r,\;
|
|
V,\; t,\;
|
|
\mathbf{A},\; \tilde{\mathbf{b}},\;
|
|
\mathbf{s}_v,\; \boldsymbol\lambda_v,\;
|
|
\mathsf{seeds}_v,\; \mathsf{macKeys}_v
|
|
\bigr)
|
|
\]
|
|
where $\eta \in \mathbb{N}$ is the \emph{KeyEraID}, $g \in \mathbb{N}$
|
|
the \emph{Generation}, $r \in \mathbb{N}$ the \emph{RollbackFrom}
|
|
counter ($r = 0$ on forward transitions),
|
|
$V \subseteq \mathcal{V}$ the active validator subset of size $|V| = K$,
|
|
$t$ the threshold, $\mathbf{A} \in R_q^{m_{\mathrm{pk}} \times
|
|
n_{\mathrm{vec}}}$ and $\tilde{\mathbf{b}} \in R_\xi^{m_{\mathrm{pk}}}$
|
|
the persistent group-key components, $\mathbf{s}_v$ the share assigned
|
|
to $v$, $\boldsymbol\lambda_v$ the precomputed Lagrange coefficient for
|
|
$v$ in $V$, and $\mathsf{seeds}_v, \mathsf{macKeys}_v$ the pairwise PRF
|
|
seeds and BLAKE3 MAC keys for $v$ vs.\ every $w \in V \setminus \{v\}$.
|
|
\end{definition}
|
|
|
|
\begin{definition}[GroupKey hash]
|
|
\label{def:gkh}
|
|
The \emph{GroupKey hash} $\mathsf{GKH}(\pi_v)$ is the 32-byte digest
|
|
\[
|
|
\mathsf{GKH}(\pi_v) = \mathsf{BLAKE3}\bigl(
|
|
\mathsf{WriteTo}(\mathbf{A}) \,\|\,
|
|
\mathsf{WriteTo}(\tilde{\mathbf{b}})
|
|
\bigr)[:32].
|
|
\]
|
|
$\mathsf{WriteTo}$ is the LP-073 \S4 wire serialisation: little-endian
|
|
\texttt{uint64} coefficient stream with 8/16-byte length prefixes for
|
|
$\mathsf{Vector}$/$\mathsf{Matrix}$. Two share states $\pi_v, \pi_w$
|
|
\emph{share a GroupKey} iff $\mathsf{GKH}(\pi_v) = \mathsf{GKH}(\pi_w)$.
|
|
\end{definition}
|
|
|
|
\begin{definition}[Lifecycle transitions]
|
|
\label{def:transitions}
|
|
Let $\Pi$ denote a global Pulsar state $(\pi_v)_{v \in V}$. We
|
|
distinguish three transitions:
|
|
\begin{itemize}[nosep]
|
|
\item \textbf{Refresh} ($\Pi \xrightarrow{\mathrm{Refresh}} \Pi'$):
|
|
HJKY97 zero-polynomial proactive refresh, same $V, t$, same
|
|
$(\mathbf{A}, \tilde{\mathbf{b}})$, share distribution rotates.
|
|
\item \textbf{Reshare} ($\Pi \xrightarrow{\mathrm{Reshare}(V', t')} \Pi'$):
|
|
Desmedt--Jajodia97 redistribution to validator subset $V'$ with
|
|
threshold $t'$; same $(\mathbf{A}, \tilde{\mathbf{b}})$.
|
|
\item \textbf{Reanchor} ($\Pi \xrightarrow{\mathrm{Reanchor}} \Pi'$):
|
|
fresh ceremony or DKG produces a new $(\mathbf{A}', \tilde{\mathbf{b}}')$
|
|
and bumps $\eta$.
|
|
\end{itemize}
|
|
\end{definition}
|
|
|
|
\begin{lemma}[Generation monotonicity]
|
|
\label{lem:gen-mono}
|
|
For every Pulsar transition $\Pi \to \Pi'$ at fixed $\eta$ and any
|
|
$v \in V \cap V'$, $g(\pi'_v) = g(\pi_v) + 1$.
|
|
\end{lemma}
|
|
|
|
\begin{proof}
|
|
The LSS coordinator (LP-073~\S9 (LSS-Pulsar)) advances $g$ by one
|
|
on each successful Refresh or Reshare. Failed activation triggers
|
|
\textsc{Rollback}; we treat \textsc{Rollback}$(g_{\mathrm{target}})$ as
|
|
a separate transition $\Pi \to \Pi'$ for which the post-state has
|
|
$g(\pi'_v) = g(\pi_v) + 1$ \emph{and} $r(\pi'_v) = g_{\mathrm{target}}$.
|
|
This preserves monotonicity --- $g$ is bumped on every transition,
|
|
including reverts --- while marking lineage via $r$. The activation
|
|
certificate (Theorem~\ref{thm:activation-soundness} below) carries
|
|
$g$ as an explicit field, so any verifier can audit monotonicity from
|
|
the on-chain record. The Lean encoding of this property appears as
|
|
\texttt{reshare\_threshold\_maintained} and the implicit chain of
|
|
generations in \texttt{Crypto.Threshold.Reshare} of the canonical
|
|
proof tree at \texttt{lean/Crypto/Threshold/Reshare.lean}.
|
|
\end{proof}
|
|
|
|
\begin{lemma}[KeyEraID stability across Reshare]
|
|
\label{lem:eta-stable}
|
|
For every $\Pi \xrightarrow{\mathrm{Reshare}(V', t')} \Pi'$ and every
|
|
$v \in V'$, $\eta(\pi'_v) = \eta(\pi_v)$ for any $v \in V \cap V'$
|
|
(or $\eta(\pi_v)$ inherited from the launch transition for new
|
|
$v \in V' \setminus V$). $\eta$ bumps only at Reanchor.
|
|
\end{lemma}
|
|
|
|
\begin{proof}
|
|
Reshare carries $(\mathbf{A}, \tilde{\mathbf{b}})$ across by
|
|
construction (Desmedt--Jajodia identity, Lemma~\ref{lem:gk-identical}
|
|
below); $\eta$ is the chain-state pointer to the GroupKey lineage and
|
|
is updated only when the underlying $(\mathbf{A}, \tilde{\mathbf{b}})$
|
|
changes, i.e., at Reanchor. The LSS adapter contract
|
|
(LP-073~\S9 (LSS-Pulsar).3) explicitly preserves $\eta$ across
|
|
the call \texttt{DynamicResharePulsar}; the LP-073 acceptance test
|
|
\texttt{TestKeyEraIDPreservedAcrossReshare}
|
|
(\texttt{threshold/protocols/lss/lss\_pulsar\_test.go}) verifies this
|
|
property at the bytes-on-disk level for the Go canonical.
|
|
\end{proof}
|
|
|
|
\begin{lemma}[GroupKey byte-identity across Refresh and Reshare]
|
|
\label{lem:gk-identical}
|
|
For every $\Pi \to \Pi'$ that is either Refresh or
|
|
$\mathrm{Reshare}(V', t')$, and any $v \in V'$,
|
|
\[
|
|
\mathsf{GKH}(\pi'_v) = \mathsf{GKH}(\pi_w)
|
|
\quad \forall w \in V \cap V'.
|
|
\]
|
|
That is, the BLAKE3 digest of the wire-serialised
|
|
$(\mathbf{A}, \tilde{\mathbf{b}})$ is identical pre- and post-transition,
|
|
not merely structurally equal.
|
|
\end{lemma}
|
|
|
|
\begin{proof}
|
|
Refresh and Reshare update only the share polynomial; neither alters
|
|
the public matrix $\mathbf{A}$ nor the rounded public-key vector
|
|
$\tilde{\mathbf{b}}$. We verify the Lagrange-recombination identity
|
|
that underwrites this preservation. Let $f(x) \in R_q[X]$ be the
|
|
old-set sharing polynomial with $f(0) = \mathbf{s}$ and
|
|
$f(\alpha_v) = \mathbf{s}_v$ for $v \in V$. After
|
|
$\mathrm{Reshare}(V', t')$, the new polynomial is constructed as
|
|
\[
|
|
G(x) = \sum_{i \in Q} \lambda^Q_i(0) \cdot g_i(x),
|
|
\qquad g_i(0) = \mathbf{s}_i,\; \deg g_i = t' - 1,
|
|
\]
|
|
where $Q \subseteq V$ is a qualified old subset of size
|
|
$\geq t_{\mathrm{old}}$ and $\lambda^Q_i(0)$ are the Lagrange
|
|
coefficients of $Q$ evaluated at $0$. Then
|
|
\begin{align}
|
|
G(0) \;=\; \sum_{i \in Q} \lambda^Q_i(0) \cdot g_i(0)
|
|
\;=\; \sum_{i \in Q} \lambda^Q_i(0) \cdot \mathbf{s}_i
|
|
\;=\; \sum_{i \in Q} \lambda^Q_i(0) \cdot f(\alpha_i)
|
|
\;=\; f(0)
|
|
\;=\; \mathbf{s}, \label{eq:lagrange}
|
|
\end{align}
|
|
where the penultimate equality is the standard Lagrange interpolation
|
|
identity over $R_q$, applied componentwise to the polynomial
|
|
coefficients. Hence the master secret $\mathbf{s}$ is preserved, the
|
|
LWE error $\mathbf{e}$ is unchanged (it was sampled at genesis to form
|
|
$\tilde{\mathbf{b}}$ and erased with the dealer state; signers only
|
|
need shares of $\mathbf{s}$, never $\mathbf{e}$), and the public-key
|
|
vector $\tilde{\mathbf{b}} = \lfloor \mathbf{A} \mathbf{s} +
|
|
\mathbf{e} \rceil_\xi$ remains unchanged because both
|
|
$(\mathbf{A}, \mathbf{s}, \mathbf{e})$ remain unchanged.
|
|
$\mathsf{WriteTo}$ is a deterministic byte function of
|
|
$(\mathbf{A}, \tilde{\mathbf{b}})$, so the BLAKE3 digest is identical.
|
|
For Refresh, an analogous argument applies with $z_i(x)$ a
|
|
zero-polynomial of degree $t-1$ \cite{hjky97}: the constant term
|
|
contributes nothing to $G(0)$, so $\mathbf{s}$, $\mathbf{e}$, and
|
|
hence $\tilde{\mathbf{b}}$ are byte-preserved.
|
|
|
|
The identity~\eqref{eq:lagrange} is mechanised in
|
|
\texttt{lean/Crypto/Threshold/Reshare.lean} as the axiom
|
|
\texttt{reshare\_same\_secret} together with theorem
|
|
\texttt{reshare\_preserves\_public\_key}, which derives
|
|
$\mathsf{pubkey\_from\_shares}(\mathsf{newShares}, t')
|
|
= \mathsf{pubkey}(\mathsf{key})$ from \texttt{reshare\_same\_secret}.
|
|
\end{proof}
|
|
|
|
\begin{lemma}[Rollback-lineage forward reconstruction]
|
|
\label{lem:rollback-lineage}
|
|
Let
|
|
$\Pi_0 \xrightarrow{\mathrm{Reshare}} \Pi_1 \xrightarrow{\mathrm{Reshare}}
|
|
\cdots \xrightarrow{\mathrm{Reshare}} \Pi_k$ be a chain of forward
|
|
transitions at fixed $\eta$, and suppose
|
|
$\Pi_k \xrightarrow{\mathrm{Rollback}(j)} \Pi_{k+1}$ for some $j < k$.
|
|
Then the chain
|
|
$(\eta_i, g_i, r_i)_{i=0}^{k+1}$ uniquely reconstructs the
|
|
forward-only path $\Pi_0 \to \Pi_1 \to \cdots \to \Pi_j$ that the
|
|
rollback restored to.
|
|
\end{lemma}
|
|
|
|
\begin{proof}
|
|
Each transition records $(\eta_i, g_i, r_i)$ on chain. By
|
|
Lemma~\ref{lem:gen-mono}, $g_i$ is strictly monotone in $i$. By
|
|
construction, $r_i = 0$ iff transition $i$ is forward; $r_i = j > 0$
|
|
iff transition $i$ is a rollback to generation $j$. To reconstruct the
|
|
forward-only path: walk the chain in reverse, skipping any transition
|
|
$i$ with $r_i > 0$ together with all transitions $i' > j$ such that
|
|
$g_{i'} > j$ and $r_{i'} = 0$ for $i' \leq i$ (these are the reverted
|
|
forward steps). The remaining sequence is the canonical forward
|
|
lineage of any state restored to. Uniqueness follows from the
|
|
strict monotonicity of $g$ within an era (Lemma~\ref{lem:gen-mono})
|
|
and the fact that $r$ unambiguously labels rollback targets.
|
|
\end{proof}
|
|
|
|
\begin{theorem}[Activation-certificate soundness]
|
|
\label{thm:activation-soundness}
|
|
Let $\mathsf{ActivationMsg}_{\eta, g+1}$ be the wire payload of
|
|
LP-073~\S8.3 (activation cert), binding the new generation
|
|
$g+1$ at fixed era $\eta$. The verifier
|
|
$\mathsf{VerifyActivation}(\Pi, \Pi', \sigma)$ accepts iff
|
|
$\sigma$ is a valid Pulsar threshold signature on
|
|
$\mathsf{ActivationMsg}_{\eta, g+1}$ that verifies under the
|
|
\emph{unchanged} GroupKey $(\mathbf{A}, \tilde{\mathbf{b}})$ of $\Pi$.
|
|
Then under MLWE/MSIS at the LP-073 \S2 parameters,
|
|
\[
|
|
\Pr\bigl[
|
|
\mathsf{VerifyActivation} = 1 \wedge
|
|
\pi'_v \text{ does not satisfy~\eqref{eq:lagrange}}
|
|
\bigr] \leq \epsilon_{\mathrm{RT}}^{\mathrm{MLWE,MSIS}} = \mathsf{negl}(\lambda).
|
|
\]
|
|
That is: $\mathsf{VerifyActivation}$ accepts iff the new committee's
|
|
shares can sign under the unchanged GroupKey, which by SUF-CMA reduces
|
|
to the new shares satisfying the Lagrange-recombination
|
|
identity~\eqref{eq:lagrange}.
|
|
\end{theorem}
|
|
|
|
\begin{proof}
|
|
Forward direction. If $\Pi'$ satisfies~\eqref{eq:lagrange}, then by
|
|
Lemma~\ref{lem:gk-identical} the GroupKey is byte-identical, and the
|
|
honest threshold signing protocol (Corona Round 1 / Round 2) on the
|
|
new shares produces a $\sigma$ that verifies under the same
|
|
$(\mathbf{A}, \tilde{\mathbf{b}})$. $\mathsf{VerifyActivation}$
|
|
accepts.
|
|
|
|
Reverse direction. If $\mathsf{VerifyActivation}$ accepts, then by the
|
|
SUF-CMA reduction of Corona under MLWE/MSIS (Theorem~5.1 of
|
|
LP-073 below, i.e.\ Theorem~\ref{thm:main} restricted to the Corona
|
|
lane), there exists a share set $\{\mathbf{s}'_v\}_{v \in V'}$ of stake
|
|
$\geq t'$ that produced the signature, and these shares jointly
|
|
recombine to the master secret $\mathbf{s}$ via Lagrange interpolation.
|
|
By the verifier equation $A z - b c$ and the $L_2$ bound, the recovered
|
|
$\mathbf{s}$ is consistent with $(\mathbf{A}, \tilde{\mathbf{b}})$ ---
|
|
otherwise the forger has produced a fresh MLWE/MSIS instance, an event
|
|
of probability at most $\epsilon_{\mathrm{RT}}^{\mathrm{MLWE,MSIS}}$.
|
|
Hence the new shares satisfy~\eqref{eq:lagrange} except with negligible
|
|
probability.
|
|
\end{proof}
|
|
|
|
\begin{remark}[What activation does \emph{not} prove]
|
|
$\mathsf{VerifyActivation}$ is necessary but not sufficient for full
|
|
Byzantine attribution: it certifies that the new committee can sign,
|
|
not which old or new party (if any) sent a malformed contribution.
|
|
Attribution is the responsibility of the complaint and disqualification
|
|
pipeline (lattice Pedersen commit verification, LP-073~\S8.5
|
|
(Pedersen DKG over $R_q$)). Failed activation triggers the non-punitive
|
|
rollback ladder of LP-073~\S8.4 (rollback); safety and
|
|
liveness do not depend on slashing-based attribution.
|
|
\end{remark}
|
|
|
|
%% ==================================================================
|
|
\section{Gaps and Future Work}
|
|
\label{sec:gaps}
|
|
%% ==================================================================
|
|
|
|
The 3.0 final scope leaves three gaps explicitly open for future work,
|
|
each tracked in LP-020.
|
|
|
|
\begin{enumerate}[nosep]
|
|
\item \textbf{Threshold ML-DSA.} Not used in 3.0 due to a
|
|
rejection-sampling circularity (see App.~A). Resolved-or-rejected
|
|
once the Celi--del~Pino--Espitau--Niot--Prest construction is
|
|
stable.
|
|
\item \textbf{Adaptive corruption without erasures.} Tightness of
|
|
the $O(n \cdot Q_H)$ loss in App.~C; potential gain from a
|
|
Fischlin-style transform.
|
|
\item \textbf{Post-quantum SNARK.} Replacing Groth16 with a STARK-
|
|
or hash-based SNARK to eliminate the conditional on classical
|
|
knowledge-soundness in Theorem~\ref{thm:pq}.
|
|
\end{enumerate}
|
|
|
|
%% ==================================================================
|
|
%% BIBLIOGRAPHY
|
|
%% ==================================================================
|
|
\begin{thebibliography}{20}
|
|
|
|
\bibitem{boneh2001short} D.~Boneh, B.~Lynn, H.~Shacham, ``Short
|
|
Signatures from the Weil Pairing,'' \emph{ASIACRYPT}, 2001.
|
|
|
|
\bibitem{corona} Z.~Kelling, V.~Seesahai, ``Corona: Lattice-Based
|
|
PQ Threshold Signatures for Blockchain Consensus,''
|
|
Lux Industries, 2024.
|
|
|
|
\bibitem{nist-pqc} NIST, ``FIPS 204: ML-DSA (Module-Lattice-Based
|
|
Digital Signature Algorithm),'' 2024.
|
|
|
|
\bibitem{groth2016} J.~Groth, ``On the Size of Pairing-Based
|
|
Non-Interactive Arguments,'' \emph{EUROCRYPT}, 2016.
|
|
|
|
\bibitem{regev2005} O.~Regev, ``On Lattices, Learning with Errors,
|
|
Random Linear Codes, and Cryptography,'' \emph{J.~ACM}, 56(6), 2009.
|
|
|
|
\bibitem{canetti2001} R.~Canetti, ``Universally Composable Security:
|
|
A New Paradigm for Cryptographic Protocols,'' \emph{FOCS}, 2001.
|
|
|
|
\bibitem{garay2015} J.~Garay, A.~Kiayias, N.~Leonardos, ``The Bitcoin
|
|
Backbone Protocol: Analysis and Applications,'' \emph{EUROCRYPT},
|
|
2015.
|
|
|
|
\bibitem{fischlin2005} M.~Fischlin, ``Communication-Efficient
|
|
Non-Interactive Proofs of Knowledge with Online Extractors,''
|
|
\emph{CRYPTO}, 2005.
|
|
|
|
\bibitem{bowe2017} S.~Bowe, A.~Gabizon, I.~Miers, ``Scalable
|
|
Multi-Party Computation for zk-SNARK Parameters in the Random Beacon
|
|
Model,'' IACR ePrint 2017/1050, 2017.
|
|
|
|
\bibitem{plonk2019} A.~Gabizon, Z.~J.~Williamson, O.~Ciobotaru,
|
|
``PLONK: Permutations over Lagrange-Bases for Oecumenical
|
|
Noninteractive Arguments of Knowledge,'' IACR ePrint 2019/953.
|
|
|
|
\bibitem{marlin2020} A.~Chiesa, Y.~Hu, M.~Maller, P.~Mishra,
|
|
N.~Vesely, N.~Ward, ``Marlin: Preprocessing zkSNARKs with Universal
|
|
and Updatable SRS,'' \emph{EUROCRYPT}, 2020.
|
|
|
|
\bibitem{bdgl2016} A.~Becker, L.~Ducas, N.~Gama, T.~Laarhoven,
|
|
``New Directions in Nearest Neighbor Searching with Applications to
|
|
Lattice Sieving,'' \emph{SODA}, 2016.
|
|
|
|
\bibitem{nist-pqc-cost} NIST, ``Status Report on the Third Round of
|
|
the NIST Post-Quantum Cryptography Standardization Process,''
|
|
NISTIR~8413, 2022.
|
|
|
|
\bibitem{espitau2024} T.~Espitau, M.~Tibouchi, A.~Wallet, ``Practical
|
|
Fiat-Shamir with Aborts Threshold Signatures from Lattices,''
|
|
IACR ePrint, 2024.
|
|
|
|
\bibitem{laarhoven2015} T.~Laarhoven, ``Sieving for Shortest Vectors
|
|
in Lattices Using Angular Locality-Sensitive Hashing,''
|
|
\emph{CRYPTO}, 2015.
|
|
|
|
\bibitem{albrecht-estimator} M.~R.~Albrecht, R.~Player, S.~Scott,
|
|
``On the Concrete Hardness of Learning with Errors,''
|
|
\emph{J.~Math.~Cryptol.}, 9(3):169--203, 2015.
|
|
|
|
\bibitem{nist-mldsa-spec} NIST, ``FIPS 204: Module-Lattice-Based
|
|
Digital Signature Algorithm (ML-DSA),'' August 2024.
|
|
Algorithm~3 (ML-DSA.Verify).
|
|
|
|
\bibitem{tmldsa2025} A.~Celi, R.~del~Pino, T.~Espitau, G.~Niot,
|
|
T.~Prest, ``Efficient Threshold ML-DSA,'' USENIX Security 2025.
|
|
|
|
\bibitem{lp020} ``LP-020: Quasar Consensus,'' Lux Industries, 2025.
|
|
|
|
\bibitem{lp132} ``LP-132: QuasarGPU Adapter,'' Lux Industries, 2025.
|
|
|
|
\bibitem{hjky97} A.~Herzberg, S.~Jarecki, H.~Krawczyk, M.~Yung,
|
|
``Proactive Secret Sharing or: How to Cope With Perpetual Leakage,''
|
|
\emph{CRYPTO}, 1995, updated 1997.
|
|
|
|
\bibitem{desmedtjajodia97} Y.~Desmedt, S.~Jajodia, ``Redistributing
|
|
Secret Shares to New Access Structures and Its Applications,''
|
|
Technical Report ISSE TR-97-01, George Mason University, 1997.
|
|
|
|
\bibitem{wongwangwing02} T.~M.~Wong, C.~Wang, J.~M.~Wing, ``Verifiable
|
|
Secret Redistribution for Archive Systems,''
|
|
\emph{IEEE SISW}, 2002.
|
|
|
|
\bibitem{lp073} ``LP-073: Pulsar --- Dynamic Lattice Threshold
|
|
Signatures for Permissionless Validator Sets,'' Lux Industries, 2026.
|
|
|
|
\end{thebibliography}
|
|
|
|
%% ==================================================================
|
|
\appendix
|
|
%% ==================================================================
|
|
|
|
%% ==================================================================
|
|
\section{Threshold ML-DSA Rejection in 3.0}
|
|
\label{app:tmldsa}
|
|
%% ==================================================================
|
|
|
|
3.0 final does not adopt threshold ML-DSA. This appendix records why,
|
|
because the trade-off recurs in every audit cycle.
|
|
|
|
\subsection{The rejection-sampling circularity}
|
|
|
|
ML-DSA-65 (FIPS~204, Algorithm~2) signs by repeatedly sampling
|
|
$\mathbf{y} \leftarrow [-\gamma_1, \gamma_1]^\ell$, computing
|
|
$\mathbf{w} = \mathbf{A}\mathbf{y}$, deriving challenge
|
|
$c = H(\mu, \mathbf{w}_1)$, then computing $\mathbf{z} =
|
|
\mathbf{y} + c \mathbf{s}_1$ and \emph{rejecting} the trial if
|
|
$\|\mathbf{z}\|_\infty \geq \gamma_1 - \beta$ or
|
|
$\|\text{LowBits}(\mathbf{w} - c\mathbf{s}_2)\|_\infty \geq \gamma_2 -
|
|
\beta$. The rejection probability is non-negligible (roughly $1 - 1/e$
|
|
for the $\mathbf{z}$ check), so the signer iterates until accepted.
|
|
|
|
Threshold ML-DSA must produce a signature whose distribution is
|
|
identical to centralised ML-DSA, including the rejection condition
|
|
applied to the \emph{aggregate} $\mathbf{z} = \sum_i \mathbf{z}_i$.
|
|
Each share $\mathbf{z}_i = \mathbf{y}_i + c \mathbf{s}_{1,i}$ is a
|
|
linear function of the per-share randomness $\mathbf{y}_i$. The
|
|
challenge $c$ is a function of the aggregate commitment
|
|
$\mathbf{w} = \sum_i \mathbf{w}_i$, which fixes
|
|
$\mathbf{y} = \sum_i \mathbf{y}_i$.
|
|
|
|
The circularity:
|
|
\begin{itemize}[nosep]
|
|
\item Each signer must commit $\mathbf{w}_i$ \emph{before} seeing
|
|
$c$ (otherwise it is not a Fiat--Shamir signature).
|
|
\item The acceptance probability of the resulting aggregate
|
|
$\mathbf{z}$ depends on the joint distribution of all
|
|
$\mathbf{y}_i$, which the protocol cannot influence post-commit.
|
|
\item Naive aggregation either (a) leaks information about each
|
|
signer's $\mathbf{s}_{1,i}$ on rejection (because rejection is a
|
|
function of $\mathbf{z}_i$ and a partial $c$), or (b) requires a
|
|
fresh round per rejection, blowing up the round complexity by an
|
|
expected factor of $e$ and breaking the two-round target.
|
|
\end{itemize}
|
|
|
|
The Celi--del~Pino--Espitau--Niot--Prest construction
|
|
(USENIX Security 2025~\cite{tmldsa2025}) addresses this with masked
|
|
shares and amortised rejection, but the proof is in the algebraic
|
|
group model with non-trivial trapdoor assumptions and is not yet
|
|
audit-clean. 3.0 freezes on the alternative below.
|
|
|
|
\subsection{The 3.0 alternative}
|
|
|
|
Instead of threshold ML-DSA we use:
|
|
\begin{itemize}[nosep]
|
|
\item \emph{Per-validator individual} ML-DSA-65 signatures (no
|
|
threshold, no aggregation, no rejection circularity).
|
|
\item A Z-Chain Groth16 rollup proof that all $n$ such signatures
|
|
verify against $\mathsf{zchain\_vk\_root}$ on a common
|
|
$\mathsf{subj}$.
|
|
\end{itemize}
|
|
|
|
This preserves the security target (each validator's signature is
|
|
EUF-CMA under MLWE/MSIS, the rollup is knowledge-sound under KEA in the
|
|
AGM) without the circularity. The cost is an $n \times $ blow-up in
|
|
witness size, which is precisely what Groth16 amortises across
|
|
validators. See App.~B for the constraint count.
|
|
|
|
%% ==================================================================
|
|
\section{ML-DSA-65 Groth16 Circuit Analysis}
|
|
\label{app:circuit}
|
|
%% ==================================================================
|
|
|
|
This appendix derives the R1CS constraint count for verifying a single
|
|
ML-DSA-65 signature inside a Groth16 circuit, establishes the
|
|
circuit-independent proof size, and corrects the prover-time estimate.
|
|
|
|
\subsection{ML-DSA-65 Verification Steps}
|
|
|
|
ML-DSA-65 verification (Algorithm~3 of FIPS~204~\cite{nist-mldsa-spec})
|
|
performs the following on input $(pk, \mu, \sigma)$ where
|
|
$pk = (\rho, t_1)$ and $\sigma = (\tilde{c}, z, h)$:
|
|
|
|
\begin{enumerate}[nosep]
|
|
\item Expand $\mathbf{A} \in R_q^{k \times \ell}$ from $\rho$
|
|
via SHAKE-128 ($k=6$, $\ell=5$, $q = 8\,380\,417 = 2^{23} - 2^{13} + 1$).
|
|
\item Compute $c = \mathsf{SampleInBall}(\tilde{c})$: a polynomial in
|
|
$R_q$ with coefficients in $\{-1,0,1\}$, Hamming weight $\tau=49$.
|
|
\item Compute $\mathbf{w}' = \mathbf{A}\mathbf{z} - c \cdot t_1 \cdot 2^d$
|
|
via NTT-domain arithmetic.
|
|
\item Extract high bits: $\mathbf{w}_1' = \mathsf{UseHint}(h, \mathbf{w}')$.
|
|
\item Check $\|z\|_\infty < \gamma_1 - \beta$ where
|
|
$\gamma_1 = 2^{19}$, $\beta = 196$.
|
|
\item Recompute $\tilde{c}' = H(\mu, \mathbf{w}_1')$ and check
|
|
$\tilde{c}' = \tilde{c}$.
|
|
\end{enumerate}
|
|
|
|
\subsection{R1CS Constraint Count}
|
|
|
|
Each polynomial in $R_q = \mathbb{Z}_q[X]/(X^{256}+1)$ has 256
|
|
coefficients modulo $q$; each coefficient fits in 23 bits.
|
|
|
|
\paragraph{NTT.}
|
|
A 256-point NTT over $\mathbb{Z}_q$ requires $256 \cdot \log_2(256) / 2
|
|
= 256 \cdot 4 = 1\,024$ butterfly operations. Each butterfly is
|
|
one multiplication and two additions in $\mathbb{Z}_q$. In R1CS,
|
|
multiplication modulo $q$ costs 1 constraint (the multiplication gate)
|
|
plus $O(1)$ range-check constraints to enforce that the result is reduced
|
|
modulo $q$. Using standard range-check decomposition into 23-bit limbs,
|
|
each $\bmod\,q$ reduction costs $\approx 3$ R1CS constraints. Total
|
|
per NTT: $\approx 1\,024 \times 4 = 4\,096$ constraints.
|
|
|
|
\paragraph{Matrix-vector product $\mathbf{A}\mathbf{z}$.}
|
|
This is $k \times \ell = 6 \times 5 = 30$ polynomial multiplications
|
|
in $R_q$. Each polynomial multiplication via NTT requires: forward NTT
|
|
of both operands (2 NTTs), pointwise multiply (256 multiplications),
|
|
inverse NTT of the result (1 NTT). However, $\mathbf{A}$ can be
|
|
precomputed in NTT domain as a public input, saving $k \times \ell = 30$
|
|
forward NTTs. Remaining: 5 NTTs for $\mathbf{z}$, 30 pointwise
|
|
multiplies (each 256 R1CS multiplications + mod-$q$ reductions), 6
|
|
inverse NTTs for the $k$ result polynomials, plus 5 additions of
|
|
$\ell$-way sums.
|
|
|
|
\begin{itemize}[nosep]
|
|
\item Forward NTT of $\mathbf{z}$: $5 \times 4\,096 = 20\,480$
|
|
\item Pointwise multiply: $30 \times 256 \times 4 = 30\,720$
|
|
\item Inverse NTT of results: $6 \times 4\,096 = 24\,576$
|
|
\item Additions (free in R1CS): 0
|
|
\end{itemize}
|
|
Subtotal: $\approx 75\,776$ constraints.
|
|
|
|
\paragraph{Scalar-polynomial product $c \cdot t_1 \cdot 2^d$.}
|
|
The challenge $c$ has weight $\tau = 49$, so $c \cdot t_1$ involves a
|
|
sparse convolution. In the worst case this is done via NTT:
|
|
$2 + 1 = 3$ NTTs plus 256 pointwise multiplies.
|
|
Cost: $3 \times 4\,096 + 256 \times 4 = 13\,312$ constraints. Repeated
|
|
for each of the $k = 6$ polynomials in $t_1$: $\approx 79\,872$.
|
|
(Optimization: exploit sparsity of $c$ to reduce to $\approx 49 \times
|
|
256 \times k$ multiply-add operations $\approx 75\,264$.)
|
|
|
|
\paragraph{Norm check, UseHint, hash.}
|
|
Norm check $\|z\|_\infty < \gamma_1 - \beta$: range check on
|
|
$5 \times 256 = 1\,280$ coefficients, each $\approx 20$ constraints
|
|
for a 19-bit comparison. Cost: $\approx 25\,600$.
|
|
$\mathsf{UseHint}$: bit extraction on $6 \times 256$ coefficients,
|
|
$\approx 6 \times 256 \times 10 = 15\,360$ constraints.
|
|
$\mathsf{SHAKE}$ / hash re-computation: SHAKE-256 on $\sim$1\,KB
|
|
input, $\approx 25\,000$ constraints (Keccak-f[1600] at $\approx
|
|
12\,500$ constraints per permutation, 2 calls).
|
|
|
|
\paragraph{SHAKE-128 for $\mathbf{A}$ expansion.}
|
|
Expanding $\mathbf{A}$ from $\rho$ requires $k \times \ell = 30$
|
|
rejection-sampling streams of SHAKE-128. Each stream produces
|
|
$\sim 256$ coefficients in $\mathbb{Z}_q$ via rejection sampling.
|
|
This is the most expensive part: $\approx 30 \times 3 \times 12\,500
|
|
= 1\,125\,000$ constraints (3 Keccak permutations per stream on
|
|
average due to rejection).
|
|
|
|
\paragraph{Total for one ML-DSA-65 verification.}
|
|
|
|
\begin{center}
|
|
\begin{tabular}{lr}
|
|
\toprule
|
|
\textbf{Sub-circuit} & \textbf{Constraints} \\
|
|
\midrule
|
|
$\mathbf{A}$ expansion (SHAKE-128) & $\sim 1\,125\,000$ \\
|
|
$\mathbf{A}\mathbf{z}$ product (NTT) & $\sim 75\,776$ \\
|
|
$c \cdot t_1$ product & $\sim 79\,872$ \\
|
|
Norm check & $\sim 25\,600$ \\
|
|
UseHint & $\sim 15\,360$ \\
|
|
Hash recomputation (SHAKE-256) & $\sim 25\,000$ \\
|
|
\midrule
|
|
\textbf{Total (1 verification)} & $\sim 1.35 \times 10^6 \approx 2^{22.5}$ \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
For $n$ validators, the circuit verifies $n$ signatures:
|
|
$C \approx n \times 1.35 \times 10^6$. For $n = 21$ (Quasar mainnet):
|
|
$C \approx 2.84 \times 10^7 \approx 2^{24.8}$.
|
|
|
|
\paragraph{Optimisation -- amortised case.}
|
|
If $\mathbf{A}$ is shared across all $n$ validators (same $\rho$),
|
|
the expansion is done once: $C \approx 1.125 \times 10^6 + n \times
|
|
2.21 \times 10^5 \approx 5.77 \times 10^6 \approx 2^{22.5}$ for
|
|
$n = 21$. This is the figure used in the main text and in LP-020
|
|
\S6.4. Equivalently, the per-validator amortised constraint count is
|
|
$\sim 2^{20}$.
|
|
|
|
\subsection{Proof Size}
|
|
|
|
Groth16 proof size is circuit-independent~\cite{groth2016}: two
|
|
elements of $\mathbb{G}_1$ and one element of $\mathbb{G}_2$ over
|
|
BLS12-381:
|
|
\[
|
|
|\pi| = 2 \times 48 + 1 \times 96 = 192 \text{ bytes}
|
|
\]
|
|
This holds regardless of the constraint count $C$. The 192-byte claim
|
|
in the main text (Def.~6.2 of LP-020) is correct.
|
|
|
|
\subsection{Prover Time}
|
|
|
|
Groth16 proving requires two multi-scalar exponentiations of size $C$
|
|
and an FFT of size $C$. The dominant cost is the MSM:
|
|
$O(C / \log C)$ group operations in $\mathbb{G}_1$. On BLS12-381,
|
|
one $\mathbb{G}_1$ scalar multiplication takes $\sim 0.5$\,ms on a
|
|
single CPU core (Apple M1 class).
|
|
|
|
For $C \approx 2^{22.5}$ (optimised, $n = 21$):
|
|
\begin{itemize}[nosep]
|
|
\item MSM via Pippenger: $C / \log_2 C \approx 2^{22.5} / 22.5
|
|
\approx 2.6 \times 10^5$ group additions.
|
|
\item At $\sim 1\,\mu$s per $\mathbb{G}_1$ addition: $\approx 0.26$\,s.
|
|
\item FFT: $O(C \log C)$ field operations, $\approx 0.1$\,s.
|
|
\item \textbf{Total prover time: $\approx 0.4$\,s on a single CPU core.}
|
|
\item With GPU acceleration (e.g., \texttt{bellman} MSM on RTX 4090):
|
|
$\approx 5\text{--}15$\,ms.
|
|
\end{itemize}
|
|
|
|
\paragraph{Correction to earlier drafts.}
|
|
The $357\,\mu$s figure cited in earlier drafts was unsupported by
|
|
measurement. The closest real numbers are BLS single signing
|
|
($350\,\mu$s) and ML-DSA-65 signing ($495\,\mu$s). For the actual
|
|
ML-DSA-65 verification circuit at $C \approx 2^{22.5}$, CPU prover time
|
|
is $\sim 400$\,ms and GPU prover time is $\sim 5\text{--}15$\,ms. Full
|
|
QuasarCert CPU verification (BLS aggregated verify + Groth16 verify) is
|
|
$\sim 2\text{--}5$\,ms. Z-Chain proof generation runs asynchronously
|
|
(epoch-based, not per-block), so this does not impact finality
|
|
latency. See \texttt{consensus/BENCHMARKS.md} for all measured values.
|
|
|
|
%% ==================================================================
|
|
\section{Static vs Adaptive Corruption}
|
|
\label{app:adaptive}
|
|
%% ==================================================================
|
|
|
|
Theorem~\ref{thm:main} and its counterpart Theorem~7.5 in LP-020
|
|
assume \emph{static} corruption: the adversary commits to the set of
|
|
corrupted validators before protocol execution begins. This appendix
|
|
addresses extension to the adaptive corruption model.
|
|
|
|
\subsection{Corruption Models}
|
|
|
|
\begin{definition}[Static corruption~\cite{canetti2001}]
|
|
The adversary $\mathcal{A}$ selects the set $F \subset \mathcal{V}$
|
|
of corrupted parties before the protocol begins. $\mathcal{A}$ learns
|
|
all internal state of parties in $F$ but cannot corrupt additional
|
|
parties during execution.
|
|
\end{definition}
|
|
|
|
\begin{definition}[Adaptive corruption~\cite{canetti2001}]
|
|
The adversary $\mathcal{A}$ may corrupt parties at any point during
|
|
protocol execution. Upon corrupting $v_i$, $\mathcal{A}$ learns all
|
|
of $v_i$'s current state (keys, randomness, signing transcripts).
|
|
The total stake of corrupted parties remains bounded by $\tau$.
|
|
\end{definition}
|
|
|
|
In the adaptive model, the simulator in a security proof must produce
|
|
a consistent view for the adversary \emph{after} the adversary chooses
|
|
which party to corrupt. This is strictly harder than the static model:
|
|
the simulator must either (a)~program the random oracle to maintain
|
|
consistency (programmable RO), or (b)~ensure honest parties have
|
|
erased sensitive state before corruption (secure erasures).
|
|
|
|
\subsection{Static-Model Limitation}
|
|
|
|
\begin{remark}
|
|
Theorem~\ref{thm:main} holds only under static corruption. The proofs
|
|
of Corona SUF-CMA~\cite{corona} and BLS
|
|
EUF-CMA~\cite{boneh2001short} both use rewinding-based extractors
|
|
that require the corrupted set to be fixed before the simulation
|
|
begins. In the adaptive model, the adversary can corrupt a validator
|
|
\emph{after} seeing its Corona Round~1 commitment, learning the
|
|
signing randomness $\mathbf{y}_i$ and secret share $\mathbf{s}_i$.
|
|
\end{remark}
|
|
|
|
\subsection{Extension via Programmable Random Oracle}
|
|
|
|
\begin{corollary}[Adaptive soundness, programmable RO]
|
|
\label{cor:adaptive-pro}
|
|
In the programmable random oracle model, Theorem~\ref{thm:main} extends
|
|
to adaptive corruption with a security loss of $O(n \cdot Q_H)$, where
|
|
$Q_H$ is the number of hash queries.
|
|
\end{corollary}
|
|
|
|
\begin{proof}[Proof sketch]
|
|
We apply the Fischlin transform~\cite{fischlin2005}: the simulator
|
|
programs the random oracle $H$ so that upon adaptive corruption of
|
|
$v_i$, the simulated signing transcripts remain consistent with the
|
|
adversary's view. Per-component: BLS uses RO programming to embed a
|
|
co-CDH challenge at the corruption point (loss $O(n)$); Corona
|
|
programs $H$ on the round-1 commitment so the adversary's view is
|
|
extractable, then solves a linear system over $R_q$ on corruption
|
|
(loss $O(n)$); Groth16 in the AGM is rewinding-free and adaptively
|
|
sound directly.
|
|
|
|
Combining with a union bound over $n$ targets and $Q_H$ queries:
|
|
\[
|
|
\mathsf{Adv}^{\text{forge}}_{\text{adaptive}} \leq
|
|
n \cdot Q_H \cdot \max(\epsilon_{\text{co-CDH}},
|
|
\epsilon_{\text{MLWE}}, \epsilon_{\text{MLWE/MSIS}})
|
|
\]
|
|
which is negligible for $\lambda = 128$ when $n \cdot Q_H < 2^{60}$
|
|
(a generous bound for any practical deployment).
|
|
\end{proof}
|
|
|
|
\subsection{Extension via Secure Erasures}
|
|
|
|
\begin{corollary}[Adaptive soundness, erasure model]
|
|
\label{cor:adaptive-erasure}
|
|
If honest validators erase signing randomness
|
|
($\mathbf{y}_i$, PRF state) after each Corona round completes,
|
|
then Theorem~\ref{thm:main} extends to adaptive corruption without
|
|
the programmable RO assumption, with no additional security loss.
|
|
\end{corollary}
|
|
|
|
\begin{proof}[Proof sketch]
|
|
If $v_i$ erases $\mathbf{y}_i$ after broadcasting $\mathbf{z}_i$,
|
|
then adaptive corruption of $v_i$ reveals only $\mathbf{s}_i$ (the
|
|
long-term share) and the completed signature transcript. The
|
|
adversary gains no advantage beyond what a static adversary controlling
|
|
$v_i$ from the start would have. The static-model proof applies
|
|
directly.
|
|
\end{proof}
|
|
|
|
\paragraph{Practical note.}
|
|
The Quasar implementation (Section~9 of LP-020) zeroes signing
|
|
randomness after each round via Go's explicit memory clearing.
|
|
This provides the erasure property in software. HSM-backed signing
|
|
(Section~5 of LP-020, T-Chain) provides hardware-enforced erasure.
|
|
|
|
\paragraph{Blockchain corruption model.}
|
|
In blockchain settings, the standard corruption model is that of
|
|
Garay--Kiayias--Leonardos~\cite{garay2015}: the adversary is
|
|
\emph{mildly adaptive}, corrupting parties between rounds but not
|
|
within a round. Both Cor.~\ref{cor:adaptive-pro} and
|
|
Cor.~\ref{cor:adaptive-erasure} cover this model as a special
|
|
case.
|
|
|
|
%% ==================================================================
|
|
\section{Trusted-Setup Ceremony}
|
|
\label{app:setup}
|
|
%% ==================================================================
|
|
|
|
\subsection{The SRS Assumption}
|
|
|
|
Groth16~\cite{groth2016} requires a structured reference string (SRS)
|
|
of the form:
|
|
\[
|
|
\mathsf{SRS} = \bigl(
|
|
\{g^{\tau^i}\}_{i=0}^{C},\;
|
|
\{h^{\tau^i}\}_{i=0}^{C},\;
|
|
\{g^{\alpha \tau^i}\},\;
|
|
\{g^{\beta \tau^i}\},\;
|
|
h^\beta,\; h^\gamma,\; h^\delta
|
|
\bigr)
|
|
\]
|
|
where $\tau, \alpha, \beta, \gamma, \delta$ are toxic waste that must
|
|
be destroyed after generation. If any party learns $\tau$, it can
|
|
forge proofs for arbitrary false statements.
|
|
|
|
\paragraph{Circuit specificity.}
|
|
The Groth16 SRS is circuit-specific: a new SRS must be generated for
|
|
each distinct R1CS circuit. For QuasarCert, the circuit is fixed
|
|
(ML-DSA-65 verification for a given $n$), so a single ceremony per
|
|
$(n, \text{ML-DSA parameters})$ tuple suffices.
|
|
|
|
\subsection{Multi-Party Ceremony}
|
|
|
|
The standard mitigation is an $N$-party ceremony where each
|
|
participant $P_j$ contributes randomness $\tau_j$ to the SRS. The
|
|
final SRS uses $\tau = \sum_j \tau_j$ (or $\prod_j \tau_j$ in the
|
|
multiplicative formulation). Security holds if \emph{at least one}
|
|
participant is honest and destroys their $\tau_j$.
|
|
|
|
\begin{theorem}[Ceremony security~\cite{bowe2017}]
|
|
An $N$-party Groth16 SRS ceremony is secure (no party learns $\tau$)
|
|
provided at least one participant honestly destroys their contribution.
|
|
The ceremony can be run sequentially (each participant extends the
|
|
previous SRS) with public verification of each step.
|
|
\end{theorem}
|
|
|
|
For QuasarCert with $n = 21$ validators, the ceremony participants can
|
|
be the validators themselves. With 21 participants, the probability
|
|
that all are dishonest (and collude to reconstruct $\tau$) is
|
|
negligible under the $f < 1/3$ Byzantine assumption: at most 7
|
|
validators are corrupt, so at least 14 honestly destroy their
|
|
contributions. The output is committed in
|
|
$\mathsf{zchain\_vk\_root}$ on the Z-Chain genesis block.
|
|
|
|
\subsection{Universal-Setup Alternatives}
|
|
|
|
Universal-setup proof systems avoid circuit-specific ceremonies at the
|
|
cost of larger proofs.
|
|
|
|
\begin{center}
|
|
\begin{tabular}{lrrll}
|
|
\toprule
|
|
\textbf{System} & \textbf{Proof size} & \textbf{Verify} &
|
|
\textbf{Setup} & \textbf{Ref.} \\
|
|
\midrule
|
|
Groth16 & 192\,B & 3 pairings & Circuit-specific & \cite{groth2016} \\
|
|
PLONK & $\sim$500\,B & $O(1)$ pairings & Universal, updatable
|
|
& \cite{plonk2019} \\
|
|
Marlin & $\sim$800\,B & $O(\log C)$ & Universal, updatable
|
|
& \cite{marlin2020} \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
\paragraph{Recommendation (3.0 final).}
|
|
Groth16 with a multi-party ceremony among the validator set, output
|
|
committed in $\mathsf{zchain\_vk\_root}$, is the production
|
|
configuration for the 2025-12-25 activation. PLONK migration is
|
|
tracked as a future-work item under LP-020 \S11.
|
|
|
|
%% ==================================================================
|
|
\section{Quantum-Safety Analysis}
|
|
\label{app:quantum}
|
|
%% ==================================================================
|
|
|
|
This appendix consolidates the concrete classical and quantum security
|
|
estimates for each lane, then states the combined three-lane survival
|
|
condition.
|
|
|
|
\subsection{Lane 1: BLS12-381 (classical only)}
|
|
|
|
Classical security is approximately $2^{128}$ (best classical attack
|
|
on the discrete log in $\mathbb{F}_{q^{12}}$ via the special tower
|
|
NFS). Quantum security is $0$ in polynomial time once a
|
|
cryptographically relevant quantum computer exists, by Shor on the
|
|
underlying $\mathbb{G}_1, \mathbb{G}_2$.
|
|
|
|
\subsection{Lane 2: Corona (Module-LWE / Module-SIS)}
|
|
|
|
Parameter set from~\cite{corona}:
|
|
|
|
\begin{center}
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
\textbf{Parameter} & \textbf{Symbol} & \textbf{Value} \\
|
|
\midrule
|
|
Ring dimension & $N$ & 256 \\
|
|
Modulus & $q$ & $2^{48} + 2561$ ($\approx 2^{48}$) \\
|
|
Module rows & $M$ & 8 \\
|
|
Module columns & $N'$ & 7 \\
|
|
Gaussian width (keygen) & $\sigma_e$ & 6.108 \\
|
|
Gaussian width (signing)& $\sigma^*$ & $2^{37.33}$ \\
|
|
Rejection bound & $B$ & $2^{48.61}$ \\
|
|
Challenge weight & $\kappa$ & 23 \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
The Module-LWE instance underlying Corona has effective lattice
|
|
dimension $d = M \times N = 8 \times 256 = 2\,048$ over
|
|
$\mathbb{Z}_q$.
|
|
|
|
\paragraph{Classical security via primal attack.}
|
|
Best classical attack: the primal lattice attack with BKZ-$\beta$
|
|
sieving (BDGL~\cite{bdgl2016}). Solving requires
|
|
$\delta^{2\beta - d - 1} q^{(d+1)/\beta} = \sigma_e \sqrt{2\pi e /
|
|
(2\beta)}$ with root Hermite factor
|
|
$\delta = \bigl((\pi\beta)^{1/\beta} \beta / (2\pi e)\bigr)^{1/(2(\beta
|
|
-1))}$. For $d = 2048, q \approx 2^{48}, \sigma_e = 6.108$, numerics
|
|
give $\beta \approx 430$. Classical cost
|
|
\[
|
|
T_{\mathrm{classical}} = 2^{0.292\beta + c_0}
|
|
\approx 2^{0.292 \cdot 430 + 16.4}
|
|
= 2^{142}.
|
|
\]
|
|
|
|
\paragraph{Quantum security via Grover-sieving.}
|
|
The Laarhoven--BDGL exponent under Grover speedup is $0.265$:
|
|
\[
|
|
T_{\mathrm{quantum}} = 2^{0.265 \cdot 430 + 16.4} = 2^{130.35}.
|
|
\]
|
|
|
|
\subsection{Lane 3a: ML-DSA-65 (FIPS~204)}
|
|
|
|
Parameters: $k = 6$, $\ell = 5$, $q = 2^{23} - 2^{13} + 1$, $\eta = 4$.
|
|
Effective MLWE dimension $5 \cdot 256 = 1280$, $\log_2 q = 23$.
|
|
NIST Cat.~3 target: $\geq 2^{128}$ classical / $\geq 2^{128}$ quantum
|
|
under the same NIST cost model~\cite{nist-pqc-cost}. Best known attack
|
|
gives $\beta_{\mathrm{BKZ}} \approx 360$, $T_{\mathrm{quantum}} \geq
|
|
2^{128}$.
|
|
|
|
\subsection{Lane 3b: Z-Chain Groth16}
|
|
|
|
Classical: $2^{128}$ (BLS12-381 pairing-based, AGM/KEA). Quantum:
|
|
Groth16 itself loses classical knowledge-soundness once Shor breaks
|
|
discrete log on $\mathbb{G}_1$. However, the \emph{statement proven}
|
|
remains a conjunction of $n$ ML-DSA-65 signature verifications, so a
|
|
quantum adversary's effective task degrades to forging ML-DSA-65
|
|
signatures committed by $\mathsf{zchain\_vk\_root}$. Standalone PQ
|
|
security of Lane~3 thus tracks Lane~3a above.
|
|
|
|
A future-work direction is to swap Groth16 for a STARK-of-pairing or
|
|
hash-based SNARK that is itself PQ-knowledge-sound. Tracked in
|
|
LP-020 \S11; not in 3.0 final scope.
|
|
|
|
\subsection{Comparison table}
|
|
|
|
\begin{center}
|
|
\begin{tabular}{lrrrr}
|
|
\toprule
|
|
\textbf{Scheme} & $d$ & $\log_2 q$ & $\beta_{\text{BKZ}}$ &
|
|
$T_{\text{quantum}}$ \\
|
|
\midrule
|
|
ML-DSA-65 & 1280 & 23 & $\approx 360$
|
|
& $\geq 2^{128}$ \\
|
|
ML-KEM-768 & 768 & 12 & $\approx 340$
|
|
& $\geq 2^{128}$ \\
|
|
Corona & 2048 & 48 & $\approx 430$
|
|
& $\geq 2^{130}$ \\
|
|
BLS12-381 & -- & -- & --
|
|
& $0$ (Shor) \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
\subsection{Combined survival condition}
|
|
|
|
The full QuasarCert quantum-safe predicate is
|
|
$\mathsf{VerifyPQ} = \mathsf{RT.Verify} \land \mathsf{ZK.Verify}$
|
|
(Theorem~\ref{thm:pq}). Equivalently, ``1 of 2'' PQ pillars must hold:
|
|
either Corona's MLWE/MSIS, or the ML-DSA-65 path inside the Groth16
|
|
proof. The classical BLS lane provides classical-only defense in
|
|
depth and contributes nothing to the PQ guarantee, in line with the
|
|
analysis of pq-finality-no-bls.tex.
|
|
|
|
\subsection{Caveats}
|
|
|
|
\begin{enumerate}[nosep]
|
|
\item BDGL sieving exponents $0.292$ (classical) and $0.265$
|
|
(quantum) are heuristic.
|
|
\item The Grover model assumes ideal oracle access; physical
|
|
overhead increases effective security.
|
|
\item Ring structure of $\mathbb{Z}_q[X]/(X^{256}+1)$ has resisted
|
|
known algebraic attacks at the relevant dimensions; an algorithmic
|
|
breakthrough would require parameter revision.
|
|
\item Lane~3b PQ guarantee is conditional on the future-work SNARK
|
|
swap. In 3.0 final, Lane~3 is treated as classical with PQ
|
|
fallback to its statement.
|
|
\end{enumerate}
|
|
|
|
\end{document}
|