Turn main into test
This commit is contained in:
parent
972b34238d
commit
1b0cf0a8fa
|
@ -13,9 +13,6 @@ categories = ["cryptography"]
|
||||||
readme = "Readme.md"
|
readme = "Readme.md"
|
||||||
license-file = "mit-license.md"
|
license-file = "mit-license.md"
|
||||||
|
|
||||||
[lib]
|
|
||||||
name = "semaphore"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ark-circom = { git = "https://github.com/gakonst/ark-circom", features=["circom-2"] }
|
ark-circom = { git = "https://github.com/gakonst/ark-circom", features=["circom-2"] }
|
||||||
ark-std = { version = "0.3.0", default-features = false, features = ["parallel"] }
|
ark-std = { version = "0.3.0", default-features = false, features = ["parallel"] }
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use num_bigint::{BigInt, Sign};
|
use num_bigint::{BigInt, Sign};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use poseidon_rs::{Poseidon};
|
use poseidon_rs::Poseidon;
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
|
|
||||||
use crate::util::{bigint_to_fr, fr_to_bigint};
|
use crate::util::{bigint_to_fr, fr_to_bigint};
|
||||||
|
|
55
src/lib.rs
55
src/lib.rs
|
@ -9,4 +9,57 @@ use ark_bn254::Parameters;
|
||||||
use ark_ec::bn::Bn;
|
use ark_ec::bn::Bn;
|
||||||
|
|
||||||
pub type Groth16Proof = ark_groth16::Proof<Bn<Parameters>>;
|
pub type Groth16Proof = ark_groth16::Proof<Bn<Parameters>>;
|
||||||
pub type EthereumGroth16Proof = ark_circom::ethereum::Proof;
|
pub type EthereumGroth16Proof = ark_circom::ethereum::Proof;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
use hash::*;
|
||||||
|
use hex_literal::hex;
|
||||||
|
use identity::*;
|
||||||
|
use poseidon_tree::*;
|
||||||
|
use protocol::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_end_to_end() {
|
||||||
|
// generate identity
|
||||||
|
let id = Identity::new(b"hello");
|
||||||
|
|
||||||
|
// generate merkle tree
|
||||||
|
const LEAF: Hash = Hash::from_bytes_be(hex!(
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
));
|
||||||
|
|
||||||
|
let mut tree = PoseidonTree::new(21, LEAF);
|
||||||
|
let (_, leaf) = id.commitment().to_bytes_be();
|
||||||
|
tree.set(0, leaf.into());
|
||||||
|
|
||||||
|
let merkle_proof = tree.proof(0).expect("proof should exist");
|
||||||
|
let root = tree.root().into();
|
||||||
|
|
||||||
|
// change signal and external_nullifier here
|
||||||
|
let signal = "xxx".as_bytes();
|
||||||
|
let external_nullifier = "appId".as_bytes();
|
||||||
|
|
||||||
|
let nullifier_hash = generate_nullifier_hash(&id, external_nullifier);
|
||||||
|
|
||||||
|
let config = SnarkFileConfig {
|
||||||
|
zkey: "./snarkfiles/semaphore.zkey".to_string(),
|
||||||
|
wasm: "./snarkfiles/semaphore.wasm".to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let proof =
|
||||||
|
generate_proof(&config, &id, &merkle_proof, external_nullifier, signal).unwrap();
|
||||||
|
let success = verify_proof(
|
||||||
|
&config,
|
||||||
|
&root,
|
||||||
|
&nullifier_hash,
|
||||||
|
signal,
|
||||||
|
external_nullifier,
|
||||||
|
&proof,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert!(success);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
60
src/main.rs
60
src/main.rs
|
@ -1,60 +0,0 @@
|
||||||
mod hash;
|
|
||||||
mod identity;
|
|
||||||
mod merkle_tree;
|
|
||||||
mod poseidon_tree;
|
|
||||||
mod protocol;
|
|
||||||
mod util;
|
|
||||||
|
|
||||||
use hash::*;
|
|
||||||
use hex_literal::hex;
|
|
||||||
use identity::*;
|
|
||||||
use num_bigint::{BigInt};
|
|
||||||
use poseidon_tree::*;
|
|
||||||
use protocol::*;
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
// generate identity
|
|
||||||
let id = Identity::new(b"hello");
|
|
||||||
dbg!(&id);
|
|
||||||
dbg!(id.commitment());
|
|
||||||
|
|
||||||
// generate merkle tree
|
|
||||||
const LEAF: Hash = Hash::from_bytes_be(hex!(
|
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
));
|
|
||||||
|
|
||||||
let mut tree = PoseidonTree::new(21, LEAF);
|
|
||||||
let (_, leaf) = id.commitment().to_bytes_be();
|
|
||||||
tree.set(0, leaf.into());
|
|
||||||
|
|
||||||
let root: BigInt = tree.root().into();
|
|
||||||
dbg!(root);
|
|
||||||
|
|
||||||
let merkle_proof = tree.proof(0).expect("proof should exist");
|
|
||||||
let root = tree.root().into();
|
|
||||||
|
|
||||||
// change signal and external_nullifier here
|
|
||||||
let signal = "xxx".as_bytes();
|
|
||||||
let external_nullifier = "appId".as_bytes();
|
|
||||||
|
|
||||||
let nullifier_hash = generate_nullifier_hash(&id, external_nullifier);
|
|
||||||
dbg!(&nullifier_hash);
|
|
||||||
|
|
||||||
let config = SnarkFileConfig {
|
|
||||||
zkey: "./snarkfiles/semaphore.zkey".to_string(),
|
|
||||||
wasm: "./snarkfiles/semaphore.wasm".to_string(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let proof = generate_proof(&config, &id, &merkle_proof, external_nullifier, signal).unwrap();
|
|
||||||
let success = verify_proof(
|
|
||||||
&config,
|
|
||||||
&root,
|
|
||||||
&nullifier_hash,
|
|
||||||
signal,
|
|
||||||
external_nullifier,
|
|
||||||
&proof,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
dbg!(success);
|
|
||||||
}
|
|
|
@ -10,7 +10,7 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use num_bigint::BigInt;
|
use num_bigint::BigInt;
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
/// Hash types, values and algorithms for a Merkle tree
|
/// Hash types, values and algorithms for a Merkle tree
|
||||||
pub trait Hasher {
|
pub trait Hasher {
|
||||||
|
|
|
@ -5,7 +5,7 @@ use crate::{
|
||||||
use ff::{PrimeField, PrimeFieldRepr};
|
use ff::{PrimeField, PrimeFieldRepr};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use poseidon_rs::{Fr, FrRepr, Poseidon};
|
use poseidon_rs::{Fr, FrRepr, Poseidon};
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
static POSEIDON: Lazy<Poseidon> = Lazy::new(Poseidon::new);
|
static POSEIDON: Lazy<Poseidon> = Lazy::new(Poseidon::new);
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ use color_eyre::Result;
|
||||||
use ethers_core::utils::keccak256;
|
use ethers_core::utils::keccak256;
|
||||||
use num_bigint::{BigInt, Sign};
|
use num_bigint::{BigInt, Sign};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use poseidon_rs::{Poseidon};
|
use poseidon_rs::Poseidon;
|
||||||
use std::{collections::HashMap, fs::File, ops::Shr};
|
use std::{collections::HashMap, fs::File, ops::Shr};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|
Loading…
Reference in New Issue