From 05a9ae9d0551cd15e11ac8796927782119719db4 Mon Sep 17 00:00:00 2001 From: Daniel Sanchez Quiros Date: Mon, 15 Apr 2024 16:38:49 +0200 Subject: [PATCH] Implement encode method --- nomos-da/kzgrs-backend/src/common.rs | 8 ++-- nomos-da/kzgrs-backend/src/encoder.rs | 56 ++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/nomos-da/kzgrs-backend/src/common.rs b/nomos-da/kzgrs-backend/src/common.rs index 422c2ab2..db2d7492 100644 --- a/nomos-da/kzgrs-backend/src/common.rs +++ b/nomos-da/kzgrs-backend/src/common.rs @@ -4,10 +4,10 @@ use kzgrs::Commitment; use std::io::Cursor; #[derive(Clone)] -pub struct Chunk(Vec); -pub struct Row(Vec); -pub struct Column(Vec); -pub struct ChunksMatrix(Vec); +pub struct Chunk(pub Vec); +pub struct Row(pub Vec); +pub struct Column(pub Vec); +pub struct ChunksMatrix(pub Vec); impl Chunk { pub fn as_bytes(&self) -> Vec { diff --git a/nomos-da/kzgrs-backend/src/encoder.rs b/nomos-da/kzgrs-backend/src/encoder.rs index 1d817fbf..b8d90deb 100644 --- a/nomos-da/kzgrs-backend/src/encoder.rs +++ b/nomos-da/kzgrs-backend/src/encoder.rs @@ -1,10 +1,9 @@ -use crate::common::{hash_column_and_commitment, Chunk, ChunksMatrix}; +use crate::common::{hash_column_and_commitment, Chunk, ChunksMatrix, Row}; use crate::global::{DOMAIN, GLOBAL_PARAMETERS}; use ark_poly::univariate::DensePolynomial; use kzgrs::{ bytes_to_polynomial, commit_polynomial, encode, generate_element_proof, Commitment, - Evaluations, KzgRsError, Polynomial, PolynomialEvaluationDomain, Proof, - BYTES_PER_FIELD_ELEMENT, + Evaluations, KzgRsError, Polynomial, Proof, }; pub struct DaEncoderParams { column_count: usize, @@ -23,7 +22,7 @@ pub struct EncodedData { chunked_data: ChunksMatrix, extended_data: ChunksMatrix, row_commitments: Vec, - row_proofs: Vec>, + rows_proofs: Vec>, column_commitments: Vec, aggregated_column_commitment: Commitment, aggregated_column_proofs: Vec, @@ -133,7 +132,54 @@ impl DaEncoder { .collect() } + fn evals_to_chunk_matrix(evals: &[Evaluations]) -> ChunksMatrix { + ChunksMatrix( + evals + .iter() + .map(|eval| { + Row(eval + .evals + .iter() + .map(|point| { + Chunk(point.0 .0.iter().flat_map(|n| n.to_le_bytes()).collect()) + }) + .collect()) + }) + .collect(), + ) + } + pub fn encode(&self, data: &[u8]) -> Result { - todo!() + let chunked_data = self.chunkify(data); + let (row_polynomials, row_commitments): (Vec<_>, Vec<_>) = + Self::compute_kzg_row_commitments(&chunked_data)? + .into_iter() + .unzip(); + let extended_data = + Self::evals_to_chunk_matrix(Self::rs_encode_rows(&row_polynomials).as_ref()); + let row_polynomials: Vec<_> = row_polynomials.into_iter().map(|(_, p)| p).collect(); + let rows_proofs = Self::compute_rows_proofs( + &row_polynomials, + &row_commitments, + self.params.column_count, + )?; + let (column_polynomials, column_commitments): (Vec<_>, Vec<_>) = + Self::compute_kzg_column_commitments(&extended_data)? + .into_iter() + .unzip(); + let ((aggregated_evals, aggregated_polynomial), aggregated_column_commitment) = + Self::compute_aggregated_column_commitment(&extended_data, &column_commitments)?; + let aggregated_column_proofs = + Self::compute_aggregated_column_proofs(&aggregated_polynomial, &column_commitments)?; + Ok(EncodedData { + data: data.to_vec(), + chunked_data, + extended_data, + row_commitments, + rows_proofs, + column_commitments, + aggregated_column_commitment, + aggregated_column_proofs, + }) } }