Skip to content

Commit fa2cf6d

Browse files
authored
feat: add len to ThinStateDiff (#191)
* feat!: add missing fields to BlockHeader * feat: add len to ThinStateDiff
1 parent 1fc73f2 commit fa2cf6d

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed

src/block.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use derive_more::Display;
88
use serde::{Deserialize, Serialize};
99

1010
use crate::core::{
11-
EventCommitment, GlobalRoot, SequencerContractAddress, SequencerPublicKey, StateDiffCommitment,
12-
TransactionCommitment,
11+
EventCommitment, GlobalRoot, ReceiptCommitment, SequencerContractAddress, SequencerPublicKey,
12+
StateDiffCommitment, TransactionCommitment,
1313
};
1414
use crate::crypto::{verify_message_hash_signature, CryptoError, Signature};
1515
use crate::data_availability::L1DataAvailabilityMode;
@@ -61,13 +61,17 @@ pub struct BlockHeader {
6161
#[serde(skip_serializing)]
6262
pub state_diff_commitment: Option<StateDiffCommitment>,
6363
#[serde(skip_serializing)]
64+
pub state_diff_length: Option<usize>,
65+
#[serde(skip_serializing)]
6466
pub transaction_commitment: Option<TransactionCommitment>,
6567
#[serde(skip_serializing)]
6668
pub event_commitment: Option<EventCommitment>,
6769
#[serde(skip_serializing)]
6870
pub n_transactions: Option<usize>,
6971
#[serde(skip_serializing)]
7072
pub n_events: Option<usize>,
73+
#[serde(skip_serializing)]
74+
pub receipt_commitment: Option<ReceiptCommitment>,
7175
pub starknet_version: StarknetVersion,
7276
}
7377

src/core.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,23 @@ pub struct TransactionCommitment(pub StarkHash);
227227
)]
228228
pub struct EventCommitment(pub StarkHash);
229229

230+
/// The commitment on the receipts in a [Block](`crate::block::Block`).
231+
#[derive(
232+
Debug,
233+
Copy,
234+
Clone,
235+
Default,
236+
Eq,
237+
PartialEq,
238+
Hash,
239+
Deserialize,
240+
Serialize,
241+
PartialOrd,
242+
Ord,
243+
Display,
244+
)]
245+
pub struct ReceiptCommitment(pub StarkHash);
246+
230247
#[derive(
231248
Debug, Copy, Clone, Default, Eq, PartialEq, Hash, Deserialize, Serialize, PartialOrd, Ord,
232249
)]

src/state.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,22 @@ impl ThinStateDiff {
8484
diff.deprecated_declared_classes,
8585
)
8686
}
87+
88+
#[allow(clippy::len_without_is_empty)]
89+
/// This has the same value as `state_diff_length` in the corresponding `BlockHeader`.
90+
pub fn len(&self) -> usize {
91+
let mut result = 0usize;
92+
result += self.deployed_contracts.len();
93+
result += self.declared_classes.len();
94+
result += self.deprecated_declared_classes.len();
95+
result += self.nonces.len();
96+
result += self.replaced_classes.len();
97+
98+
for (_contract_address, storage_diffs) in &self.storage_diffs {
99+
result += storage_diffs.len();
100+
}
101+
result
102+
}
87103
}
88104

89105
impl From<StateDiff> for ThinStateDiff {

src/state_test.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use std::collections::HashMap;
22

3+
use indexmap::indexmap;
34
use serde_json::json;
45

6+
use super::ThinStateDiff;
7+
use crate::core::{ClassHash, CompiledClassHash, Nonce};
58
use crate::deprecated_contract_class::EntryPointOffset;
69

710
#[test]
@@ -22,3 +25,39 @@ fn entry_point_offset_into_json_str() {
2225
let offset = EntryPointOffset(123);
2326
assert_eq!(json!(offset), json!(format!("{:#x}", offset.0)));
2427
}
28+
29+
#[test]
30+
fn thin_state_diff_len() {
31+
let state_diff = ThinStateDiff {
32+
deployed_contracts: indexmap! {
33+
0u64.into() => ClassHash(4u64.into()),
34+
},
35+
storage_diffs: indexmap! {
36+
0u64.into() => indexmap! {
37+
0u64.into() => 0u64.into(),
38+
1u64.into() => 1u64.into(),
39+
},
40+
1u64.into() => indexmap! {
41+
0u64.into() => 0u64.into(),
42+
},
43+
},
44+
declared_classes: indexmap! {
45+
ClassHash(4u64.into()) => CompiledClassHash(9u64.into()),
46+
ClassHash(5u64.into()) => CompiledClassHash(10u64.into()),
47+
},
48+
deprecated_declared_classes: vec![
49+
ClassHash(6u64.into()),
50+
ClassHash(7u64.into()),
51+
ClassHash(8u64.into()),
52+
],
53+
nonces: indexmap! {
54+
0u64.into() => Nonce(1u64.into()),
55+
1u64.into() => Nonce(1u64.into()),
56+
},
57+
replaced_classes: indexmap! {
58+
2u64.into() => ClassHash(4u64.into()),
59+
3u64.into() => ClassHash(5u64.into()),
60+
},
61+
};
62+
assert_eq!(state_diff.len(), 13);
63+
}

0 commit comments

Comments
 (0)