LPsLux Proposals
Threshold Cryptography
LP-7104

FROST Threshold Signatures

Review

Round-optimized Schnorr threshold signatures for EdDSA with Taproot support

Category
Core
Created
2025-08-14

See also: LP-14, LP-103, LP-INDEX

Abstract

This proposal introduces the FROST (Flexible Round-Optimized Schnorr Threshold) protocol implementation in Lux Network's threshold cryptography suite. FROST provides efficient threshold signatures for Schnorr and EdDSA signature schemes, achieving optimal round complexity with only 2 rounds for signing. The protocol includes native support for Bitcoin Taproot (BIP-340) signatures, making it ideal for Bitcoin interoperability. FROST complements CGG21 (LP-14) for ECDSA and MPC-LSS (LP-103) for dynamic resharing, providing a complete threshold signature solution.

Motivation and Rationale

FROST addresses specific requirements not fully met by ECDSA-based threshold schemes:

  1. Schnorr/EdDSA Native: Direct support for Schnorr signatures without complex MPC
  2. Optimal Rounds: Only 2 rounds for signing (minimum possible for threshold)
  3. Taproot Compatibility: Native BIP-340 support for Bitcoin integration
  4. Linearity Benefits: Schnorr's linear structure enables efficient aggregation
  5. Proven Security: Strong security proofs in the Random Oracle Model

Key advantages over ECDSA threshold schemes:

  • Simplicity: No need for multiplicative-to-additive share conversion
  • Efficiency: Fewer rounds and simpler operations
  • Aggregation: Multiple signatures can be efficiently combined
  • Deterministic Nonces: Optional deterministic nonce generation for security

Technical Specification

Mathematical Foundation

FROST leverages Schnorr signatures' linear structure:

  • Private key: x
  • Public key: Y = x·G
  • Signature: (R, z) where R = r·G and z = r + cx
  • Challenge: c = H(R, Y, m)
  • Verification: z·G = R + c·Y

The linearity of the signing equation enables efficient threshold computation without complex MPC protocols required for ECDSA.

Core Protocol

1. Key Generation (DKG)

Input: Parties P = {p₁, ..., pₙ}, threshold t
Output: Share xᵢ for each party, public key Y

Phase 1 - Share Distribution:
Each party pᵢ:
1. Sample polynomial aᵢ(x) = aᵢ₀ + aᵢ₁x + ... + aᵢ,ₜ₋₁xᵗ⁻¹
2. Compute commitments Cᵢⱼ = aᵢⱼ·G for j ∈ [0, t-1]
3. Broadcast commitments {Cᵢⱼ}
4. Send share aᵢ(j) to party pⱼ

Phase 2 - Share Verification:
Each party pᵢ:
1. Verify received shares: aⱼ(i)·G = Σₖ Cⱼₖ·iᵏ
2. Compute final share: xᵢ = Σⱼ aⱼ(i)
3. Compute public key: Y = Σⱼ Cⱼ₀

Output: (xᵢ, Y)

2. Signing Protocol (2 Rounds)

Input: Message m, signers S ⊆ P with |S| = t
Output: Schnorr signature (R, z)

Round 1 - Commitment:
Each signer pᵢ ∈ S:
1. Sample nonces (dᵢ, eᵢ) ← Zₚ
2. Compute Dᵢ = dᵢ·G, Eᵢ = eᵢ·G
3. Broadcast (Dᵢ, Eᵢ)

Round 2 - Signing:
Each signer pᵢ ∈ S:
1. Compute binding values:
   ρᵢ = H₁(i, m, {(Dⱼ, Eⱼ)}ⱼ∈S)
2. Compute group commitment:
   R = Σⱼ∈S (Dⱼ + ρⱼ·Eⱼ)
3. Compute challenge:
   c = H₂(R, Y, m)
4. Compute Lagrange coefficient:
   λᵢ = Πⱼ∈S\{i} j/(j-i)
5. Compute response:
   zᵢ = dᵢ + eᵢ·ρᵢ + λᵢ·xᵢ·c
