From 5f2b441ae7e352f4ef2485b74649b735b5ccac56 Mon Sep 17 00:00:00 2001 From: Daniel Sanchez Quiros Date: Tue, 16 Apr 2024 18:37:58 +0200 Subject: [PATCH] Implemented dablob --- nomos-da/kzgrs-backend/Cargo.toml | 2 +- nomos-da/kzgrs-backend/src/common.rs | 40 ++++++++++++++++++++------ nomos-da/kzgrs-backend/src/lib.rs | 1 + nomos-da/kzgrs-backend/src/verifier.rs | 24 ++++++++++++++++ 4 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 nomos-da/kzgrs-backend/src/verifier.rs diff --git a/nomos-da/kzgrs-backend/Cargo.toml b/nomos-da/kzgrs-backend/Cargo.toml index 22f7efa7..d5cb4281 100644 --- a/nomos-da/kzgrs-backend/Cargo.toml +++ b/nomos-da/kzgrs-backend/Cargo.toml @@ -12,9 +12,9 @@ ark-poly = "0.4.2" kzgrs = { path = "../kzgrs" } rand = "0.8.5" once_cell = "1.19" +sha3 = "0.10" [dev-dependencies] rand = "0.8" itertools = "0.12" ark-ff = "0.4" -num-bigint = "0.4.4" \ No newline at end of file diff --git a/nomos-da/kzgrs-backend/src/common.rs b/nomos-da/kzgrs-backend/src/common.rs index 6d348a47..3d9d9ecc 100644 --- a/nomos-da/kzgrs-backend/src/common.rs +++ b/nomos-da/kzgrs-backend/src/common.rs @@ -1,6 +1,11 @@ -use blake2::digest::{Update, VariableOutput}; -use kzgrs::Commitment; +// std +use ark_serialize::CanonicalSerialize; use std::io::Cursor; +// crates +use blake2::digest::{Update, VariableOutput}; +use sha3::{Digest, Sha3_256}; +// internal +use kzgrs::Commitment; #[derive(Clone, Eq, PartialEq, Debug)] pub struct Chunk(pub Vec); @@ -101,18 +106,37 @@ pub fn hash_column_and_commitment( column: &Column, commitment: &Commitment, ) -> [u8; HASH_SIZE] { - use ark_serialize::CanonicalSerialize; let mut hasher = blake2::Blake2bVar::new(HASH_SIZE) .unwrap_or_else(|e| panic!("Blake2b should work for size {HASH_SIZE}, {e}")); hasher.update(column.as_bytes().as_ref()); - let mut buff = Cursor::new(vec![]); - commitment - .serialize_uncompressed(&mut buff) - .expect("Serialization of commitment should work"); - hasher.update(buff.into_inner().as_ref()); + hasher.update(commitment_to_bytes(commitment).as_ref()); hasher .finalize_boxed() .to_vec() .try_into() .unwrap_or_else(|_| panic!("Size is guaranteed by constant {HASH_SIZE:?}")) } + +pub fn build_attestation_message( + aggregated_column_commitment: &Commitment, + rows_commitments: &[Commitment], +) -> Vec { + let mut hasher = Sha3_256::new(); + Digest::update( + &mut hasher, + commitment_to_bytes(aggregated_column_commitment), + ); + for c in rows_commitments { + Digest::update(&mut hasher, commitment_to_bytes(c)); + } + hasher.finalize().to_vec() +} + +pub fn commitment_to_bytes(commitment: &Commitment) -> Vec { + use ark_serialize::CanonicalSerialize; + let mut buff = Cursor::new(vec![]); + commitment + .serialize_uncompressed(&mut buff) + .expect("Serialization of commitment should work"); + buff.into_inner() +} diff --git a/nomos-da/kzgrs-backend/src/lib.rs b/nomos-da/kzgrs-backend/src/lib.rs index ac01ae55..3916547d 100644 --- a/nomos-da/kzgrs-backend/src/lib.rs +++ b/nomos-da/kzgrs-backend/src/lib.rs @@ -1,3 +1,4 @@ mod common; mod encoder; mod global; +mod verifier; diff --git a/nomos-da/kzgrs-backend/src/verifier.rs b/nomos-da/kzgrs-backend/src/verifier.rs new file mode 100644 index 00000000..821bfd76 --- /dev/null +++ b/nomos-da/kzgrs-backend/src/verifier.rs @@ -0,0 +1,24 @@ +use crate::common::{build_attestation_message, Column}; +use kzgrs::{Commitment, Proof}; +use sha3::{Digest, Sha3_256}; + +pub struct DaBlob { + column: Column, + column_commitment: Commitment, + aggregated_column_commitment: Commitment, + aggregated_column_proof: Proof, + rows_commitments: Vec, + rows_proofs: Vec, +} + +impl DaBlob { + pub fn id(&self) -> Vec { + build_attestation_message(&self.aggregated_column_commitment, &self.rows_commitments) + } + + pub fn column_id(&self) -> Vec { + let mut hasher = Sha3_256::new(); + hasher.update(self.column.as_bytes()); + hasher.finalize().as_slice().to_vec() + } +}