From 20a436781bf8250ef4cdc48cd51b53138755885d Mon Sep 17 00:00:00 2001 From: Magamedrasul Ibragimov Date: Wed, 16 Nov 2022 19:21:58 +0300 Subject: [PATCH] feat: add test with poseidon --- Cargo.toml | 2 + tests/poseidon.rs | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 tests/poseidon.rs diff --git a/Cargo.toml b/Cargo.toml index 46dcf85..14e7913 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,5 @@ edition = "2021" hex-literal = "0.3.4" tiny-keccak = { version = "2.0.2", features = ["keccak"] } sled = "0.34.7" +rln = { git = "https://github.com/vacp2p/zerokit", rev = "490206a" } +ark-serialize = "0.3.0" \ No newline at end of file diff --git a/tests/poseidon.rs b/tests/poseidon.rs new file mode 100644 index 0000000..e6e7978 --- /dev/null +++ b/tests/poseidon.rs @@ -0,0 +1,97 @@ +use pmtree::*; + +use rln::circuit::Fr; +use rln::poseidon_hash::poseidon_hash; + +use std::collections::HashMap; +use std::io::Cursor; +use std::str::{self, FromStr}; + +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; + +struct MemoryDB(HashMap); + +#[derive(Clone, Copy, PartialEq, Eq)] +struct PoseidonHash; + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +struct MyFr(Fr); + +impl Hasher for PoseidonHash { + type Fr = MyFr; + + fn default_leaf() -> Self::Fr { + MyFr(Fr::from(0)) + } + + fn hash(inputs: &[Self::Fr]) -> Self::Fr { + MyFr(poseidon_hash( + &inputs.iter().map(|&x| x.0).collect::>(), + )) + } +} + +impl From> for MyFr { + fn from(v: Vec) -> Self { + let c = Cursor::new(v); + let f = Fr::deserialize(c).unwrap(); + MyFr(f) + } +} + +impl From for Vec { + fn from(v: MyFr) -> Self { + let mut buf = vec![]; + + Fr::serialize(&v.0, &mut buf).unwrap(); + + buf + } +} + +impl Database for MemoryDB { + fn new(_dbpath: &str) -> Result { + Ok(MemoryDB(HashMap::new())) + } + + fn load(_dbpath: &str) -> Result { + Err(Error("Cannot load in-memory DB".to_string())) + } + + fn get(&self, key: DBKey) -> Result> { + Ok(self.0.get(&key).cloned()) + } + + fn put(&mut self, key: DBKey, value: Value) -> Result<()> { + self.0.insert(key, value); + + Ok(()) + } +} + +#[test] +fn poseidon_memory() -> Result<()> { + let mut mt = MerkleTree::::new(2, "abacaba")?; + + assert_eq!(mt.capacity(), 4); + assert_eq!(mt.depth(), 2); + + let leaves = vec![ + MyFr(Fr::from_str("12345").unwrap()), + MyFr(Fr::from_str("67891").unwrap()), + MyFr(Fr::from_str("23456").unwrap()), + MyFr(Fr::from_str("78912").unwrap()), + ]; + + mt.update_next(leaves[0])?; + + // for &leaf in &leaves { + // mt.update_next(leaf)?; + // } + + // for (i, leaf) in leaves.iter().enumerate() { + // assert!(mt.verify(leaf, &mt.proof(i)?)); + // } + + Ok(()) +}