QSOLANA devnet

An experimental Solana devnet with native post-quantum signature checks: Falcon-512 and ML-DSA verification as syscalls, and transactions up to 4,096 bytes.

Experimental. This is a single-node test chain run by the QSOLANA project. It is not Solana mainnet or devnet, and it is not affiliated with the Solana Foundation or Anza. Its SOL has no value, there is no uptime guarantee, and the chain is reset when the validator build changes.

Endpoints

JSON-RPChttps://rpc.bb84.fun
WebSocketwss://rpc.bb84.fun
Explorerexplorer.solana.com with this RPC
ValidatorAgave 4.1.2 (solana-test-validator) with the QSOLANA patch, every feature on

Limits: 20 requests per second per IP (bursts of 40), 20 open connections per IP, 16 KB per request. Airdrops: at most 5 SOL per request and 2,000 SOL per hour for everyone together.

Quick start

Any recent Solana CLI works for accounts, transfers and airdrops:

solana config set --url https://rpc.bb84.fun
solana-keygen new -o ~/qsolana-test.json      # a fresh key, only for this devnet
solana config set --keypair ~/qsolana-test.json
solana airdrop 2
solana balance

What's different from Solana

Falcon-512: sol_falcon512_verify

ML-DSA (FIPS 204): sol_mldsa_verify

Declare both with solana-define-syscall:

solana_define_syscall::define_syscall!(fn sol_falcon512_verify(
    signature_addr: *const u8, public_key_addr: *const u8,
    message_addr: *const u8, message_len: u64) -> u64);

solana_define_syscall::define_syscall!(fn sol_mldsa_verify(
    param_set: u64, signature_addr: *const u8, public_key_addr: *const u8,
    message_addr: *const u8, message_len: u64) -> u64);

// sig: &[u8; 2420], pk: &[u8; 1312] (check the lengths first: the syscall reads exactly these)
let valid = unsafe {
    sol_mldsa_verify(44, sig.as_ptr(), pk.as_ptr(), msg.as_ptr(), msg.len() as u64)
} == 0;

Transactions up to 4,096 bytes (Transaction V1, SIMD-0385)

const message = pipe(
  createTransactionMessage({ version: 1 }),
  (m) => setTransactionMessageFeePayer(payer, m),
  (m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),
  (m) => appendTransactionMessageInstructions(instructions, m),
  (m) => setTransactionMessageConfig(
    { computeUnitLimit: 200_000, loadedAccountsDataSizeLimit: 64 * 1024 * 1024 }, m),
);

@solana/web3.js 1.x and the stock solana CLI can't build V1 transactions.

Deploy your own program

./solana program deploy --use-rpc target/deploy/your_program.so

QSOLANA CLI download

Preloaded programs

The QSOLANA demo programs are deployed at genesis. Their client code is not public yet.

ProgramAddress
qpt: post-quantum vault and smart account, ML-DSA-44 (sol_mldsa_verify)Hb9rC36NWGjnhbCi6efYgXdya7WQQvKGcNdUDpHbzo23
qpt: Falcon-512 (sol_falcon512_verify)DBr62WF4f6s3aufLrcNT1Lgf8z35ZjTFiQygBVswGckH
qpt: Falcon-512 verified in the program (blueshift)E4cwdChwHz3bqfeLUdJcRnPSsgKBEz7mwov1qCHgEmsK
qpt: FN-DSA verified in the program (fn-dsa)BfcVJr4WTEJyZfDZ1LtnnmqCiDsVBiHtxiLM7KesoFqG
qproof: QPU job receipts6pxqWGoxSRBwmL6GJie9BD43HGe3ybFu9xmJQ24TvcXB
qentropy: entropy providersFZXp8BVcsPZcE6ZP4wCYouMsupGEGKSZFwNfzNaoiQmm
pq_memo: post-quantum-approved memosBbRYWUwB4nfE8FBUvxXL61zz5aBJ3tTiGutnq34q4rdj

Measured on this build

Vault withdrawal (whole transaction)Compute units
ML-DSA-44, native syscall (one 2,688-byte V1 transaction)9,344
Falcon-512, native syscall6,208
Falcon-512, verified in the program298,000–308,000

ML-DSA-44 verified inside a normal program needs 2.38M CU, over the 1.4M transaction limit.

Still not quantum-proof

Fee payers, transaction signatures and validator votes here are still Ed25519, as on Solana. The post-quantum checks protect what a program checks them for, such as a vault after its owner switches off the Ed25519 key.

State: kept across restarts, reset when the validator build changes. Current chain started 2026-11-13.