From ed139b8c991bd40a0d356f4b870c903ba8d1edd7 Mon Sep 17 00:00:00 2001 From: Davide Galassi Date: Wed, 13 May 2026 12:32:44 +0200 Subject: [PATCH 1/2] Refactory --- src/ring/bandersnatch.rs | 92 ++++++++++------------------------------ 1 file changed, 22 insertions(+), 70 deletions(-) diff --git a/src/ring/bandersnatch.rs b/src/ring/bandersnatch.rs index a1ac5b2..b4c9c64 100644 --- a/src/ring/bandersnatch.rs +++ b/src/ring/bandersnatch.rs @@ -405,16 +405,7 @@ mod builder_tests { let mut inter2 = inter1.clone(); let builder_params = ring_verifier_builder_params::(domain_size); - let get_many = |range| { - (&builder_params) - .lookup(range) - .map(|v| { - v.into_iter() - .map(crate::ring::StaticChunk) - .collect::>() - }) - .ok_or(()) - }; + let get_many = chunk_lookup(&builder_params); BandersnatchVrfVerifiable::push_members( &mut inter1, @@ -448,16 +439,7 @@ mod builder_tests { // Second set is everyone all at once but with a starting root constructed from params. let (mut inter2, builder_params) = start_members_from_params(domain_size); - let get_many = |range| { - (&builder_params) - .lookup(range) - .map(|v| { - v.into_iter() - .map(crate::ring::StaticChunk) - .collect::>() - }) - .ok_or(()) - }; + let get_many = chunk_lookup(&builder_params); // Third set is everyone added one by one. let mut inter3 = BandersnatchVrfVerifiable::start_members(domain_size); @@ -544,16 +526,7 @@ mod builder_tests { // `builder_params` can be serialized/deserialized to be loaded when required let (_, builder_params) = start_members_from_params(domain_size); - let get_many = |range| { - (&builder_params) - .lookup(range) - .map(|v| { - v.into_iter() - .map(crate::ring::StaticChunk) - .collect::>() - }) - .ok_or(()) - }; + let get_many = chunk_lookup(&builder_params); let start = Instant::now(); let mut inter = BandersnatchVrfVerifiable::start_members(domain_size); @@ -638,16 +611,7 @@ mod builder_tests { // Build the ring commitment for verification let (_, builder_params) = start_members_from_params(domain_size); - let get_many = |range| { - (&builder_params) - .lookup(range) - .map(|v| { - v.into_iter() - .map(crate::ring::StaticChunk) - .collect::>() - }) - .ok_or(()) - }; + let get_many = chunk_lookup(&builder_params); let mut inter = BandersnatchVrfVerifiable::start_members(domain_size); BandersnatchVrfVerifiable::push_members(&mut inter, member_keys.iter().copied(), get_many) .unwrap(); @@ -744,16 +708,7 @@ mod builder_tests { // Build the ring commitment for verification let (_, builder_params) = start_members_from_params(domain_size); - let get_many = |range| { - (&builder_params) - .lookup(range) - .map(|v| { - v.into_iter() - .map(crate::ring::StaticChunk) - .collect::>() - }) - .ok_or(()) - }; + let get_many = chunk_lookup(&builder_params); let mut inter = BandersnatchVrfVerifiable::start_members(domain_size); BandersnatchVrfVerifiable::push_members(&mut inter, member_keys.iter().copied(), get_many) .unwrap(); @@ -865,16 +820,7 @@ mod builder_tests { // `builder_params` can be serialized/deserialized to be loaded when required let (_, builder_params) = start_members_from_params(domain_size); - let get_many = |range| { - (&builder_params) - .lookup(range) - .map(|v| { - v.into_iter() - .map(crate::ring::StaticChunk) - .collect::>() - }) - .ok_or(()) - }; + let get_many = chunk_lookup(&builder_params); let mut inter1 = BandersnatchVrfVerifiable::start_members(domain_size); let start = Instant::now(); @@ -1068,21 +1014,27 @@ mod builder_tests { ); } + fn chunk_lookup( + builder_params: &ark_vrf::ring::RingBuilderPcsParams, + ) -> impl Fn( + core::ops::Range, + ) -> Result>, ()> + + Copy + + '_ { + move |range| { + builder_params + .lookup(range) + .map(|v| v.into_iter().map(crate::ring::StaticChunk).collect()) + .ok_or(()) + } + } + fn build_members( member_keys: impl Iterator::Member>, domain_size: RingDomainSize, ) -> ::Members { let (_, builder_params) = start_members_from_params(domain_size); - let get_many = |range| { - (&builder_params) - .lookup(range) - .map(|v| { - v.into_iter() - .map(crate::ring::StaticChunk) - .collect::>() - }) - .ok_or(()) - }; + let get_many = chunk_lookup(&builder_params); let mut inter = BandersnatchVrfVerifiable::start_members(domain_size); BandersnatchVrfVerifiable::push_members(&mut inter, member_keys, get_many).unwrap(); BandersnatchVrfVerifiable::finish_members(inter) From be7adae767093800325656537c0ca6f6f0045bdf Mon Sep 17 00:00:00 2001 From: Davide Galassi Date: Wed, 13 May 2026 13:48:05 +0200 Subject: [PATCH 2/2] docs --- src/lib.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 30f8f06..3a72459 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -189,10 +189,8 @@ pub trait GenerateVerifiable { /// counterpart operation `create` does not utilize this data. It does require knowledge of the /// `Secret` for `member` and as such is practical to conduct on an offline/air-gapped device. /// - /// NOTE: We never expect to use this code on-chain; it should be used only in the wallet. - /// - /// **WARNING**: This function may panic if called from on-chain or an environment not - /// implementing the functionality. + /// Requires the `prover` feature. The prover paths are heavy and intended for + /// off-chain use (wallets, signing services), not for runtime execution. #[cfg(feature = "prover")] fn open( config: Self::Config, @@ -211,10 +209,8 @@ pub trait GenerateVerifiable { /// - `context`: The context under which membership is proven. Proofs over different `[u8]`s /// are unlinkable. /// - /// NOTE: We never expect to use this code on-chain; it should be used only in the wallet. - /// - /// **WARNING**: This function may panic if called from on-chain or an environment not - /// implementing the functionality. + /// Requires the `prover` feature. Intended for off-chain use (wallets, signing + /// services), not for runtime execution. #[cfg(feature = "prover")] fn create( commitment: Self::Commitment, @@ -373,8 +369,9 @@ impl Receipt { } /// Verify the receipt against the given `members` set and `context`. /// - /// On success, returns the validated alias and message. On failure, returns - /// the receipt back so it can be inspected or retried. + /// On success, returns the validated alias and message. On failure, the + /// receipt is returned in `Err` so the caller can retry verification against + /// a different `members` set or `context` without rebuilding it. pub fn verify( self, config: Gen::Config,