6. Broadcast zᵢ

Aggregation:
z = Σᵢ∈S zᵢ
Output: (R, z)

3. Taproot Support (BIP-340)

Taproot Adjustments:
1. Even Y-coordinate:
   If Y has odd y-coordinate, negate all shares: xᵢ = -xᵢ
   
2. X-only public key:
   Use only x-coordinate of Y for verification
   
3. Even R-coordinate:
   If R has odd y-coordinate, negate nonces: dᵢ = -dᵢ, eᵢ = -eᵢ
   
4. Tagged hash:
   c = TaggedHash("BIP0340/challenge", R.x || Y.x || m)
   
5. X-only signature:
   Output (R.x, z) instead of full (R, z)

Security Properties

Assumptions

  • Discrete Logarithm: Computing x from Y = x·G is hard
  • Random Oracle: Hash functions behave as random oracles
  • Honest Majority: At most t-1 corrupted parties

Security Guarantees

  1. Unforgeability: EUF-CMA secure under discrete log assumption
  2. Non-frameability: Honest parties cannot be framed
  3. Robustness: Protocol completes with t honest parties
  4. Privacy: Transcript reveals nothing beyond signature

Attack Mitigation

Canonical Point Hashing (Critical Fix)

Our implementation addresses a critical vulnerability in point serialization:

// WRONG: Different representations hash differently
rhoHash.WriteAny(D[i], E[i])  // May use affine or projective

// CORRECT: Always use canonical encoding
dBytes, _ := D[i].MarshalBinary()  // Canonical bytes
eBytes, _ := E[i].MarshalBinary()
rhoHash.WriteAny(dBytes, eBytes)

This ensures all parties compute identical binding values ρ, preventing signature failures.

Rogue Key Attacks
  • Prevented by commitment phase in DKG
  • Verified through zero-knowledge proofs of knowledge
Replay Attacks
  • Fresh nonces for each signature
  • Binding values include message to prevent reuse

Implementation Details

Configuration Structure

type Config struct {
    ID           party.ID
    Threshold    int
    PrivateShare curve.Scalar
    PublicKey    curve.Point
    Parties      map[party.ID]*Public
    Taproot      bool  // Enable BIP-340 mode
}

type TaprootConfig struct {
    Config
    PublicKey    *taproot.PublicKey  // X-only coordinate
}

Performance Characteristics

OperationRoundsCommunicationComputation
Keygen2O(n²)O(nt) exp
Sign2O(t²)O(t) exp
Verify0-2 exp
Refresh2O(n²)O(nt) exp

Benchmarks (3-of-5 threshold):

  • Keygen: ~50ms
  • Sign: ~20ms
  • Verify: ~2ms

Comparison with Other Protocols

FeatureFROSTCGG21/CMPMPC-LSSECDSA (GG18)
Signature SchemeSchnorr/EdDSAECDSASchnorrECDSA
Signing Rounds2 ✅5-829
PreprocessingOptionalRequiredNoRequired
CommunicationO(t²)O(n²)O(t²)O(n²)
Taproot SupportNative ✅NoNoNo
Dynamic ReshareNoNoYes ✅No
Identifiable AbortPartialYes ✅YesNo
ComplexityLow ✅HighLowHigh

Use Cases in Lux Network

  1. Bitcoin Integration: Native Taproot support for Bitcoin bridges
  2. Lightning Network: Schnorr signatures for payment channels
  3. Cross-Chain: EdDSA for Solana, Near, and other chains
  4. Aggregated Signatures: Multi-signature aggregation for scalability
  5. Fast Signing: 2-round protocol ideal for time-sensitive operations

Integration Architecture

┌─────────────────────────────────────────┐
│            Lux T-Chain MVM              │
├─────────────────────────────────────────┤
│      Threshold Signature Manager         │
├──────────┬──────────┬──────────┬────────┤
│  FROST   │  CGG21   │ MPC-LSS  │  BLS   │
│ Schnorr  │  ECDSA   │ Dynamic  │  Agg   │
├──────────┴──────────┴──────────┴────────┤
│         Common Infrastructure            │
│  (Networking, Storage, Consensus)        │
└─────────────────────────────────────────┘

