skip to content
Skill Issue Dev | Dax the Dev
search
Part of series: relayerless-privacy

TAB: hiding the submitter with ring signatures and FROST

Print view

Sections

SPST hides what value moved. PPST hides what program ran. Neither hides who submitted the transaction. On any chain that requires a signature on the outer transaction (Solana, Ethereum, Aptos, Sui — all of them), the public key of the submitter is right there in the transaction header.

Without a relayer, the submitter must sign with their own key. The Ed25519 public key tells the chain exactly which private actor authorised the proof. ZK on the inside; perfect plaintext on the outside.

This is post 5 of 11 in the relayerless-privacy series. Here we close the submitter-identification gap with two complementary network-layer primitives.

The submitter identification problem, formally

Definition (Active Participant Set). S={(pki,ski)}i=1N\mathcal{S} = \{(\mathsf{pk}_i, \mathsf{sk}_i)\}_{i=1}^N — the set of active F_RP participants at a given epoch. Each holds a Curve25519 keypair registered on chain.

Definition (Anonymity Set Reduction Attack). Adversary A\mathcal{A} with full read access to σ\sigma. Define:

Aeff(tx)={iS:Pr[participant i submitted txViewA]>0}.\mathcal{A}_{\text{eff}}(\mathsf{tx}) = \{\, i \in \mathcal{S} : \Pr[\text{participant } i \text{ submitted } \mathsf{tx} \mid \mathsf{View}_{\mathcal{A}}] > 0 \,\}.

Naive relayerless setting: Aeff=1|\mathcal{A}_{\text{eff}}| = 1. Ed25519 signatures are strongly unforgeable — there is exactly one pki\mathsf{pk}_i that verifies. Conditional entropy:

H(submitterViewA)  =  0.H(\text{submitter} \mid \mathsf{View}_{\mathcal{A}}) \;=\; 0.

Worst possible. Even though the contents of the transaction (the SPST/PPST proof) reveal nothing about which notes were spent, the submitter’s pubkey reveals exactly who authorised the spend. Off-chain metadata (IP, timing, prior-deposit history, exchange KYC) collapses any remaining anonymity.

Approach A — Fujisaki-Suzuki ring signature over Ed25519

Adapt the linkable ring signature framework of Fujisaki and Suzuki (2007) to the Ed25519 group. Let G\mathbb{G} be the prime-order Ed25519 subgroup with generator GG and order \ell. Two random oracles: Hp:{0,1}Z\mathsf{H}_p : \{0,1\}^* \to \mathbb{Z}_\ell and HG:{0,1}G\mathsf{H}_G : \{0,1\}^* \to \mathbb{G}.

Sign with ring R={pk1,,pkn}R = \{\mathsf{pk}_1, \ldots, \mathsf{pk}_n\} at signer index ss:

  1. Key image. I=sksHG(pks)I = \mathsf{sk}_s \cdot \mathsf{H}_G(\mathsf{pk}_s) — deterministic linkability tag, hides ss.
  2. Commitment. Sample αRZ\alpha \xleftarrow{R} \mathbb{Z}_\ell. Compute Ls=αGL_s = \alpha G, Rs=αHG(pks)R_s = \alpha \mathsf{H}_G(\mathsf{pk}_s).
  3. Challenge propagation. For i=s+1,s+2,,s1(modn)i = s+1, s+2, \ldots, s-1 \pmod{n} sample ci,riRZc_i, r_i \xleftarrow{R} \mathbb{Z}_\ell and compute Li=riG+cipki,Ri=riHG(pki)+ciI,ci+1=Hp(m,Li,Ri).L_i = r_i G + c_i \mathsf{pk}_i, \quad R_i = r_i \mathsf{H}_G(\mathsf{pk}_i) + c_i I, \quad c_{i+1} = \mathsf{H}_p(m, L_i, R_i).
  4. Close. Set cs+1=Hp(m,Ls,Rs)c_{s+1} = \mathsf{H}_p(m, L_s, R_s), propagate to obtain csc_s, compute rs=αcssks(mod)r_s = \alpha - c_s \mathsf{sk}_s \pmod{\ell}.
  5. Output. σring=(I,c1,r1,,rn)\sigma_{\text{ring}} = (I, c_1, r_1, \ldots, r_n).

Verify. Recompute every Li,Ri,ci+1L_i, R_i, c_{i+1}. Accept iff cn+1=c1c_{n+1} = c_1.

Signature size. IGI \in \mathbb{G} (32 B compressed) + c1Zc_1 \in \mathbb{Z}_\ell (32 B) + nn scalars rir_i (32 B each) = 64+32n64 + 32n bytes.

Solana transaction-size constraint

With ~300 bytes reserved for transaction metadata + nullifiers + Groth16 proof + recent blockhash, ~930 bytes are available for the ring signature inside the 1,232-byte limit:

