use plonky2::field::goldilocks_field::GoldilocksField; use plonky2::plonk::config::PoseidonGoldilocksConfig; use plonky2::plonk::proof::Proof; pub type F = GoldilocksField; pub type Digest = [F; 4]; pub type C = PoseidonGoldilocksConfig; pub type PlonkyProof = Proof; #[derive(Debug, Clone)] pub struct Signal { pub nullifier: Digest, pub proof: PlonkyProof, } #[cfg(test)] mod tests { use anyhow::Result; use plonky2::field::types::{Field, Sample}; use plonky2::hash::merkle_tree::MerkleTree; use plonky2::hash::poseidon::PoseidonHash; use plonky2::plonk::config::Hasher; use crate::access_set::AccessSet; use crate::signal::{Digest, F}; #[test] fn test_semaphore() -> Result<()> { let n = 1 << 20; let private_keys: Vec = (0..n).map(|_| F::rand_array()).collect(); let public_keys: Vec> = private_keys .iter() .map(|&sk| { PoseidonHash::hash_no_pad(&[sk, [F::ZERO; 4]].concat()) .elements .to_vec() }) .collect(); let access_set = AccessSet(MerkleTree::new(public_keys, 0)); let i = 12; let topic = F::rand_array(); let (signal, vd) = access_set.make_signal(private_keys[i], topic, i)?; access_set.verify_signal(topic, signal, &vd) } }