From 26bbea35d75198c6d86b00f90b100be802261f6d Mon Sep 17 00:00:00 2001 From: Dori Medini Date: Wed, 5 Feb 2025 17:18:34 +0200 Subject: [PATCH] feat(starknet_os,starknet_patricia,starknet_committer): deserializable commitment info --- Cargo.lock | 7 ++++++ Cargo.toml | 1 + crates/starknet_committer/Cargo.toml | 3 +++ .../src/block_committer/input.rs | 1 + .../patricia_merkle_tree/leaf/leaf_impl.rs | 1 + .../src/patricia_merkle_tree/types.rs | 3 +++ crates/starknet_os/Cargo.toml | 4 +++ crates/starknet_os/src/io/os_input.rs | 25 ++++++++++++++++++- crates/starknet_patricia/Cargo.toml | 1 + .../starknet_patricia/src/hash/hash_trait.rs | 1 + .../node_data/inner_node.rs | 6 +++++ .../src/patricia_merkle_tree/types.rs | 2 ++ 12 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 7950d4389e4..a405957850b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4134,6 +4134,9 @@ name = "ethnum" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" +dependencies = [ + "serde", +] [[package]] name = "event-listener" @@ -10806,6 +10809,7 @@ dependencies = [ "hex", "pretty_assertions", "rstest", + "serde", "serde_json", "starknet-types-core", "starknet_patricia", @@ -11239,8 +11243,11 @@ dependencies = [ "blockifier", "cairo-vm", "indoc 2.0.5", + "serde", "starknet-types-core", "starknet_api", + "starknet_committer", + "starknet_patricia", "strum 0.25.0", "strum_macros 0.25.3", "thiserror 1.0.69", diff --git a/Cargo.toml b/Cargo.toml index 65d7f366534..a281a471e2d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -241,6 +241,7 @@ starknet_mempool_p2p = { path = "crates/starknet_mempool_p2p", version = "0.0.0" starknet_mempool_p2p_types = { path = "crates/starknet_mempool_p2p_types", version = "0.0.0" } starknet_mempool_types = { path = "crates/starknet_mempool_types", version = "0.0.0" } starknet_monitoring_endpoint = { path = "crates/starknet_monitoring_endpoint", version = "0.0.0" } +starknet_os = { path = "crates/starknet_os", version = "0.0.0" } starknet_patricia = { path = "crates/starknet_patricia", version = "0.0.0" } starknet_sequencer_infra = { path = "crates/starknet_sequencer_infra", version = "0.0.0" } starknet_sequencer_metrics = { path = "crates/starknet_sequencer_metrics", version = "0.0.0" } diff --git a/crates/starknet_committer/Cargo.toml b/crates/starknet_committer/Cargo.toml index bc354434e19..527e22ffd59 100644 --- a/crates/starknet_committer/Cargo.toml +++ b/crates/starknet_committer/Cargo.toml @@ -6,11 +6,14 @@ repository.workspace = true license.workspace = true description = "Computes and manages Starknet state." +[features] +deserialize = ["serde", "starknet_patricia/deserialize"] [dependencies] hex.workspace = true pretty_assertions.workspace = true rstest.workspace = true +serde = { workspace = true, optional = true, features = ["derive"] } serde_json.workspace = true starknet-types-core = { workspace = true, features = ["hash"] } starknet_patricia = { workspace = true, features = ["testing"] } diff --git a/crates/starknet_committer/src/block_committer/input.rs b/crates/starknet_committer/src/block_committer/input.rs index 62590b2465b..a51acc0beb1 100644 --- a/crates/starknet_committer/src/block_committer/input.rs +++ b/crates/starknet_committer/src/block_committer/input.rs @@ -53,6 +53,7 @@ impl From<&StarknetStorageKey> for NodeIndex { } } +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Default, Debug, Eq, PartialEq)] pub struct StarknetStorageValue(pub Felt); diff --git a/crates/starknet_committer/src/patricia_merkle_tree/leaf/leaf_impl.rs b/crates/starknet_committer/src/patricia_merkle_tree/leaf/leaf_impl.rs index 0e7d3df7ce3..688d00a253c 100644 --- a/crates/starknet_committer/src/patricia_merkle_tree/leaf/leaf_impl.rs +++ b/crates/starknet_committer/src/patricia_merkle_tree/leaf/leaf_impl.rs @@ -10,6 +10,7 @@ use crate::block_committer::input::StarknetStorageValue; use crate::hash_function::hash::TreeHashFunctionImpl; use crate::patricia_merkle_tree::types::{ClassHash, CompiledClassHash, Nonce}; +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct ContractState { pub nonce: Nonce, diff --git a/crates/starknet_committer/src/patricia_merkle_tree/types.rs b/crates/starknet_committer/src/patricia_merkle_tree/types.rs index ec88e7b2566..bca5071bb95 100644 --- a/crates/starknet_committer/src/patricia_merkle_tree/types.rs +++ b/crates/starknet_committer/src/patricia_merkle_tree/types.rs @@ -10,6 +10,7 @@ use crate::block_committer::input::{ContractAddress, StarknetStorageValue}; use crate::patricia_merkle_tree::leaf::leaf_impl::ContractState; // TODO(Nimrod, 1/6/2024): Use the ClassHash defined in starknet-types-core when available. +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] pub struct ClassHash(pub Felt); @@ -20,11 +21,13 @@ impl From<&ClassHash> for NodeIndex { } impl_from_hex_for_felt_wrapper!(ClassHash); +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] pub struct Nonce(pub Felt); impl_from_hex_for_felt_wrapper!(Nonce); +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] pub struct CompiledClassHash(pub Felt); diff --git a/crates/starknet_os/Cargo.toml b/crates/starknet_os/Cargo.toml index 34b3eb02eba..3e96b0403a1 100644 --- a/crates/starknet_os/Cargo.toml +++ b/crates/starknet_os/Cargo.toml @@ -7,14 +7,18 @@ license-file.workspace = true description = "The Starknet OS." [features] +deserialize = ["starknet_committer/deserialize", "starknet_patricia/deserialize"] testing = ["dep:strum", "dep:strum_macros"] [dependencies] blockifier.workspace = true cairo-vm.workspace = true indoc.workspace = true +serde.workspace = true starknet-types-core.workspace = true starknet_api.workspace = true +starknet_committer.workspace = true +starknet_patricia.workspace = true strum = { workspace = true, optional = true } strum_macros = { workspace = true, optional = true } thiserror.workspace = true diff --git a/crates/starknet_os/src/io/os_input.rs b/crates/starknet_os/src/io/os_input.rs index afb6037723f..df4f1d3620b 100644 --- a/crates/starknet_os/src/io/os_input.rs +++ b/crates/starknet_os/src/io/os_input.rs @@ -1,4 +1,27 @@ +use std::collections::HashMap; + +use starknet_committer::block_committer::input::StarknetStorageValue; +use starknet_committer::patricia_merkle_tree::leaf::leaf_impl::ContractState; +use starknet_committer::patricia_merkle_tree::types::CompiledClassHash; +use starknet_patricia::hash::hash_trait::HashOutput; +use starknet_patricia::patricia_merkle_tree::node_data::inner_node::NodeData; +use starknet_patricia::patricia_merkle_tree::node_data::leaf::Leaf; +use starknet_patricia::patricia_merkle_tree::types::SubTreeHeight; + +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] +pub struct CommitmentInfo { + _previous_root: HashOutput, + _updated_root: HashOutput, + _tree_height: SubTreeHeight, + _commitment_facts: HashMap>, +} + /// All input needed to initialize the execution helper. // TODO(Dori): Add all fields needed to compute commitments, initialize a CachedState and other data // required by the execution helper. -pub struct StarknetOsInput {} +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] +pub struct StarknetOsInput { + _contract_commitments: CommitmentInfo, + _storage_commitments: CommitmentInfo, + _class_commitments: CommitmentInfo, +} diff --git a/crates/starknet_patricia/Cargo.toml b/crates/starknet_patricia/Cargo.toml index f636ebd8629..91c9cceba1d 100644 --- a/crates/starknet_patricia/Cargo.toml +++ b/crates/starknet_patricia/Cargo.toml @@ -10,6 +10,7 @@ description = "Library for computing and updating Patricia trees." workspace = true [features] +deserialize = ["ethnum/serde"] testing = [] [dev-dependencies] diff --git a/crates/starknet_patricia/src/hash/hash_trait.rs b/crates/starknet_patricia/src/hash/hash_trait.rs index c7ace47813e..ccc464f85f8 100644 --- a/crates/starknet_patricia/src/hash/hash_trait.rs +++ b/crates/starknet_patricia/src/hash/hash_trait.rs @@ -3,6 +3,7 @@ use starknet_types_core::felt::FromStrError; use crate::felt::Felt; use crate::impl_from_hex_for_felt_wrapper; +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] pub struct HashOutput(pub Felt); diff --git a/crates/starknet_patricia/src/patricia_merkle_tree/node_data/inner_node.rs b/crates/starknet_patricia/src/patricia_merkle_tree/node_data/inner_node.rs index 4f2950a4f44..19f1433d994 100644 --- a/crates/starknet_patricia/src/patricia_merkle_tree/node_data/inner_node.rs +++ b/crates/starknet_patricia/src/patricia_merkle_tree/node_data/inner_node.rs @@ -11,6 +11,7 @@ use crate::patricia_merkle_tree::types::{NodeIndex, SubTreeHeight}; pub mod inner_node_test; #[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[cfg_attr(any(test, feature = "testing"), derive(strum_macros::EnumDiscriminants))] #[cfg_attr(any(test, feature = "testing"), strum_discriminants(derive(strum_macros::EnumIter)))] // A Patricia-Merkle tree node's data, i.e., the pre-image of its hash. @@ -20,6 +21,7 @@ pub enum NodeData { Leaf(L), } +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct BinaryData { pub left_hash: HashOutput, @@ -27,6 +29,7 @@ pub struct BinaryData { } // Wraps a U256. Maximal possible value is the longest path in a tree of height 251 (2 ^ 251 - 1). +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] pub struct EdgePath(pub U256); @@ -63,6 +66,7 @@ impl From<&EdgePath> for U256 { path.0 } } +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive( Clone, Copy, Debug, Default, PartialOrd, derive_more::Add, derive_more::Sub, PartialEq, Eq, Hash, )] @@ -94,6 +98,7 @@ impl From for Felt { } #[allow(clippy::manual_non_exhaustive)] +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] pub struct PathToBottom { pub path: EdgePath, @@ -116,6 +121,7 @@ impl PathToBottom { } } +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] pub struct EdgeData { pub bottom_hash: HashOutput, diff --git a/crates/starknet_patricia/src/patricia_merkle_tree/types.rs b/crates/starknet_patricia/src/patricia_merkle_tree/types.rs index 370731e0bd1..cfc0a089aad 100644 --- a/crates/starknet_patricia/src/patricia_merkle_tree/types.rs +++ b/crates/starknet_patricia/src/patricia_merkle_tree/types.rs @@ -8,6 +8,7 @@ use crate::patricia_merkle_tree::node_data::inner_node::{EdgePathLength, PathToB #[path = "types_test.rs"] pub mod types_test; +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive(Clone, Copy, Debug, Eq, PartialEq, derive_more::Sub, derive_more::Display)] pub struct SubTreeHeight(pub(crate) u8); @@ -28,6 +29,7 @@ impl From for u8 { } } +#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] #[derive( Clone, Copy, Debug, PartialEq, Eq, Hash, derive_more::BitAnd, derive_more::Sub, PartialOrd, Ord, )]