This is library with circuits and cryptography of ZeroPool.
Description of protocol https://hackmd.io/_Xm5DjqUTyykcBtDgMxLwA
JS binding available at https://github.com/zeropoolnetwork/libzeropool-rs
cargo test --release -- --nocapture test_circuit_tx_setup_and_proveBenchmark result on Intel Core i9-9880H
Time elapsed in setup() is: 48.573000645s
Time elapsed in prove() is: 6.915143894s
Time elapsed in verify() is: 5.104347ms
Example of key generation of keys and proof
#[test]fntest_circuit_tx_setup_and_prove(){fncircuit<C:CS<Fr=Fr>>(public:CTransferPub<C>,secret:CTransferSec<C>){c_transfer(&public,&secret,&*POOL_PARAMS);}letmut rng = thread_rng();let state = State::random_sample_state(&mut rng,&*POOL_PARAMS);let(public, secret) = state.random_sample_transfer(&mut rng,&*POOL_PARAMS);let ts_setup = Instant::now();let params = setup::<Bn256,_,_,_>(circuit);let duration = ts_setup.elapsed();println!("Time elapsed in setup() is: {:?}", duration);let ts_prove = Instant::now();let(inputs, snark_proof) = prover::prove(¶ms,&public,&secret, circuit);let duration = ts_prove.elapsed();println!("Time elapsed in prove() is: {:?}", duration);let ts_verify = Instant::now();let res = verifier::verify(¶ms.get_vk(),&snark_proof,&inputs);let duration = ts_verify.elapsed();println!("Time elapsed in verify() is: {:?}", duration);assert!(res,"Verifier result should be true");}#[test]fntest_encryption(){letmut rng = thread_rng();let sender_eta = rng.gen();let receiver_eta = rng.gen();letmut account:Account<Fr> = rng.gen();letmut note:Vec<Note<Fr>> = (0..2).map(|_| Note::sample(&mut rng,&*POOL_PARAMS)).collect();
account.eta = sender_eta;
note[0].p_d = derive_key_p_d(note[0].d.as_num().clone(), receiver_eta,&*POOL_PARAMS).x;let ciphertext = cipher::encrypt(&(0..32).map(|_| rng.gen()).collect::<Vec<_>>(), sender_eta, account,¬e,&*POOL_PARAMS);let result_out = cipher::decrypt_out(sender_eta,&ciphertext,&*POOL_PARAMS);assert!(result_out.is_some(),"Could not decrypt outgoing data.");let(account_out, note_out) = result_out.unwrap();assert!(note.len()==note_out.len() && note.iter().zip(note_out.iter()).all(|(l,r)| l==r) &&
account == account_out,"Wrong outgoing data decrypted");let result_out = cipher::decrypt_in(receiver_eta,&ciphertext,&*POOL_PARAMS);assert!(result_out.len()==2 && result_out[0].is_some() && result_out[0].unwrap()==note[0] && result_out[1].is_none(),"Wrong incoming data decrypted");}