feature(encoder): Implement Iterator over DaBlob for EncodedData (#952)
This commit is contained in:
parent
8f79bafe55
commit
739df1737a
|
@ -1,6 +1,5 @@
|
||||||
// std
|
// std
|
||||||
use std::ops::Div;
|
use std::ops::Div;
|
||||||
|
|
||||||
// crates
|
// crates
|
||||||
use ark_ff::{BigInteger, PrimeField};
|
use ark_ff::{BigInteger, PrimeField};
|
||||||
use ark_poly::EvaluationDomain;
|
use ark_poly::EvaluationDomain;
|
||||||
|
@ -10,10 +9,11 @@ use kzgrs::{
|
||||||
bytes_to_polynomial, commit_polynomial, encode, Commitment, Evaluations, GlobalParameters,
|
bytes_to_polynomial, commit_polynomial, encode, Commitment, Evaluations, GlobalParameters,
|
||||||
KzgRsError, Polynomial, PolynomialEvaluationDomain, Proof, BYTES_PER_FIELD_ELEMENT,
|
KzgRsError, Polynomial, PolynomialEvaluationDomain, Proof, BYTES_PER_FIELD_ELEMENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "parallel")]
|
#[cfg(feature = "parallel")]
|
||||||
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
|
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
|
||||||
|
|
||||||
// internal
|
// internal
|
||||||
|
use crate::common::blob::DaBlob;
|
||||||
use crate::common::{hash_column_and_commitment, Chunk, ChunksMatrix, Row};
|
use crate::common::{hash_column_and_commitment, Chunk, ChunksMatrix, Row};
|
||||||
use crate::global::GLOBAL_PARAMETERS;
|
use crate::global::GLOBAL_PARAMETERS;
|
||||||
|
|
||||||
|
@ -57,6 +57,75 @@ pub struct EncodedData {
|
||||||
pub aggregated_column_proofs: Vec<Proof>,
|
pub aggregated_column_proofs: Vec<Proof>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl EncodedData {
|
||||||
|
/// Returns a `DaBlob` for the given index.
|
||||||
|
/// If the index is out of bounds, returns `None`.
|
||||||
|
pub fn to_da_blob(&self, index: usize) -> Option<DaBlob> {
|
||||||
|
let column = self.extended_data.columns().nth(index)?;
|
||||||
|
Some(DaBlob {
|
||||||
|
column,
|
||||||
|
column_idx: index.try_into().unwrap(),
|
||||||
|
column_commitment: self.column_commitments[index],
|
||||||
|
aggregated_column_commitment: self.aggregated_column_commitment,
|
||||||
|
aggregated_column_proof: self.aggregated_column_proofs[index],
|
||||||
|
rows_commitments: self.row_commitments.clone(),
|
||||||
|
rows_proofs: self
|
||||||
|
.rows_proofs
|
||||||
|
.iter()
|
||||||
|
.map(|proofs| proofs.get(index).cloned().unwrap())
|
||||||
|
.collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> IntoIterator for &'a EncodedData {
|
||||||
|
type Item = DaBlob;
|
||||||
|
type IntoIter = EncodedDataIterator<'a>;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter {
|
||||||
|
EncodedDataIterator::new(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct OwnedEncodedDataIterator {
|
||||||
|
encoded_data: EncodedData,
|
||||||
|
next_index: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for OwnedEncodedDataIterator {
|
||||||
|
type Item = DaBlob;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
let next_da_blob = self.encoded_data.to_da_blob(self.next_index)?;
|
||||||
|
self.next_index += 1;
|
||||||
|
Some(next_da_blob)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct EncodedDataIterator<'a> {
|
||||||
|
encoded_data: &'a EncodedData,
|
||||||
|
next_index: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> EncodedDataIterator<'a> {
|
||||||
|
pub fn new(encoded_data: &'a EncodedData) -> Self {
|
||||||
|
Self {
|
||||||
|
encoded_data,
|
||||||
|
next_index: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for EncodedDataIterator<'_> {
|
||||||
|
type Item = DaBlob;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
let next_da_blob = self.encoded_data.to_da_blob(self.next_index)?;
|
||||||
|
self.next_index += 1;
|
||||||
|
Some(next_da_blob)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct DaEncoder {
|
pub struct DaEncoder {
|
||||||
params: DaEncoderParams,
|
params: DaEncoderParams,
|
||||||
}
|
}
|
||||||
|
@ -507,4 +576,20 @@ pub mod test {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_encoded_data_iterator() {
|
||||||
|
let encoder = &ENCODER;
|
||||||
|
let data = vec![
|
||||||
|
49u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8,
|
||||||
|
0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8,
|
||||||
|
];
|
||||||
|
let encoded_data = encoder.encode(&data).unwrap();
|
||||||
|
|
||||||
|
let blobs: Vec<_> = (&encoded_data).into_iter().collect();
|
||||||
|
assert_eq!(blobs.len(), 16);
|
||||||
|
|
||||||
|
let blobs: Vec<_> = encoded_data.into_iter().collect();
|
||||||
|
assert_eq!(blobs.len(), 16);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue