refactor: update repo to be compatible with Winterfell 0.8 (#275)
This commit is contained in:
parent
552d90429b
commit
cd4525c7ad
15 changed files with 49 additions and 56 deletions
10
Cargo.toml
10
Cargo.toml
|
@ -48,17 +48,17 @@ std = [
|
||||||
blake3 = { version = "1.5", default-features = false }
|
blake3 = { version = "1.5", default-features = false }
|
||||||
clap = { version = "4.4", features = ["derive"], optional = true }
|
clap = { version = "4.4", features = ["derive"], optional = true }
|
||||||
libc = { version = "0.2", default-features = false, optional = true }
|
libc = { version = "0.2", default-features = false, optional = true }
|
||||||
rand_utils = { version = "0.7", package = "winter-rand-utils", optional = true }
|
rand_utils = { version = "0.8", package = "winter-rand-utils", optional = true }
|
||||||
serde = { version = "1.0", features = ["derive"], default-features = false, optional = true }
|
serde = { version = "1.0", features = ["derive"], default-features = false, optional = true }
|
||||||
winter_crypto = { version = "0.7", package = "winter-crypto", default-features = false }
|
winter_crypto = { version = "0.8", package = "winter-crypto", default-features = false }
|
||||||
winter_math = { version = "0.7", package = "winter-math", default-features = false }
|
winter_math = { version = "0.8", package = "winter-math", default-features = false }
|
||||||
winter_utils = { version = "0.7", package = "winter-utils", default-features = false }
|
winter_utils = { version = "0.8", package = "winter-utils", default-features = false }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
seq-macro = { version = "0.3" }
|
seq-macro = { version = "0.3" }
|
||||||
criterion = { version = "0.5", features = ["html_reports"] }
|
criterion = { version = "0.5", features = ["html_reports"] }
|
||||||
proptest = "1.4"
|
proptest = "1.4"
|
||||||
rand_utils = { version = "0.7", package = "winter-rand-utils" }
|
rand_utils = { version = "0.8", package = "winter-rand-utils" }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cc = { version = "1.0", features = ["parallel"], optional = true }
|
cc = { version = "1.0", features = ["parallel"], optional = true }
|
||||||
|
|
|
@ -4,7 +4,7 @@ use super::{
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use super::{ffi, NonceBytes, StarkField, NONCE_LEN, PK_LEN, SIG_LEN, SK_LEN};
|
use super::{ffi, NonceBytes, NONCE_LEN, PK_LEN, SIG_LEN, SK_LEN};
|
||||||
|
|
||||||
// PUBLIC KEY
|
// PUBLIC KEY
|
||||||
// ================================================================================================
|
// ================================================================================================
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::{
|
||||||
collections::Vec, ByteReader, ByteWriter, Deserializable, DeserializationError,
|
collections::Vec, ByteReader, ByteWriter, Deserializable, DeserializationError,
|
||||||
Serializable,
|
Serializable,
|
||||||
},
|
},
|
||||||
Felt, StarkField, Word, ZERO,
|
Felt, Word, ZERO,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use super::{
|
use super::{
|
||||||
ByteReader, ByteWriter, Deserializable, DeserializationError, NonceBytes, NonceElements,
|
ByteReader, ByteWriter, Deserializable, DeserializationError, Felt, NonceBytes, NonceElements,
|
||||||
Polynomial, PublicKeyBytes, Rpo256, Serializable, SignatureBytes, StarkField, Word, MODULUS, N,
|
Polynomial, PublicKeyBytes, Rpo256, Serializable, SignatureBytes, Word, MODULUS, N,
|
||||||
SIG_L2_BOUND, ZERO,
|
SIG_L2_BOUND, ZERO,
|
||||||
};
|
};
|
||||||
use crate::utils::string::ToString;
|
use crate::utils::string::ToString;
|
||||||
|
@ -182,7 +182,9 @@ fn decode_nonce(nonce: &NonceBytes) -> NonceElements {
|
||||||
let mut result = [ZERO; 8];
|
let mut result = [ZERO; 8];
|
||||||
for (i, bytes) in nonce.chunks(5).enumerate() {
|
for (i, bytes) in nonce.chunks(5).enumerate() {
|
||||||
buffer[..5].copy_from_slice(bytes);
|
buffer[..5].copy_from_slice(bytes);
|
||||||
result[i] = u64::from_le_bytes(buffer).into();
|
// we can safely (without overflow) create a new Felt from u64 value here since this value
|
||||||
|
// contains at most 5 bytes
|
||||||
|
result[i] = Felt::new(u64::from_le_bytes(buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
result
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use super::{Digest, ElementHasher, Felt, FieldElement, Hasher, StarkField};
|
use super::{Digest, ElementHasher, Felt, FieldElement, Hasher};
|
||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
bytes_to_hex_string, hex_to_bytes, string::String, ByteReader, ByteWriter, Deserializable,
|
bytes_to_hex_string, hex_to_bytes, string::String, ByteReader, ByteWriter, Deserializable,
|
||||||
DeserializationError, HexParseError, Serializable,
|
DeserializationError, HexParseError, Serializable,
|
||||||
|
|
|
@ -234,15 +234,12 @@ impl TryFrom<[u64; DIGEST_SIZE]> for RpoDigest {
|
||||||
type Error = RpoDigestError;
|
type Error = RpoDigestError;
|
||||||
|
|
||||||
fn try_from(value: [u64; DIGEST_SIZE]) -> Result<Self, RpoDigestError> {
|
fn try_from(value: [u64; DIGEST_SIZE]) -> Result<Self, RpoDigestError> {
|
||||||
if value[0] >= Felt::MODULUS
|
Ok(Self([
|
||||||
|| value[1] >= Felt::MODULUS
|
value[0].try_into().map_err(|_| RpoDigestError::InvalidInteger)?,
|
||||||
|| value[2] >= Felt::MODULUS
|
value[1].try_into().map_err(|_| RpoDigestError::InvalidInteger)?,
|
||||||
|| value[3] >= Felt::MODULUS
|
value[2].try_into().map_err(|_| RpoDigestError::InvalidInteger)?,
|
||||||
{
|
value[3].try_into().map_err(|_| RpoDigestError::InvalidInteger)?,
|
||||||
return Err(RpoDigestError::InvalidInteger);
|
]))
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Self([value[0].into(), value[1].into(), value[2].into(), value[3].into()]))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -234,15 +234,12 @@ impl TryFrom<[u64; DIGEST_SIZE]> for RpxDigest {
|
||||||
type Error = RpxDigestError;
|
type Error = RpxDigestError;
|
||||||
|
|
||||||
fn try_from(value: [u64; DIGEST_SIZE]) -> Result<Self, RpxDigestError> {
|
fn try_from(value: [u64; DIGEST_SIZE]) -> Result<Self, RpxDigestError> {
|
||||||
if value[0] >= Felt::MODULUS
|
Ok(Self([
|
||||||
|| value[1] >= Felt::MODULUS
|
value[0].try_into().map_err(|_| RpxDigestError::InvalidInteger)?,
|
||||||
|| value[2] >= Felt::MODULUS
|
value[1].try_into().map_err(|_| RpxDigestError::InvalidInteger)?,
|
||||||
|| value[3] >= Felt::MODULUS
|
value[2].try_into().map_err(|_| RpxDigestError::InvalidInteger)?,
|
||||||
{
|
value[3].try_into().map_err(|_| RpxDigestError::InvalidInteger)?,
|
||||||
return Err(RpxDigestError::InvalidInteger);
|
]))
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Self([value[0].into(), value[1].into(), value[2].into(), value[3].into()]))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use super::{Felt, MerkleError, RpoDigest, StarkField};
|
use super::{Felt, MerkleError, RpoDigest};
|
||||||
use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
|
use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
|
||||||
use core::fmt::Display;
|
use core::fmt::Display;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
use super::{
|
use super::{
|
||||||
hash::rpo::{Rpo256, RpoDigest},
|
hash::rpo::{Rpo256, RpoDigest},
|
||||||
utils::collections::{vec, BTreeMap, BTreeSet, KvMap, RecordingMap, Vec},
|
utils::collections::{vec, BTreeMap, BTreeSet, KvMap, RecordingMap, Vec},
|
||||||
Felt, StarkField, Word, EMPTY_WORD, ZERO,
|
Felt, Word, EMPTY_WORD, ZERO,
|
||||||
};
|
};
|
||||||
|
|
||||||
// REEXPORTS
|
// REEXPORTS
|
||||||
|
|
|
@ -206,14 +206,14 @@ impl Serializable for MerklePath {
|
||||||
fn write_into<W: winter_utils::ByteWriter>(&self, target: &mut W) {
|
fn write_into<W: winter_utils::ByteWriter>(&self, target: &mut W) {
|
||||||
assert!(self.nodes.len() <= u8::MAX.into(), "Length enforced in the constructor");
|
assert!(self.nodes.len() <= u8::MAX.into(), "Length enforced in the constructor");
|
||||||
target.write_u8(self.nodes.len() as u8);
|
target.write_u8(self.nodes.len() as u8);
|
||||||
self.nodes.write_into(target);
|
target.write_many(&self.nodes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Deserializable for MerklePath {
|
impl Deserializable for MerklePath {
|
||||||
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
|
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
|
||||||
let count = source.read_u8()?.into();
|
let count = source.read_u8()?.into();
|
||||||
let nodes = RpoDigest::read_batch_from(source, count)?;
|
let nodes = source.read_many::<RpoDigest>(count)?;
|
||||||
Ok(Self { nodes })
|
Ok(Self { nodes })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use core::cmp::Ordering;
|
use core::cmp::Ordering;
|
||||||
|
|
||||||
use crate::utils::{collections::Vec, string::ToString, vec};
|
use crate::utils::{collections::Vec, string::ToString, vec};
|
||||||
use winter_math::StarkField;
|
|
||||||
use winter_utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
|
use winter_utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
|
||||||
|
|
||||||
use super::{Felt, LeafIndex, Rpo256, RpoDigest, SmtLeafError, Word, EMPTY_WORD, SMT_DEPTH};
|
use super::{Felt, LeafIndex, Rpo256, RpoDigest, SmtLeafError, Word, EMPTY_WORD, SMT_DEPTH};
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
use winter_math::StarkField;
|
|
||||||
|
|
||||||
use crate::hash::rpo::Rpo256;
|
use crate::hash::rpo::Rpo256;
|
||||||
use crate::merkle::{EmptySubtreeRoots, InnerNodeInfo};
|
use crate::merkle::{EmptySubtreeRoots, InnerNodeInfo};
|
||||||
use crate::utils::collections::{BTreeMap, BTreeSet};
|
use crate::utils::collections::{BTreeMap, BTreeSet};
|
||||||
|
|
|
@ -60,7 +60,7 @@ fn test_smt_insert_at_same_key_2() {
|
||||||
let key_msb: u64 = 42;
|
let key_msb: u64 = 42;
|
||||||
|
|
||||||
let key_already_present: RpoDigest =
|
let key_already_present: RpoDigest =
|
||||||
RpoDigest::from([2_u64.into(), 2_u64.into(), 2_u64.into(), Felt::new(key_msb)]);
|
RpoDigest::from([2_u32.into(), 2_u32.into(), 2_u32.into(), Felt::new(key_msb)]);
|
||||||
let key_already_present_index: NodeIndex =
|
let key_already_present_index: NodeIndex =
|
||||||
LeafIndex::<SMT_DEPTH>::from(key_already_present).into();
|
LeafIndex::<SMT_DEPTH>::from(key_already_present).into();
|
||||||
let value_already_present = [ONE + ONE + ONE; WORD_SIZE];
|
let value_already_present = [ONE + ONE + ONE; WORD_SIZE];
|
||||||
|
@ -192,13 +192,13 @@ fn test_smt_removal() {
|
||||||
|
|
||||||
let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw)]);
|
let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw)]);
|
||||||
let key_2: RpoDigest =
|
let key_2: RpoDigest =
|
||||||
RpoDigest::from([2_u64.into(), 2_u64.into(), 2_u64.into(), Felt::new(raw)]);
|
RpoDigest::from([2_u32.into(), 2_u32.into(), 2_u32.into(), Felt::new(raw)]);
|
||||||
let key_3: RpoDigest =
|
let key_3: RpoDigest =
|
||||||
RpoDigest::from([3_u64.into(), 3_u64.into(), 3_u64.into(), Felt::new(raw)]);
|
RpoDigest::from([3_u32.into(), 3_u32.into(), 3_u32.into(), Felt::new(raw)]);
|
||||||
|
|
||||||
let value_1 = [ONE; WORD_SIZE];
|
let value_1 = [ONE; WORD_SIZE];
|
||||||
let value_2 = [2_u64.into(); WORD_SIZE];
|
let value_2 = [2_u32.into(); WORD_SIZE];
|
||||||
let value_3: [Felt; 4] = [3_u64.into(); WORD_SIZE];
|
let value_3: [Felt; 4] = [3_u32.into(); WORD_SIZE];
|
||||||
|
|
||||||
// insert key-value 1
|
// insert key-value 1
|
||||||
{
|
{
|
||||||
|
@ -265,10 +265,10 @@ fn test_smt_path_to_keys_in_same_leaf_are_equal() {
|
||||||
|
|
||||||
let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw)]);
|
let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw)]);
|
||||||
let key_2: RpoDigest =
|
let key_2: RpoDigest =
|
||||||
RpoDigest::from([2_u64.into(), 2_u64.into(), 2_u64.into(), Felt::new(raw)]);
|
RpoDigest::from([2_u32.into(), 2_u32.into(), 2_u32.into(), Felt::new(raw)]);
|
||||||
|
|
||||||
let value_1 = [ONE; WORD_SIZE];
|
let value_1 = [ONE; WORD_SIZE];
|
||||||
let value_2 = [2_u64.into(); WORD_SIZE];
|
let value_2 = [2_u32.into(); WORD_SIZE];
|
||||||
|
|
||||||
let smt = Smt::with_entries([(key_1, value_1), (key_2, value_2)]).unwrap();
|
let smt = Smt::with_entries([(key_1, value_1), (key_2, value_2)]).unwrap();
|
||||||
|
|
||||||
|
@ -289,10 +289,10 @@ fn test_empty_leaf_hash() {
|
||||||
fn test_smt_get_value() {
|
fn test_smt_get_value() {
|
||||||
let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, ONE]);
|
let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, ONE]);
|
||||||
let key_2: RpoDigest =
|
let key_2: RpoDigest =
|
||||||
RpoDigest::from([2_u64.into(), 2_u64.into(), 2_u64.into(), 2_u64.into()]);
|
RpoDigest::from([2_u32.into(), 2_u32.into(), 2_u32.into(), 2_u32.into()]);
|
||||||
|
|
||||||
let value_1 = [ONE; WORD_SIZE];
|
let value_1 = [ONE; WORD_SIZE];
|
||||||
let value_2 = [2_u64.into(); WORD_SIZE];
|
let value_2 = [2_u32.into(); WORD_SIZE];
|
||||||
|
|
||||||
let smt = Smt::with_entries([(key_1, value_1), (key_2, value_2)]).unwrap();
|
let smt = Smt::with_entries([(key_1, value_1), (key_2, value_2)]).unwrap();
|
||||||
|
|
||||||
|
@ -304,7 +304,7 @@ fn test_smt_get_value() {
|
||||||
|
|
||||||
// Check that a key with no inserted value returns the empty word
|
// Check that a key with no inserted value returns the empty word
|
||||||
let key_no_value =
|
let key_no_value =
|
||||||
RpoDigest::from([42_u64.into(), 42_u64.into(), 42_u64.into(), 42_u64.into()]);
|
RpoDigest::from([42_u32.into(), 42_u32.into(), 42_u32.into(), 42_u32.into()]);
|
||||||
|
|
||||||
assert_eq!(EMPTY_WORD, smt.get_value(&key_no_value));
|
assert_eq!(EMPTY_WORD, smt.get_value(&key_no_value));
|
||||||
}
|
}
|
||||||
|
@ -314,10 +314,10 @@ fn test_smt_get_value() {
|
||||||
fn test_smt_entries() {
|
fn test_smt_entries() {
|
||||||
let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, ONE]);
|
let key_1: RpoDigest = RpoDigest::from([ONE, ONE, ONE, ONE]);
|
||||||
let key_2: RpoDigest =
|
let key_2: RpoDigest =
|
||||||
RpoDigest::from([2_u64.into(), 2_u64.into(), 2_u64.into(), 2_u64.into()]);
|
RpoDigest::from([2_u32.into(), 2_u32.into(), 2_u32.into(), 2_u32.into()]);
|
||||||
|
|
||||||
let value_1 = [ONE; WORD_SIZE];
|
let value_1 = [ONE; WORD_SIZE];
|
||||||
let value_2 = [2_u64.into(); WORD_SIZE];
|
let value_2 = [2_u32.into(); WORD_SIZE];
|
||||||
|
|
||||||
let smt = Smt::with_entries([(key_1, value_1), (key_2, value_2)]).unwrap();
|
let smt = Smt::with_entries([(key_1, value_1), (key_2, value_2)]).unwrap();
|
||||||
|
|
||||||
|
@ -348,8 +348,8 @@ fn test_empty_smt_leaf_serialization() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_single_smt_leaf_serialization() {
|
fn test_single_smt_leaf_serialization() {
|
||||||
let single_leaf = SmtLeaf::new_single(
|
let single_leaf = SmtLeaf::new_single(
|
||||||
RpoDigest::from([10_u64.into(), 11_u64.into(), 12_u64.into(), 13_u64.into()]),
|
RpoDigest::from([10_u32.into(), 11_u32.into(), 12_u32.into(), 13_u32.into()]),
|
||||||
[1_u64.into(), 2_u64.into(), 3_u64.into(), 4_u64.into()],
|
[1_u32.into(), 2_u32.into(), 3_u32.into(), 4_u32.into()],
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut serialized = single_leaf.to_bytes();
|
let mut serialized = single_leaf.to_bytes();
|
||||||
|
@ -364,12 +364,12 @@ fn test_single_smt_leaf_serialization() {
|
||||||
fn test_multiple_smt_leaf_serialization_success() {
|
fn test_multiple_smt_leaf_serialization_success() {
|
||||||
let multiple_leaf = SmtLeaf::new_multiple(vec![
|
let multiple_leaf = SmtLeaf::new_multiple(vec![
|
||||||
(
|
(
|
||||||
RpoDigest::from([10_u64.into(), 11_u64.into(), 12_u64.into(), 13_u64.into()]),
|
RpoDigest::from([10_u32.into(), 11_u32.into(), 12_u32.into(), 13_u32.into()]),
|
||||||
[1_u64.into(), 2_u64.into(), 3_u64.into(), 4_u64.into()],
|
[1_u32.into(), 2_u32.into(), 3_u32.into(), 4_u32.into()],
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
RpoDigest::from([100_u64.into(), 101_u64.into(), 102_u64.into(), 13_u64.into()]),
|
RpoDigest::from([100_u32.into(), 101_u32.into(), 102_u32.into(), 13_u32.into()]),
|
||||||
[11_u64.into(), 12_u64.into(), 13_u64.into(), 14_u64.into()],
|
[11_u32.into(), 12_u32.into(), 13_u32.into(), 14_u32.into()],
|
||||||
),
|
),
|
||||||
])
|
])
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
pub use winter_crypto::{DefaultRandomCoin as WinterRandomCoin, RandomCoin, RandomCoinError};
|
pub use winter_crypto::{DefaultRandomCoin as WinterRandomCoin, RandomCoin, RandomCoinError};
|
||||||
|
|
||||||
use crate::{Felt, FieldElement, StarkField, Word, ZERO};
|
use crate::{Felt, FieldElement, Word, ZERO};
|
||||||
|
|
||||||
mod rpo;
|
mod rpo;
|
||||||
pub use rpo::RpoRandomCoin;
|
pub use rpo::RpoRandomCoin;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use super::{Felt, FeltRng, FieldElement, StarkField, Word, ZERO};
|
use super::{Felt, FeltRng, FieldElement, Word, ZERO};
|
||||||
use crate::{
|
use crate::{
|
||||||
hash::rpo::{Rpo256, RpoDigest},
|
hash::rpo::{Rpo256, RpoDigest},
|
||||||
utils::{
|
utils::{
|
||||||
|
|
Loading…
Add table
Reference in a new issue