Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 7 additions & 10 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -373,8 +369,9 @@ impl<Gen: GenerateVerifiable> Receipt<Gen> {
}
/// 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,
Expand Down
92 changes: 22 additions & 70 deletions src/ring/bandersnatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -405,16 +405,7 @@ mod builder_tests {
let mut inter2 = inter1.clone();
let builder_params = ring_verifier_builder_params::<BandersnatchSha512Ell2>(domain_size);

let get_many = |range| {
(&builder_params)
.lookup(range)
.map(|v| {
v.into_iter()
.map(crate::ring::StaticChunk)
.collect::<Vec<_>>()
})
.ok_or(())
};
let get_many = chunk_lookup(&builder_params);

BandersnatchVrfVerifiable::push_members(
&mut inter1,
Expand Down Expand Up @@ -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::<Vec<_>>()
})
.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);
Expand Down Expand Up @@ -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::<Vec<_>>()
})
.ok_or(())
};
let get_many = chunk_lookup(&builder_params);

let start = Instant::now();
let mut inter = BandersnatchVrfVerifiable::start_members(domain_size);
Expand Down Expand Up @@ -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::<Vec<_>>()
})
.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();
Expand Down Expand Up @@ -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::<Vec<_>>()
})
.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();
Expand Down Expand Up @@ -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::<Vec<_>>()
})
.ok_or(())
};
let get_many = chunk_lookup(&builder_params);

let mut inter1 = BandersnatchVrfVerifiable::start_members(domain_size);
let start = Instant::now();
Expand Down Expand Up @@ -1068,21 +1014,27 @@ mod builder_tests {
);
}

fn chunk_lookup(
builder_params: &ark_vrf::ring::RingBuilderPcsParams<BandersnatchSha512Ell2>,
) -> impl Fn(
core::ops::Range<usize>,
) -> Result<Vec<crate::ring::StaticChunk<BandersnatchSha512Ell2>>, ()>
+ 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<Item = <BandersnatchVrfVerifiable as GenerateVerifiable>::Member>,
domain_size: RingDomainSize,
) -> <BandersnatchVrfVerifiable as GenerateVerifiable>::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::<Vec<_>>()
})
.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)
Expand Down
Loading