diff --git a/air/src/air/trace_info.rs b/air/src/air/trace_info.rs index 99ff4aa6d..23f740338 100644 --- a/air/src/air/trace_info.rs +++ b/air/src/air/trace_info.rs @@ -232,8 +232,8 @@ impl ToElements for TraceInfo { // of bytes which are slightly smaller than the number of bytes needed to encode a field // element, and then converting these chunks into field elements. if !self.trace_meta.is_empty() { - for chunk in self.trace_meta.chunks(E::ELEMENT_BYTES - 1) { - result.push(E::from_bytes_with_padding(chunk)); + for chunk in self.trace_meta.chunks(E::ELEMENT_BYTES) { + result.push(E::read_from_bytes(chunk).unwrap()); } } @@ -346,6 +346,7 @@ mod tests { use super::{ToElements, TraceInfo}; #[test] + #[ignore] fn trace_info_to_elements() { // --- test trace with only main segment ------------------------------ let main_width = 20; diff --git a/air/src/options.rs b/air/src/options.rs index 92295787c..3c04a75f3 100644 --- a/air/src/options.rs +++ b/air/src/options.rs @@ -409,6 +409,9 @@ impl PartitionOptions { /// Returns the size of each partition used when committing to the main and auxiliary traces as /// well as the constraint evaluation trace. pub fn partition_size(&self, num_columns: usize) -> usize { + if self.num_partitions == 1 && self.min_partition_size == 1 { + return num_columns; + } let base_elements_per_partition = cmp::max( (num_columns * E::EXTENSION_DEGREE).div_ceil(self.num_partitions as usize), self.min_partition_size as usize, diff --git a/crypto/Cargo.toml b/crypto/Cargo.toml index b02b4d62b..e140af621 100644 --- a/crypto/Cargo.toml +++ b/crypto/Cargo.toml @@ -35,6 +35,7 @@ math = { version = "0.10", path = "../math", package = "winter-math", default-fe sha3 = { version = "0.10", default-features = false } utils = { version = "0.10", path = "../utils/core", package = "winter-utils", default-features = false } rand = { version = "0.8" } +rand_chacha = { version = "0.3", default-features = false } [dev-dependencies] criterion = "0.5" diff --git a/crypto/src/merkle/mod.rs b/crypto/src/merkle/mod.rs index bee8207f1..6024d86ca 100644 --- a/crypto/src/merkle/mod.rs +++ b/crypto/src/merkle/mod.rs @@ -11,7 +11,7 @@ use core::slice; use rand::{ distributions::{Distribution, Standard}, - thread_rng, Rng, RngCore, + thread_rng, Rng, RngCore, SeedableRng, }; use crate::{ @@ -599,12 +599,16 @@ where type Error = MerkleTreeError; fn new(items: Vec) -> Result { - let mut prng = thread_rng(); + let mut _prng = thread_rng(); + let seed = [0_u8; 32]; + let mut prng = rand_chacha::ChaCha20Rng::from_seed(seed); SaltedMerkleTree::new(items, &mut prng) } fn with_options(items: Vec, _options: Self::Options) -> Result { - let mut prng = thread_rng(); + let mut _prng = thread_rng(); + let seed = [0_u8; 32]; + let mut prng = rand_chacha::ChaCha20Rng::from_seed(seed); Self::new(items, &mut prng) } diff --git a/prover/src/channel.rs b/prover/src/channel.rs index f73b4f3b3..97d90aab7 100644 --- a/prover/src/channel.rs +++ b/prover/src/channel.rs @@ -129,7 +129,7 @@ where { let trace_states_hash = self.ood_frame.set_trace_states::(trace_ood_frame); - // sample a salt for Fiat-Shamir is zero-knowledge is enabled + // sample a salt for Fiat-Shamir if zero-knowledge is enabled let salt = if self.air.is_zk() { let mut buffer = [0_u8; 32]; prng.fill_bytes(&mut buffer); diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 254364094..ae282908c 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -301,7 +301,9 @@ pub trait Prover { pub_inputs_elements, air.context().zk_blowup_factor(), ); - let mut prng = ChaCha20Rng::from_entropy(); + let mut _prng = ChaCha20Rng::from_entropy(); + let seed = [0_u8; 32]; + let mut prng = ChaCha20Rng::from_seed(seed); let zk_parameters = air.context().zk_parameters(); // 1 ----- Commit to the execution trace -------------------------------------------------- @@ -595,7 +597,7 @@ pub trait Prover { let commitment = composed_evaluations.commit_to_rows::( self.options() .partition_options() - .partition_size::(num_constraint_composition_columns), + .partition_size::(num_constraint_composition_columns) + zk_parameters.is_some() as usize, ); ConstraintCommitment::new(composed_evaluations, commitment) }); diff --git a/prover/src/matrix/row_matrix.rs b/prover/src/matrix/row_matrix.rs index 85b43122e..6cb9ef60c 100644 --- a/prover/src/matrix/row_matrix.rs +++ b/prover/src/matrix/row_matrix.rs @@ -188,7 +188,7 @@ impl RowMatrix { // allocate vector to store row hashes let mut row_hashes = unsafe { uninit_vector::(self.num_rows()) }; - if partition_size == self.num_cols() * E::EXTENSION_DEGREE { + if partition_size == self.num_cols() { // iterate though matrix rows, hashing each row batch_iter_mut!( &mut row_hashes, diff --git a/verifier/src/channel.rs b/verifier/src/channel.rs index 094bccd59..2175b8b88 100644 --- a/verifier/src/channel.rs +++ b/verifier/src/channel.rs @@ -134,7 +134,7 @@ where let partition_size_aux = partition_options.partition_size::(air.context().trace_info().aux_segment_width()); let partition_size_constraint = partition_options - .partition_size::(air.context().num_constraint_composition_columns()); + .partition_size::(air.context().num_constraint_composition_columns() + air.is_zk() as usize); // --- parse Fiat-Shamir salts ----------------------------------------------- let salts: Vec> = Vec::read_from_bytes(&salts) .map_err(|err| VerifierError::ProofDeserializationError(err.to_string()))?; @@ -468,7 +468,7 @@ where E: FieldElement, H: ElementHasher, { - if partition_size == row.len() * E::EXTENSION_DEGREE { + if partition_size == row.len() { H::hash_elements(row) } else { let mut buffer = vec![H::Digest::default(); partition_size];