pub trait MerkleTreeProver<T>where
T: FixedSizeSerializeBytes,{
type Scheme: MerkleTreeScheme<T>;
type Committed;
// Required methods
fn scheme(&self) -> &Self::Scheme;
fn commit_iterated<ParIter>(
&self,
leaves: ParIter,
n_items_per_input: usize,
) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)
where ParIter: IndexedParallelIterator,
<ParIter as ParallelIterator>::Item: IntoIterator<Item = T>,
<<ParIter as ParallelIterator>::Item as IntoIterator>::IntoIter: Send;
fn layer<'a>(
&self,
committed: &'a Self::Committed,
layer_depth: usize,
) -> &'a [<Self::Scheme as MerkleTreeScheme<T>>::Digest];
fn prove_opening<B>(
&self,
committed: &Self::Committed,
layer_depth: usize,
index: usize,
proof: &mut TranscriptWriter<'_, B>,
)
where B: BufMut;
// Provided methods
fn commit(
&self,
data: &[T],
batch_size: usize,
) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)
where T: Clone + Sync { ... }
fn commit_field_buffer<P>(
&self,
buffer: FieldBuffer<P, FieldSliceData<'_, P>>,
log_leaf_len: usize,
) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)
where P: PackedField<Scalar = T> { ... }
}Expand description
A Merkle tree prover for a particular scheme.
This is separate from MerkleTreeScheme so that it may be implemented using a
hardware-accelerated backend.
Required Associated Types§
type Scheme: MerkleTreeScheme<T>
Required Methods§
Sourcefn commit_iterated<ParIter>(
&self,
leaves: ParIter,
n_items_per_input: usize,
) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)where
ParIter: IndexedParallelIterator,
<ParIter as ParallelIterator>::Item: IntoIterator<Item = T>,
<<ParIter as ParallelIterator>::Item as IntoIterator>::IntoIter: Send,
fn commit_iterated<ParIter>(
&self,
leaves: ParIter,
n_items_per_input: usize,
) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)where
ParIter: IndexedParallelIterator,
<ParIter as ParallelIterator>::Item: IntoIterator<Item = T>,
<<ParIter as ParallelIterator>::Item as IntoIterator>::IntoIter: Send,
Commit interleaved elements from iterator by val
Each leaf is built from exactly n_items_per_input elements, which lets the leaf hasher
specialize for short, constant-length leaves.
§Preconditions
- The number of leaves must be a power of two.
- Each iterator in
leavesyields exactlyn_items_per_inputelements.
Sourcefn layer<'a>(
&self,
committed: &'a Self::Committed,
layer_depth: usize,
) -> &'a [<Self::Scheme as MerkleTreeScheme<T>>::Digest]
fn layer<'a>( &self, committed: &'a Self::Committed, layer_depth: usize, ) -> &'a [<Self::Scheme as MerkleTreeScheme<T>>::Digest]
Returns the internal digest layer at the given depth.
§Preconditions
layer_depthmust be at most the committed tree’s depth.
Sourcefn prove_opening<B>(
&self,
committed: &Self::Committed,
layer_depth: usize,
index: usize,
proof: &mut TranscriptWriter<'_, B>,
)where
B: BufMut,
fn prove_opening<B>(
&self,
committed: &Self::Committed,
layer_depth: usize,
index: usize,
proof: &mut TranscriptWriter<'_, B>,
)where
B: BufMut,
Generate an opening proof for an entry in a committed vector at the given index.
§Arguments
committed- helper data generated during commitmentlayer_depth- depth of the layer to prove inclusion inindex- the entry index
§Preconditions
indexmust be within the committed tree andlayer_depthat most its depth.
Provided Methods§
Sourcefn commit(
&self,
data: &[T],
batch_size: usize,
) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)
fn commit( &self, data: &[T], batch_size: usize, ) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)
Commit a vector of values.
§Preconditions
data.len()must be a multiple ofbatch_size, and the resulting leaf count (data.len() / batch_size) must be a power of two.
Sourcefn commit_field_buffer<P>(
&self,
buffer: FieldBuffer<P, FieldSliceData<'_, P>>,
log_leaf_len: usize,
) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)where
P: PackedField<Scalar = T>,
fn commit_field_buffer<P>(
&self,
buffer: FieldBuffer<P, FieldSliceData<'_, P>>,
log_leaf_len: usize,
) -> (Commitment<<Self::Scheme as MerkleTreeScheme<T>>::Digest>, Self::Committed)where
P: PackedField<Scalar = T>,
Commits a field buffer, packing 2^log_leaf_len scalars into each leaf.
Scalars fill leaves in order:
leaf i <- buffer[i * 2^log_leaf_len .. (i+1) * 2^log_leaf_len]The leaf count is 2^(log_len - log_leaf_len), hence a power of two by construction.
That is what commit_iterated requires of it.
§Preconditions
log_leaf_lenmust be at most the buffer’s log length.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".