Test Coverage and Validation

Our FROST implementation includes comprehensive testing:

Test Statistics

  • 45+ test functions covering all protocol phases
  • 100% passing rate with zero skipped tests
  • Canonical hashing fix preventing signature failures
  • Benchmarks for all operations at various scales

Critical Test Scenarios

  1. Exact threshold signing (t-of-n)
  2. All parties signing (n-of-n)
  3. Taproot compatibility tests
  4. Concurrent signing operations
  5. Byzantine fault scenarios
  6. Network partition recovery

Verified Properties

  • Signatures verify correctly with exactly t signers
  • Taproot signatures compatible with Bitcoin
  • Canonical point encoding prevents failures
  • Lagrange coefficients computed correctly

Specification

The normative behavior is defined in Technical Specification and Core Protocol (Key Generation, 2‑round Signing, Taproot adjustments). Implementations MUST follow the stated algorithms, including binding values, canonical encoding, and challenge computation.

Rationale

FROST is selected for Schnorr/EdDSA due to minimal round complexity and native Taproot support. It complements CGG21 (ECDSA) and MPC‑LSS (dynamic resharing) to cover all Lux threshold signature needs with simpler, faster signing where Schnorr is available.

Backwards Compatibility

This LP is additive. Existing ECDSA‑based flows remain unchanged. Adoption can be incremental per subsystem; Taproot mode is opt‑in via configuration and does not alter existing key material.

Implementation Status

The FROST protocol is production-ready in the Lux threshold library:

  • Repository: github.com/luxfi/threshold
  • Package: protocols/frost
  • Files: 34 Go files across 3 directories
  • Features: Complete Schnorr, EdDSA, and Taproot support
  • Testing: 100% test coverage, zero skips
  • Performance: Sub-100ms signing latency

File Inventory

protocols/frost/
├── frost.go                   # Entry points: Keygen(), Sign()
├── fix_keygen_shares.go       # Share correction utilities
├── fix_verification_shares.go # Verification share fixes
├── test_frost_equation.go     # Equation verification
├── *_test.go                  # Test suites (34+ test files)
├── keygen/
│   ├── keygen.go              # Keygen StartFunc
│   ├── config.go              # Configuration types
│   └── round1.go - round3.go  # 3-round DKG protocol
└── sign/
    ├── sign.go                # Sign StartFunc
    ├── types.go               # Signing types
    └── round1.go - round3.go  # 3-round signing (2 communication + 1 aggregation)

Key Components

ComponentPathPurpose
Keygenprotocols/frost/keygen/Distributed key generation (3 rounds)
Signprotocols/frost/sign/Threshold signing (3 rounds)
Configprotocols/frost/keygen/config.goConfiguration and state
Taprootpkg/taproot/BIP-340 x-only keys and signatures

Round Details

Keygen (3 rounds):

  • Round 1: Generate polynomial, broadcast commitments
  • Round 2: Distribute shares, verify commitments
  • Round 3: Aggregate shares, output config

Sign (3 rounds - 2 communication):

  • Round 1: Generate and broadcast nonce commitments (Dᵢ, Eᵢ)
  • Round 2: Compute binding values, response zᵢ, broadcast
  • Round 3: Local aggregation to final signature (R, z)

ThresholdVM Integration

FROST is integrated into T-Chain (ThresholdVM) via:

  • Executor: node/vms/thresholdvm/executor.go

    • FROSTKeygenStartFunc() - Creates FROST keygen protocol runner
    • FROSTSignStartFunc() - Creates FROST signing protocol runner
    • FROSTKeyShare wrapper implements KeyShare interface
  • Usage in VM:

executor := NewProtocolExecutor(pool)
startFunc := executor.FROSTKeygenStartFunc(selfID, participants, threshold)
handler, err := protocol.NewMultiHandler(startFunc, sessionID)

Testing

# Test keygen protocol
go test ./protocols/frost/keygen -v