nmax  =  9306432  =  27.n_{\max} \;=\; \left\lfloor \frac{930 - 64}{32} \right\rfloor \;=\; 27.

Under SIMD-0296 (4,096-byte transactions, approved late 2025), this jumps to nmax119n_{\max} \approx 119.

Verification cost: each ring member needs 2 scalar multiplications + 1 hash ≈ 5,300 CU. For n=27n = 27, that’s 143,100\sim 143{,}100 CU on top of the ~150,000-200,000 CU for SPST verification. Total: ~340,000 CU — about 24% of the 1.4M CU budget.

Theorem 3.9 — Ring anonymity

Statement. In the random oracle model, for any ring RR, any indices i,j[n]i, j \in [n], and any PPT distinguisher D\mathcal{D}:

Pr[D(m,R,RingSign(ski,m,R))=1]Pr[D(m,R,RingSign(skj,m,R))=1]=0.\bigl|\Pr[\mathcal{D}(m, R, \mathsf{RingSign}(\mathsf{sk}_i, m, R)) = 1] - \Pr[\mathcal{D}(m, R, \mathsf{RingSign}(\mathsf{sk}_j, m, R)) = 1]\bigr| = 0.

Perfect (information-theoretic) anonymity in the ROM.

Proof sketch (two steps).

Step 1 — Key image indistinguishability. Is=sksHG(pks)I_s = \mathsf{sk}_s \cdot \mathsf{H}_G(\mathsf{pk}_s). Since HG\mathsf{H}_G is a random oracle independent of GG, HG(pks)\mathsf{H}_G(\mathsf{pk}_s) is a uniform random group element. The product sksHG(pks)\mathsf{sk}_s \cdot \mathsf{H}_G(\mathsf{pk}_s) is uniform over G\mathbb{G} from the adversary’s view (one-more discrete-log assumption).

Step 2 — Transcript simulation. For any ss, the tuple (c1,r1,,rn)(c_1, r_1, \ldots, r_n) is uniform over Z2n\mathbb{Z}_\ell^{2n} subject to the ring-closure constraint. The simulator Sim(m,R)\mathsf{Sim}(m, R) that knows no secret key produces an identically distributed output by sampling all (ci,ri)(c_i, r_i) uniformly and programming the random oracle to close the ring. The marginal distributions are identical for every s[n]s \in [n], so AdvDanon=0\mathsf{Adv}_{\mathcal{D}}^{\text{anon}} = 0. ∎

Corollary. Ring signature of size nn provides log2(n)\log_2(n) bits of submitter anonymity. For n=27n = 27 that’s 4.75\sim 4.75 bits; for n=119n = 119 (SIMD-0296) that’s 6.9\sim 6.9 bits. Real-world anonymity is bounded by side-channel leakage (timing, IP) but the on-chain view alone provides exactly log2(n)\log_2(n).

The signer is anonymous among the ring. The ring is public. The cost is linear in ring size.

Approach B — FROST threshold Schnorr (TAB proper)

Ring signatures grow linearly with nn. For high-throughput deployments where n27n \gg 27 is desired, we want a constant-size signature. Threshold Schnorr is the answer.

Setup. nn participants run a one-time Distributed Key Generation (Feldman VSS) producing:

  • A group public key pkgroup=skgroupG\mathsf{pk}_{\text{group}} = \mathsf{sk}_{\text{group}} \cdot G (the group secret is never reconstructed).
  • Individual shares skshare,i\mathsf{sk}_{\text{share},i} for each participant.
  • A threshold tnt \leq n.

Sign (FROST round structure): Any subset T[n]T \subseteq [n] with T=t|T| = t can co-produce a Schnorr signature on message mm:

  1. Commitment round. Each iTi \in T samples nonces di,eiRZd_i, e_i \xleftarrow{R} \mathbb{Z}_\ell and broadcasts Di=diGD_i = d_i G, Ei=eiGE_i = e_i G.
  2. Signing round. Each ii computes ρi=H(i,m,{(Dj,Ej)}jT),R=jT(Dj+ρjEj),\rho_i = \mathsf{H}(i, m, \{(D_j, E_j)\}_{j \in T}), \quad R = \sum_{j \in T} (D_j + \rho_j E_j), c=H(R,pkgroup,m),λi=jT{i}jji(mod),c = \mathsf{H}(R, \mathsf{pk}_{\text{group}}, m), \quad \lambda_i = \prod_{j \in T \setminus \{i\}} \frac{j}{j - i} \pmod \ell, zi=di+ρiei+cλiskshare,i(mod).z_i = d_i + \rho_i e_i + c \lambda_i \mathsf{sk}_{\text{share},i} \pmod \ell.
  3. Combine. σthreshold=(R,z)\sigma_{\text{threshold}} = (R, z) with z=iTziz = \sum_{i \in T} z_i.

