From bf1e184da976e672edabffd873d0223678b9e6ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vinh=20Tr=E1=BB=8Bnh?= <108657096+vinhtc27@users.noreply.github.com> Date: Mon, 28 Jul 2025 16:52:45 +0700 Subject: [PATCH] feat: resolve overlap between stateless and merkletree feature flags (#329) - Resolved overlap between stateless and merkletree feature flags. - Updated every testcase related to stateless feature. - Added compile-time feature check to avoid feature overlap. - Added --no-default-features for all builds in nightly-release.yml [(tested)](https://github.com/vacp2p/zerokit/actions/runs/16525062203). --------- Co-authored-by: Ekaterina Broslavskaya --- .github/workflows/nightly-release.yml | 16 +++++----------- rln-cli/Cargo.toml | 6 +++--- rln-cli/README.md | 2 +- rln-cli/src/examples/relay.rs | 3 +-- rln-cli/src/examples/stateless.rs | 21 +++++++++++---------- rln-wasm/Cargo.toml | 1 - rln-wasm/tests/browser.rs | 15 +++++++++------ rln-wasm/tests/node.rs | 15 +++++++++------ rln/Cargo.toml | 2 +- rln/Makefile.toml | 2 +- rln/src/lib.rs | 22 ++++++++++++++++++++++ rln/src/poseidon_tree.rs | 7 +++++-- rln/src/protocol.rs | 22 +++++++++++++--------- rln/src/public_api_tests.rs | 25 ++++++++++++++----------- rln/tests/ffi.rs | 27 ++++++++++++++++----------- rln/tests/poseidon_tree.rs | 2 ++ rln/tests/protocol.rs | 5 ++++- utils/Cargo.toml | 2 +- 18 files changed, 118 insertions(+), 77 deletions(-) diff --git a/.github/workflows/nightly-release.yml b/.github/workflows/nightly-release.yml index 83e15a2..0395475 100644 --- a/.github/workflows/nightly-release.yml +++ b/.github/workflows/nightly-release.yml @@ -34,9 +34,7 @@ jobs: run: make installdeps - name: Cross build run: | - FEATURES="${{ matrix.feature }}" - - cross build --release --target ${{ matrix.target }} --features $FEATURES --workspace --exclude rln-cli + cross build --release --target ${{ matrix.target }} --no-default-features --features ${{ matrix.feature }} --workspace --exclude rln-cli mkdir release cp target/${{ matrix.target }}/release/librln* release/ tar -czvf ${{ matrix.target }}-${{ matrix.feature }}-rln.tar.gz release/ @@ -76,9 +74,7 @@ jobs: run: make installdeps - name: Cross build run: | - FEATURES="${{ matrix.feature }}" - - cross build --release --target ${{ matrix.target }} --features $FEATURES --workspace --exclude rln-cli + cross build --release --target ${{ matrix.target }} --no-default-features --features ${{ matrix.feature }} --workspace --exclude rln-cli mkdir release cp target/${{ matrix.target }}/release/librln* release/ tar -czvf ${{ matrix.target }}-${{ matrix.feature }}-rln.tar.gz release/ @@ -122,12 +118,10 @@ jobs: sudo apt-get install -y binaryen - name: Build wasm package run: | - FEATURES="${{ matrix.feature }}" - - if [[ "$FEATURES" == *"parallel"* ]]; then + if [[ ${{ matrix.feature }} == *parallel* ]]; then env RUSTFLAGS="-C target-feature=+atomics,+bulk-memory,+mutable-globals" \ rustup run nightly wasm-pack build --release --target web --scope waku \ - --features $FEATURES -Z build-std=panic_abort,std + --features ${{ matrix.feature }} -Z build-std=panic_abort,std wasm-bindgen --target web --split-linked-modules --out-dir ./pkg \ ./target/wasm32-unknown-unknown/release/rln_wasm.wasm @@ -140,7 +134,7 @@ jobs: -exec sed -i.bak 's|await initWbg(module, memory);|await initWbg({ module, memory });|g' {} \; \ -exec rm -f {}.bak \; else - wasm-pack build --release --target web --scope waku --features $FEATURES + wasm-pack build --release --target web --scope waku --features ${{ matrix.feature }} fi sed -i.bak 's/rln-wasm/zerokit-rln-wasm/g' pkg/package.json && rm pkg/package.json.bak diff --git a/rln-cli/Cargo.toml b/rln-cli/Cargo.toml index 6a3e1fd..cd76ea5 100644 --- a/rln-cli/Cargo.toml +++ b/rln-cli/Cargo.toml @@ -13,7 +13,7 @@ path = "src/examples/stateless.rs" required-features = ["stateless"] [dependencies] -rln = { path = "../rln", version = "0.8.0", default-features = true } +rln = { path = "../rln", version = "0.8.0", default-features = false } zerokit_utils = { path = "../utils", version = "0.6.0", default-features = false } clap = { version = "4.5.41", features = ["cargo", "derive", "env"] } color-eyre = "0.6.5" @@ -21,5 +21,5 @@ serde_json = "1.0.141" serde = { version = "1.0", features = ["derive"] } [features] -default = [] -stateless = ["rln/stateless"] +default = ["rln/pmtree-ft", "rln/parallel"] +stateless = ["rln/stateless", "rln/parallel"] diff --git a/rln-cli/README.md b/rln-cli/README.md index 6a6a7d3..4cf2971 100644 --- a/rln-cli/README.md +++ b/rln-cli/README.md @@ -50,7 +50,7 @@ This example function similarly to the [Relay Example](#relay-example) but uses You can run the example using the following command: ```bash -cargo run --example stateless --features stateless +cargo run --example stateless --no-default-features --features stateless ``` ## CLI Commands diff --git a/rln-cli/src/examples/relay.rs b/rln-cli/src/examples/relay.rs index 925dc7e..4a4a621 100644 --- a/rln-cli/src/examples/relay.rs +++ b/rln-cli/src/examples/relay.rs @@ -7,13 +7,12 @@ use std::{ use clap::{Parser, Subcommand}; use color_eyre::{eyre::eyre, Report, Result}; -use rln::utils::IdSecret; use rln::{ circuit::Fr, hashers::{hash_to_field, poseidon_hash}, protocol::{keygen, prepare_prove_input, prepare_verify_input}, public::RLN, - utils::{fr_to_bytes_le, generate_input_buffer}, + utils::{fr_to_bytes_le, generate_input_buffer, IdSecret}, }; const MESSAGE_LIMIT: u32 = 1; diff --git a/rln-cli/src/examples/stateless.rs b/rln-cli/src/examples/stateless.rs index 6857f86..288a110 100644 --- a/rln-cli/src/examples/stateless.rs +++ b/rln-cli/src/examples/stateless.rs @@ -1,4 +1,5 @@ #![cfg(feature = "stateless")] + use std::{ collections::HashMap, io::{stdin, stdout, Cursor, Write}, @@ -6,16 +7,14 @@ use std::{ use clap::{Parser, Subcommand}; use color_eyre::{eyre::eyre, Result}; -use rln::utils::IdSecret; use rln::{ circuit::{Fr, TEST_TREE_HEIGHT}, - hashers::{hash_to_field, poseidon_hash}, - poseidon_tree::PoseidonTree, + hashers::{hash_to_field, poseidon_hash, PoseidonHash}, protocol::{keygen, prepare_verify_input, rln_witness_from_values, serialize_witness}, public::RLN, - utils::fr_to_bytes_le, + utils::{fr_to_bytes_le, IdSecret}, }; -use zerokit_utils::ZerokitMerkleTree; +use zerokit_utils::{OptimalMerkleTree, ZerokitMerkleProof, ZerokitMerkleTree}; const MESSAGE_LIMIT: u32 = 1; @@ -62,7 +61,7 @@ impl Identity { struct RLNSystem { rln: RLN, - tree: PoseidonTree, + tree: OptimalMerkleTree, used_nullifiers: HashMap<[u8; 32], Vec>, local_identities: HashMap, } @@ -71,11 +70,12 @@ impl RLNSystem { fn new() -> Result { let rln = RLN::new()?; let default_leaf = Fr::from(0); - let tree = PoseidonTree::new( + let tree: OptimalMerkleTree = OptimalMerkleTree::new( TEST_TREE_HEIGHT, default_leaf, - ConfigOf::::default(), - )?; + ConfigOf::>::default(), + ) + .unwrap(); Ok(RLNSystem { rln, @@ -132,7 +132,8 @@ impl RLNSystem { let rln_witness = rln_witness_from_values( identity.identity_secret_hash.clone(), - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x, external_nullifier, Fr::from(MESSAGE_LIMIT), diff --git a/rln-wasm/Cargo.toml b/rln-wasm/Cargo.toml index 1cc2ecc..320bffb 100644 --- a/rln-wasm/Cargo.toml +++ b/rln-wasm/Cargo.toml @@ -10,7 +10,6 @@ crate-type = ["cdylib", "rlib"] [dependencies] rln = { path = "../rln", version = "0.8.0", default-features = false, features = [ "stateless", - "fullmerkletree", ] } zerokit_utils = { path = "../utils", version = "0.6.0", default-features = false } num-bigint = { version = "0.4.6", default-features = false } diff --git a/rln-wasm/tests/browser.rs b/rln-wasm/tests/browser.rs index 4e6369e..8e2786e 100644 --- a/rln-wasm/tests/browser.rs +++ b/rln-wasm/tests/browser.rs @@ -4,8 +4,7 @@ mod tests { use js_sys::{BigInt as JsBigInt, Date, Object, Uint8Array}; use rln::circuit::{Fr, TEST_TREE_HEIGHT}; - use rln::hashers::{hash_to_field, poseidon_hash}; - use rln::poseidon_tree::PoseidonTree; + use rln::hashers::{hash_to_field, poseidon_hash, PoseidonHash}; use rln::protocol::{prepare_verify_input, rln_witness_from_values, serialize_witness}; use rln::utils::{bytes_le_to_fr, fr_to_bytes_le, IdSecret}; use rln_wasm::{ @@ -14,7 +13,9 @@ mod tests { }; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; use wasm_bindgen_test::{console_log, wasm_bindgen_test, wasm_bindgen_test_configure}; - use zerokit_utils::merkle_tree::merkle_tree::ZerokitMerkleTree; + use zerokit_utils::{ + OptimalMerkleProof, OptimalMerkleTree, ZerokitMerkleProof, ZerokitMerkleTree, + }; #[cfg(feature = "parallel")] use {rln_wasm::init_thread_pool, wasm_bindgen_futures::JsFuture, web_sys::window}; @@ -106,7 +107,8 @@ mod tests { // Create RLN instance for other benchmarks let rln_instance = wasm_new(zkey).expect("Failed to create RLN instance"); - let mut tree = PoseidonTree::default(TEST_TREE_HEIGHT).expect("Failed to create tree"); + let mut tree: OptimalMerkleTree = + OptimalMerkleTree::default(TEST_TREE_HEIGHT).expect("Failed to create tree"); // Benchmark wasm_key_gen let start_wasm_key_gen = Date::now(); @@ -137,13 +139,14 @@ mod tests { let signal: [u8; 32] = [0; 32]; let x = hash_to_field(&signal); - let merkle_proof = tree + let merkle_proof: OptimalMerkleProof = tree .proof(identity_index) .expect("Failed to generate merkle proof"); let rln_witness = rln_witness_from_values( identity_secret_hash, - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x, external_nullifier, user_message_limit, diff --git a/rln-wasm/tests/node.rs b/rln-wasm/tests/node.rs index 8ddfdb0..e03b51a 100644 --- a/rln-wasm/tests/node.rs +++ b/rln-wasm/tests/node.rs @@ -5,8 +5,7 @@ mod tests { use js_sys::{BigInt as JsBigInt, Date, Object, Uint8Array}; use rln::circuit::{Fr, TEST_TREE_HEIGHT}; - use rln::hashers::{hash_to_field, poseidon_hash}; - use rln::poseidon_tree::PoseidonTree; + use rln::hashers::{hash_to_field, poseidon_hash, PoseidonHash}; use rln::protocol::{prepare_verify_input, rln_witness_from_values, serialize_witness}; use rln::utils::{bytes_le_to_fr, fr_to_bytes_le, IdSecret}; use rln_wasm::{ @@ -15,7 +14,9 @@ mod tests { }; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; use wasm_bindgen_test::{console_log, wasm_bindgen_test}; - use zerokit_utils::merkle_tree::merkle_tree::ZerokitMerkleTree; + use zerokit_utils::{ + OptimalMerkleProof, OptimalMerkleTree, ZerokitMerkleProof, ZerokitMerkleTree, + }; #[wasm_bindgen(inline_js = r#" const fs = require("fs"); @@ -71,7 +72,8 @@ mod tests { // Create RLN instance for other benchmarks let rln_instance = wasm_new(zkey).expect("Failed to create RLN instance"); - let mut tree = PoseidonTree::default(TEST_TREE_HEIGHT).expect("Failed to create tree"); + let mut tree: OptimalMerkleTree = + OptimalMerkleTree::default(TEST_TREE_HEIGHT).expect("Failed to create tree"); // Benchmark wasm_key_gen let start_wasm_key_gen = Date::now(); @@ -102,13 +104,14 @@ mod tests { let signal: [u8; 32] = [0; 32]; let x = hash_to_field(&signal); - let merkle_proof = tree + let merkle_proof: OptimalMerkleProof = tree .proof(identity_index) .expect("Failed to generate merkle proof"); let rln_witness = rln_witness_from_values( identity_secret_hash, - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x, external_nullifier, user_message_limit, diff --git a/rln/Cargo.toml b/rln/Cargo.toml index 1629638..8d57cc0 100644 --- a/rln/Cargo.toml +++ b/rln/Cargo.toml @@ -52,7 +52,7 @@ serde = { version = "1.0", features = ["derive"] } document-features = { version = "0.2.11", optional = true } [dev-dependencies] -criterion = { version = "0.6.0", features = ["html_reports"] } +criterion = { version = "0.7.0", features = ["html_reports"] } [features] default = ["parallel", "pmtree-ft"] diff --git a/rln/Makefile.toml b/rln/Makefile.toml index f0b0f5f..07bf8fd 100644 --- a/rln/Makefile.toml +++ b/rln/Makefile.toml @@ -8,7 +8,7 @@ args = ["test", "--release", "--", "--nocapture"] [tasks.test_stateless] command = "cargo" -args = ["test", "--release", "--features", "stateless"] +args = ["test", "--release", "--no-default-features", "--features", "stateless"] [tasks.bench] command = "cargo" diff --git a/rln/src/lib.rs b/rln/src/lib.rs index ec89918..f50b4b9 100644 --- a/rln/src/lib.rs +++ b/rln/src/lib.rs @@ -5,9 +5,31 @@ pub mod ffi; pub mod hashers; #[cfg(feature = "pmtree-ft")] pub mod pm_tree_adapter; +#[cfg(not(feature = "stateless"))] pub mod poseidon_tree; pub mod protocol; pub mod public; #[cfg(test)] pub mod public_api_tests; pub mod utils; + +// Ensure that only one Merkle tree feature is enabled at a time +#[cfg(any( + all(feature = "fullmerkletree", feature = "optimalmerkletree"), + all(feature = "fullmerkletree", feature = "pmtree-ft"), + all(feature = "optimalmerkletree", feature = "pmtree-ft"), +))] +compile_error!( + "Only one of `fullmerkletree`, `optimalmerkletree`, or `pmtree-ft` can be enabled at a time." +); + +// Ensure that the `stateless` feature is not enabled with any Merkle tree features +#[cfg(all( + feature = "stateless", + any( + feature = "fullmerkletree", + feature = "optimalmerkletree", + feature = "pmtree-ft" + ) +))] +compile_error!("Cannot enable any Merkle tree features with stateless"); diff --git a/rln/src/poseidon_tree.rs b/rln/src/poseidon_tree.rs index b9772b2..860bee3 100644 --- a/rln/src/poseidon_tree.rs +++ b/rln/src/poseidon_tree.rs @@ -1,6 +1,7 @@ // This crate defines the RLN module default Merkle tree implementation and its Hasher +// Implementation inspired by https://github.com/worldcoin/semaphore-rs/blob/d462a4372f1fd9c27610f2acfe4841fab1d396aa/src/poseidon_tree.rs -// Implementation inspired by https://github.com/worldcoin/semaphore-rs/blob/d462a4372f1fd9c27610f2acfe4841fab1d396aa/src/poseidon_tree.rs (no differences) +#![cfg(not(feature = "stateless"))] use cfg_if::cfg_if; @@ -20,10 +21,12 @@ cfg_if! { pub type PoseidonTree = OptimalMerkleTree; pub type MerkleProof = OptimalMerkleProof; - } else { + } else if #[cfg(feature = "pmtree-ft")] { use crate::pm_tree_adapter::{PmTree, PmTreeProof}; pub type PoseidonTree = PmTree; pub type MerkleProof = PmTreeProof; + } else { + compile_error!("One of the features `fullmerkletree`, `optimalmerkletree`, or `pmtree-ft` must be enabled."); } } diff --git a/rln/src/protocol.rs b/rln/src/protocol.rs index 03a1279..31016e6 100644 --- a/rln/src/protocol.rs +++ b/rln/src/protocol.rs @@ -1,16 +1,22 @@ // This crate collects all the underlying primitives used to implement RLN +#[cfg(not(feature = "stateless"))] +use { + crate::error::ConversionError, + crate::poseidon_tree::PoseidonTree, + utils::{ZerokitMerkleProof, ZerokitMerkleTree}, +}; + use crate::circuit::{calculate_rln_witness, qap::CircomReduction, Curve}; -use crate::error::{ComputeIdSecretError, ConversionError, ProofError, ProtocolError}; +use crate::error::{ComputeIdSecretError, ProofError, ProtocolError}; use crate::hashers::{hash_to_field, poseidon_hash}; -use crate::poseidon_tree::{MerkleProof, PoseidonTree}; use crate::public::RLN_IDENTIFIER; use crate::utils::{ bytes_le_to_fr, bytes_le_to_vec_fr, bytes_le_to_vec_u8, fr_byte_size, fr_to_bytes_le, normalize_usize, to_bigint, vec_fr_to_bytes_le, vec_u8_to_bytes_le, FrOrSecret, IdSecret, }; -use ark_bn254::Fr; -use ark_ff::AdditiveGroup; +use ark_bn254::{Fr, FrConfig}; +use ark_ff::{AdditiveGroup, Fp, MontBackend}; use ark_groth16::{prepare_verifying_key, Groth16, Proof as ArkProof, ProvingKey, VerifyingKey}; use ark_relations::r1cs::ConstraintMatrices; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; @@ -22,7 +28,6 @@ use serde::{Deserialize, Serialize}; #[cfg(test)] use std::time::Instant; use tiny_keccak::{Hasher as _, Keccak}; -use utils::{ZerokitMerkleProof, ZerokitMerkleTree}; use zeroize::Zeroize; /////////////////////////////////////////////////////// // RLN Witness data structure and utility functions @@ -177,6 +182,7 @@ pub fn deserialize_witness(serialized: &[u8]) -> Result<(RLNWitnessInput, usize) // https://github.com/kilic/rln/blob/7ac74183f8b69b399e3bc96c1ae8ab61c026dc43/src/public.rs#L148 // input_data is [ identity_secret<32> | id_index<8> | user_message_limit<32> | message_id<32> | external_nullifier<32> | signal_len<8> | signal ] // return value is a rln witness populated according to this information +#[cfg(not(feature = "stateless"))] pub fn proof_inputs_to_rln_witness( tree: &mut PoseidonTree, serialized: &[u8], @@ -240,7 +246,8 @@ pub fn proof_inputs_to_rln_witness( /// Returns an error if `message_id` is not within `user_message_limit`. pub fn rln_witness_from_values( identity_secret: IdSecret, - merkle_proof: &MerkleProof, + path_elements: Vec, 4>>, + identity_path_index: Vec, x: Fr, external_nullifier: Fr, user_message_limit: Fr, @@ -248,9 +255,6 @@ pub fn rln_witness_from_values( ) -> Result { message_id_range_check(&message_id, &user_message_limit)?; - let path_elements = merkle_proof.get_path_elements(); - let identity_path_index = merkle_proof.get_path_index(); - Ok(RLNWitnessInput { identity_secret, path_elements, diff --git a/rln/src/public_api_tests.rs b/rln/src/public_api_tests.rs index cd81a82..0e64a0c 100644 --- a/rln/src/public_api_tests.rs +++ b/rln/src/public_api_tests.rs @@ -994,13 +994,12 @@ mod tree_test { #[cfg(feature = "stateless")] mod stateless_test { use crate::circuit::{Fr, TEST_TREE_HEIGHT}; - use crate::hashers::{hash_to_field, poseidon_hash as utils_poseidon_hash}; - use crate::poseidon_tree::PoseidonTree; + use crate::hashers::{hash_to_field, poseidon_hash as utils_poseidon_hash, PoseidonHash}; use crate::protocol::*; use crate::public::RLN; use crate::utils::*; use std::io::Cursor; - use utils::ZerokitMerkleTree; + use utils::{OptimalMerkleTree, ZerokitMerkleProof, ZerokitMerkleTree}; use ark_std::{rand::thread_rng, UniformRand}; use rand::Rng; @@ -1013,10 +1012,10 @@ mod stateless_test { let mut rln = RLN::new().unwrap(); let default_leaf = Fr::from(0); - let mut tree = PoseidonTree::new( + let mut tree: OptimalMerkleTree = OptimalMerkleTree::new( TEST_TREE_HEIGHT, default_leaf, - ConfigOf::::default(), + ConfigOf::>::default(), ) .unwrap(); @@ -1047,7 +1046,8 @@ mod stateless_test { let rln_witness = rln_witness_from_values( identity_secret_hash, - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x, external_nullifier, user_message_limit, @@ -1110,10 +1110,10 @@ mod stateless_test { let mut rln = RLN::new().unwrap(); let default_leaf = Fr::from(0); - let mut tree = PoseidonTree::new( + let mut tree: OptimalMerkleTree = OptimalMerkleTree::new( TEST_TREE_HEIGHT, default_leaf, - ConfigOf::::default(), + ConfigOf::>::default(), ) .unwrap(); @@ -1142,7 +1142,8 @@ mod stateless_test { let rln_witness1 = rln_witness_from_values( identity_secret_hash.clone(), - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x1, external_nullifier, user_message_limit, @@ -1152,7 +1153,8 @@ mod stateless_test { let rln_witness2 = rln_witness_from_values( identity_secret_hash.clone(), - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x2, external_nullifier, user_message_limit, @@ -1208,7 +1210,8 @@ mod stateless_test { let rln_witness3 = rln_witness_from_values( identity_secret_hash_new.clone(), - &merkle_proof_new, + merkle_proof_new.get_path_elements(), + merkle_proof_new.get_path_index(), x3, external_nullifier, user_message_limit, diff --git a/rln/tests/ffi.rs b/rln/tests/ffi.rs index 8a9d489..7865d91 100644 --- a/rln/tests/ffi.rs +++ b/rln/tests/ffi.rs @@ -990,14 +990,15 @@ mod stateless_test { use rln::circuit::*; use rln::ffi::generate_rln_proof_with_witness; use rln::ffi::{hash as ffi_hash, poseidon_hash as ffi_poseidon_hash, *}; - use rln::hashers::{hash_to_field, poseidon_hash as utils_poseidon_hash, ROUND_PARAMS}; - use rln::poseidon_tree::PoseidonTree; + use rln::hashers::{ + hash_to_field, poseidon_hash as utils_poseidon_hash, PoseidonHash, ROUND_PARAMS, + }; use rln::protocol::*; use rln::public::RLN; use rln::utils::*; use std::mem::MaybeUninit; use std::time::{Duration, Instant}; - use utils::ZerokitMerkleTree; + use utils::{OptimalMerkleTree, ZerokitMerkleProof, ZerokitMerkleTree}; type ConfigOf = ::Config; @@ -1032,10 +1033,10 @@ mod stateless_test { #[test] fn test_recover_id_secret_stateless_ffi() { let default_leaf = Fr::from(0); - let mut tree = PoseidonTree::new( + let mut tree: OptimalMerkleTree = OptimalMerkleTree::new( TEST_TREE_HEIGHT, default_leaf, - ConfigOf::::default(), + ConfigOf::>::default(), ) .unwrap(); @@ -1068,7 +1069,8 @@ mod stateless_test { // We prepare input for generate_rln_proof API let rln_witness1 = rln_witness_from_values( identity_secret_hash.clone(), - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x1, external_nullifier, user_message_limit, @@ -1079,7 +1081,8 @@ mod stateless_test { let rln_witness2 = rln_witness_from_values( identity_secret_hash.clone(), - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x2, external_nullifier, user_message_limit, @@ -1134,7 +1137,8 @@ mod stateless_test { let rln_witness3 = rln_witness_from_values( identity_secret_hash_new.clone(), - &merkle_proof_new, + merkle_proof_new.get_path_elements(), + merkle_proof_new.get_path_index(), x3, external_nullifier, user_message_limit, @@ -1175,10 +1179,10 @@ mod stateless_test { #[test] fn test_verify_with_roots_stateless_ffi() { let default_leaf = Fr::from(0); - let mut tree = PoseidonTree::new( + let mut tree: OptimalMerkleTree = OptimalMerkleTree::new( TEST_TREE_HEIGHT, default_leaf, - ConfigOf::::default(), + ConfigOf::>::default(), ) .unwrap(); @@ -1208,7 +1212,8 @@ mod stateless_test { // We prepare input for generate_rln_proof API let rln_witness = rln_witness_from_values( identity_secret_hash, - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x, external_nullifier, user_message_limit, diff --git a/rln/tests/poseidon_tree.rs b/rln/tests/poseidon_tree.rs index 72b92b4..14c337a 100644 --- a/rln/tests/poseidon_tree.rs +++ b/rln/tests/poseidon_tree.rs @@ -2,6 +2,8 @@ // Tests //////////////////////////////////////////////////////////// +#![cfg(not(feature = "stateless"))] + #[cfg(test)] mod test { use rln::hashers::{poseidon_hash, PoseidonHash}; diff --git a/rln/tests/protocol.rs b/rln/tests/protocol.rs index 1588bba..3df4fec 100644 --- a/rln/tests/protocol.rs +++ b/rln/tests/protocol.rs @@ -1,3 +1,5 @@ +#![cfg(not(feature = "stateless"))] + #[cfg(test)] mod test { use ark_ff::BigInt; @@ -119,7 +121,8 @@ mod test { rln_witness_from_values( identity_secret_hash, - &merkle_proof, + merkle_proof.get_path_elements(), + merkle_proof.get_path_index(), x, external_nullifier, user_message_limit, diff --git a/utils/Cargo.toml b/utils/Cargo.toml index ca8d65c..ef6f3f3 100644 --- a/utils/Cargo.toml +++ b/utils/Cargo.toml @@ -27,7 +27,7 @@ ark-bn254 = { version = "0.5.0", features = ["std"] } num-traits = "0.2.19" hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } -criterion = { version = "0.6.0", features = ["html_reports"] } +criterion = { version = "0.7.0", features = ["html_reports"] } [features] default = []