DOC# TABTHR SLUG tab_threshold_anonymous_broadcast PRINTED 2026-05-06 03:47 UTC

TAB: hiding the submitter with ring signatures and FROST

F_RP Construction III. ZK proofs hide the contents but the wrapping Solana tx still leaks the submitter pubkey. TAB closes that gap with a Fujisaki-Suzuki ring signature and a FROST threshold Schnorr over Ed25519.

FROM
Dax the Dev <[email protected]>
SOURCE
https://blog.skill-issue.dev/blog/tab_threshold_anonymous_broadcast/
FILED
2026-05-04 16:30 UTC
REVISED
2026-05-04 16:30 UTC
TIME
8 min read
SERIES
relayerless-privacy
TAGS
#zk #cryptography #ring-signatures #frost #monero #anonymity #phd

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:

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:

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:

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

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

← Back to article