Verify. Standard Schnorr verification against pkgroup\mathsf{pk}_{\text{group}}:

zG  =?  R+cpkgroup.z G \;\stackrel{?}{=}\; R + c \cdot \mathsf{pk}_{\text{group}}.

Signature size. (R,z)(R, z) = 32 + 32 = 64 bytes. Independent of nn and tt. Identical to a standard Ed25519 signature.

Theorem 3.10 — TAB privacy

Statement. For any two subsets T,T[n]T, T' \subseteq [n] with T=T=t|T| = |T'| = t, and any PPT A\mathcal{A} controlling up to t1t-1 participants, the threshold signature produced by TT is computationally indistinguishable from the one produced by TT'.

Proof structure. Hybrid argument over the FROST protocol:

  • Hybrid 0: real TT. Adversary observes final (R,z)(R, z) + t1t-1 partial signatures from corrupted parties.
  • Hybrid 1: replace RR with a uniform random G\mathbb{G} element. Honest participants’ nonces dj,ejd_j, e_j for jTCj \in T \setminus \mathcal{C} are uniform; sum is uniform. Distribution identical.
  • Hybrid 2: replace zz with the deterministic value z=R/G+cskgroupz = R/G + c \cdot \mathsf{sk}_{\text{group}} (well-defined given R,c,pkgroupR, c, \mathsf{pk}_{\text{group}}). Same distribution.
  • Hybrid 3: real TT'. Same argument.

Honest partial signatures are never revealed to A\mathcal{A} (they’re consumed in combination). The final (R,z)(R, z) depends only on the honest contribution to RR — uniform regardless of TT. ∎

Anonymity: Unbounded. As long as Tt|T| \geq t and at least one honest participant in TT exists, the adversary cannot determine which subset signed. With nn in the thousands and tt in the hundreds, T|T| choices are combinatorial and indistinguishable.

Tradeoffs at a glance

AspectProsCons
Signature size TAB: O(1) = 64 B (constant) Ring: O(n) = 64 + 32n B
Verification cost TAB: 1 scalar mul + 1 hash (≈2,500 CU) Ring: n × (2 scalar mul + 1 hash) (≈5,300n CU)
Interaction Ring: non-interactive TAB: 2 rounds of signing + O(n²) DKG once
Anonymity guarantee Both: perfect (ROM)
Max ring/group size on Solana TAB: unbounded (sig is 64 B) Ring: ~27 (1,232 B) or ~119 (SIMD-0296)
Trust model Ring: no setup trust TAB: DKG integrity (Feldman VSS verifiability)
Linkability Ring: same signer → same key image (anti-sybil) TAB: signatures unlinkable across transactions

Why both, not one or the other

The two approaches cover different deployment regimes:

  • Bootstrapping / low coordination: ring signatures. No DKG required; any user can sign with any ring composed of nn on-chain pubkeys. Anonymity scales to the size of the ring you can pack into the transaction.
  • Established network with stable participants: TAB / FROST. One-time DKG cost amortises across all transactions; signatures are minimum-size; anonymity is bounded by the group size, not the transaction size.

In practice, F_RP starts in the ring-signature regime and migrates to TAB once the network has enough committed participants for a meaningful DKG. The constructions are not mutually exclusive — the on-chain verifier can accept either type and the wrapping Solana transaction looks identical in size in the TAB case.

What’s still missing

Even with TAB, two leakage channels remain:

  1. Network metadata. The TCP/QUIC packet that hits a Solana RPC node has a source IP. Without Tor, I2P, or Dandelion++, that IP links directly to the user. Post 6 addresses this with verifiable shuffles at the network layer.
  2. Timing correlation. A user who shields and spends within the same minute is still linkable via temporal proximity, regardless of how many ring members they hide in. Mitigations are about user behaviour and client-side delay sampling.

Bibliography

  • Fujisaki, E., Suzuki, K. (2007). Traceable Ring Signature. PKC 2007.
  • Komlo, C., Goldberg, I. (2020). FROST: Flexible Round-Optimized Schnorr Threshold Signatures. SAC 2020. https://eprint.iacr.org/2020/852
  • Feldman, P. (1987). A Practical Scheme for Non-Interactive Verifiable Secret Sharing. FOCS 1987.
  • Goodell, B., Noether, S. (2020). Concise Linkable Ring Signatures and Forgery Against Adversarial Keys (CLSAG). https://eprint.iacr.org/2019/654
  • Bernstein, D. J. et al. (2012). High-speed high-security signatures. Journal of Cryptographic Engineering.

Previous: PPST: private programmable state ← · Next: Bayer-Groth verifiable shuffles →

Hire me — book a 30-min call $ book →