# Test signing
go test ./protocols/frost/sign -v

# Test full FROST protocol
go test ./protocols/frost -v

# Performance benchmarks
go test ./protocols/frost -bench=. -benchmem

# Run specific test (e.g., threshold test)
go test ./protocols/frost -run Threshold -v
  • LP-7014: CMP/CGG21 Protocol (ECDSA threshold)
  • LP-7103: LSS Protocol (dynamic resharing)
  • LP-7330: T-Chain ThresholdVM (VM integration)
  • LP-13: T-Chain Specification

Future Enhancements

Planned Features

  1. Preprocessing Pool: Pre-computed nonces for instant signing
  2. Signature Aggregation: Combine multiple FROST signatures
  3. Batch Verification: Verify multiple signatures efficiently
  4. Deterministic Nonces: RFC 6979 style deterministic nonces

Research Directions

  1. ROAST: Robust asynchronous Schnorr threshold
  2. MuSig2: Two-round multi-signatures
  3. Adaptor Signatures: Conditional signature release
  4. Blind Signatures: Privacy-preserving signatures

Security Considerations

Best Practices

  1. Fresh Randomness: Use cryptographically secure RNG for nonces
  2. Canonical Encoding: Always hash canonical point representations
  3. Concurrent Security: Prevent nonce reuse across sessions
  4. Side Channels: Constant-time implementations

Audit Recommendations

  1. Review nonce generation for bias
  2. Verify canonical point encoding
  3. Check Lagrange coefficient computation
  4. Validate challenge domain separation

Conclusion

FROST provides optimal-round threshold signatures for Schnorr and EdDSA, with native Taproot support crucial for Bitcoin integration. Combined with CGG21 for ECDSA (LP-14) and MPC-LSS for dynamic resharing (LP-103), Lux Network offers a comprehensive threshold cryptography suite supporting all major signature schemes. The implementation is production-ready with extensive testing, including critical fixes for canonical point hashing that ensure reliable operation.

References

  1. Komlo, C., & Goldberg, I. (2020). FROST: Flexible Round-Optimized Schnorr Threshold Signatures. SAC 2020, Cryptology ePrint 2020/852.
  2. Bellare, M., & Neven, G. (2006). Multi-Signatures in the Plain Public-Key Model. CRYPTO 2006.
  3. Nick, J., Ruffing, T., & Seurin, Y. (2021). MuSig2: Simple Two-Round Schnorr Multi-Signatures. CRYPTO 2021.
  4. Ruffing, T., Ronge, V., Jin, E., Schneider-Bensch, J., & Schröder, D. (2022). ROAST: Robust Asynchronous Schnorr Threshold Signatures. CCS 2022.
  5. BIP-340. Schnorr Signatures for secp256k1. Bitcoin Improvement Proposal.
  6. BIP-341. Taproot: SegWit version 1 spending rules. Bitcoin Improvement Proposal.
  7. Bernstein, D. J., et al. (2012). High-speed high-security signatures. Journal of Cryptographic Engineering.
  8. Boneh, D., Drijvers, M., & Neven, G. (2018). Compact Multi-signatures for Smaller Blockchains. ASIACRYPT 2018.
  9. Drijvers, M., et al. (2019). On the Security of Two-Round Multi-Signatures. IEEE S&P 2019.
  10. Stinson, D. R., & Strobl, R. (2001). Provably Secure Distributed Schnorr Signatures. ICALP 2001.

Test Cases

Unit Tests

  1. Key Generation

    • Test DKG protocol
    • Verify share distribution
    • Test threshold parameters
  2. Signing Protocol

    • Test partial signature generation
    • Verify signature aggregation
    • Test malicious party detection
  3. Key Management

    • Test key refresh
    • Verify resharing protocol
    • Test party rotation

Integration Tests

  1. Threshold Operations

    • Test multi-party signing
    • Verify liveness guarantees
    • Test network partition handling
  2. Cross-Chain Custody

    • Test bridged asset signing
    • Verify multi-chain coordination
    • Test emergency recovery

Copyright and related rights waived via CC0.