falcon-multisig 0.1.0

Production-grade post-quantum threshold multisignature library using Falcon-512 (NIST FIPS 206 / FN-DSA)
Documentation
//! Bridge validator example — 4-of-7 cross-chain message authorisation.
//!
//! Demonstrates a production cross-chain bridge scenario: 7 validators must
//! reach a 4-of-7 supermajority to authorise a cross-chain transfer message.

use falcon_multisig::{KeyPair, SigningSession, ThresholdConfig};

fn main() {
    println!("falcon-multisig — Cross-chain bridge validator example (4-of-7)");
    println!("{}", "=".repeat(65));

    // 1. Validator committee setup.
    let total = 7;
    let required = 4;

    println!("\n[1] Generating {total} validator keypairs...");
    let keypairs: Vec<KeyPair> = (0..total).map(|_| KeyPair::generate()).collect();
    let public_keys: Vec<_> = keypairs.iter().map(|kp| kp.public_key().clone()).collect();
    let config = ThresholdConfig::new(required, public_keys).unwrap();

    println!("    Policy   : {}", config.policy());
    println!("    Bridge ID: {}", config.address());

    // 2. Construct the cross-chain message.
    //    In production this would be a serialised cross-chain message with
    //    source chain ID, destination chain ID, nonce, and asset details.
    let message = b"BRIDGE:src=1:dst=42161:asset=ETH:amount=5000000:nonce=9912:receiver=0xABCD";
    println!("\n[2] Cross-chain message (hex):");
    println!("    {}", hex::encode(message));

    // 3. Validators sign independently.
    println!("\n[3] Collecting validator signatures...");
    let mut session = SigningSession::new(&config, message);

    // Validators 0, 1, 3, 5 respond; validators 2, 4, 6 are offline.
    let participating = [0usize, 1, 3, 5];
    for &i in &participating {
        let sig = keypairs[i].sign(message);
        session.add_signature(i, sig).unwrap();
        let (have, need) = session.progress();
        println!("    Validator {i} signed — progress: {have}/{need}");
    }

    // 4. Verify.
    println!("\n[4] Verifying supermajority...");
    match session.verify() {
        Ok(true) => {
            println!("    Supermajority reached: {}/{}", required, total);
            println!("    Cross-chain transfer authorised.");
            println!("    Active validators: {:?}", session.signed_indices());
        }
        Err(e) => {
            eprintln!("    Verification error: {e}");
            std::process::exit(1);
        }
        Ok(false) => unreachable!(),
    }
}