Skip to content

Commit 27f3193

Browse files
committed
fix historical nodes not being encoded correctly
1 parent 1d2a70e commit 27f3193

File tree

10 files changed

+322
-179
lines changed

10 files changed

+322
-179
lines changed

crates/katana/core/src/backend/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,16 @@ impl<'a, P: TrieWriter> UncommittedBlock<'a, P> {
252252

253253
// state_commitment = hPos("STARKNET_STATE_V0", contract_trie_root, class_trie_root)
254254
fn compute_new_state_root(&self) -> Felt {
255+
println!("ohayo im committing now");
255256
let class_trie_root = self
256257
.provider
257258
.trie_insert_declared_classes(self.header.number, &self.state_updates.declared_classes)
258-
.unwrap();
259+
.expect("failed to update class trie");
259260

260261
let contract_trie_root = self
261262
.provider
262263
.trie_insert_contract_updates(self.header.number, self.state_updates)
263-
.unwrap();
264+
.expect("failed to update contract trie");
264265

265266
hash::Poseidon::hash_array(&[
266267
short_string!("STARKNET_STATE_V0"),

crates/katana/rpc/rpc/src/starknet/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,8 +1158,8 @@ where
11581158
let mut contract_leaves_data = Vec::new();
11591159

11601160
for address in addresses {
1161-
let nonce = state.nonce(address)?.unwrap();
1162-
let class_hash = state.class_hash_of_contract(address)?.unwrap();
1161+
let nonce = state.nonce(address)?.unwrap_or_default();
1162+
let class_hash = state.class_hash_of_contract(address)?.unwrap_or_default();
11631163
contract_leaves_data.push(ContractLeafData { class_hash, nonce });
11641164
}
11651165

crates/katana/storage/db/src/models/trie.rs

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,48 @@
11
use katana_trie::bonsai::ByteVec;
22
use serde::{Deserialize, Serialize};
33

4-
use crate::codecs::{Decode, Encode};
4+
use crate::codecs::{Compress, Decode, Decompress, Encode};
55
use crate::error::CodecError;
66

7+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
8+
pub struct TrieHistoryEntry {
9+
pub key: TrieDatabaseKey,
10+
pub value: TrieDatabaseValue,
11+
}
12+
13+
impl Compress for TrieHistoryEntry {
14+
type Compressed = Vec<u8>;
15+
16+
fn compress(self) -> Self::Compressed {
17+
let mut buf = Vec::new();
18+
buf.extend(self.key.encode());
19+
buf.extend(self.value.compress());
20+
buf
21+
}
22+
}
23+
24+
impl Decompress for TrieHistoryEntry {
25+
fn decompress<B: AsRef<[u8]>>(bytes: B) -> Result<Self, CodecError> {
26+
let bytes = bytes.as_ref();
27+
28+
let key = TrieDatabaseKey::decode(bytes)?;
29+
// first byte is the key type, second byte is the actual key length
30+
let key_bytes_length = 1 + 1 + key.key.len();
31+
let value = TrieDatabaseValue::decompress(&bytes[key_bytes_length..])?;
32+
33+
Ok(Self { key, value })
34+
}
35+
}
36+
737
#[repr(u8)]
8-
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
38+
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
939
pub enum TrieDatabaseKeyType {
1040
Trie = 0,
1141
Flat,
1242
TrieLog,
1343
}
1444

15-
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
45+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
1646
pub struct TrieDatabaseKey {
1747
pub r#type: TrieDatabaseKeyType,
1848
pub key: Vec<u8>,
@@ -26,6 +56,7 @@ impl Encode for TrieDatabaseKey {
2656
fn encode(self) -> Self::Encoded {
2757
let mut encoded = Vec::new();
2858
encoded.push(self.r#type as u8);
59+
encoded.push(self.key.len() as u8); // Encode key length
2960
encoded.extend(self.key);
3061
encoded
3162
}
@@ -34,7 +65,9 @@ impl Encode for TrieDatabaseKey {
3465
impl Decode for TrieDatabaseKey {
3566
fn decode<B: AsRef<[u8]>>(bytes: B) -> Result<Self, CodecError> {
3667
let bytes = bytes.as_ref();
37-
if bytes.is_empty() {
68+
69+
if bytes.len() < 2 {
70+
// Need at least type and length bytes
3871
panic!("emptyy buffer")
3972
}
4073

@@ -45,7 +78,13 @@ impl Decode for TrieDatabaseKey {
4578
_ => panic!("Invalid trie database key type"),
4679
};
4780

48-
let key = bytes[1..].to_vec();
81+
let key_len = bytes[1] as usize;
82+
83+
if bytes.len() < 2 + key_len {
84+
panic!("Buffer too short for key length");
85+
}
86+
87+
let key = bytes[2..2 + key_len].to_vec();
4988

5089
Ok(TrieDatabaseKey { r#type, key })
5190
}

crates/katana/storage/db/src/tables.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::models::contract::{ContractClassChange, ContractInfoChangeList, Contr
1111
use crate::models::list::BlockList;
1212
use crate::models::stage::{StageCheckpoint, StageId};
1313
use crate::models::storage::{ContractStorageEntry, ContractStorageKey, StorageEntry};
14-
use crate::models::trie::{TrieDatabaseKey, TrieDatabaseValue};
14+
use crate::models::trie::{TrieDatabaseKey, TrieDatabaseValue, TrieHistoryEntry};
1515

1616
pub trait Key: Encode + Decode + Clone + std::fmt::Debug {}
1717
pub trait Value: Compress + Decompress + std::fmt::Debug {}
@@ -37,7 +37,12 @@ pub trait DupSort: Table {
3737
type SubKey: Key;
3838
}
3939

40-
pub trait Trie: Table<Key = TrieDatabaseKey, Value = TrieDatabaseValue> {}
40+
pub trait Trie: Table<Key = TrieDatabaseKey, Value = TrieDatabaseValue> {
41+
/// Table for storing the trie entries according to the block its was committed.
42+
type History: DupSort<Key = BlockNumber, SubKey = TrieDatabaseKey, Value = TrieHistoryEntry>;
43+
/// Table for storing the trie change set.
44+
type Changeset: Table<Key = TrieDatabaseKey, Value = BlockList>;
45+
}
4146

4247
/// Enum for the types of tables present in libmdbx.
4348
#[derive(Debug, PartialEq, Copy, Clone)]
@@ -249,11 +254,11 @@ tables! {
249254
StoragesTrie: (TrieDatabaseKey) => TrieDatabaseValue,
250255

251256
/// Class trie history
252-
ClassesTrieHistory: (BlockNumber, TrieDatabaseKey) => TrieDatabaseValue,
257+
ClassesTrieHistory: (BlockNumber, TrieDatabaseKey) => TrieHistoryEntry,
253258
/// Contract trie history
254-
ContractsTrieHistory: (BlockNumber,TrieDatabaseKey) => TrieDatabaseValue,
259+
ContractsTrieHistory: (BlockNumber, TrieDatabaseKey) => TrieHistoryEntry,
255260
/// Contract storage trie history
256-
StoragesTrieHistory: (BlockNumber,TrieDatabaseKey) => TrieDatabaseValue,
261+
StoragesTrieHistory: (BlockNumber, TrieDatabaseKey) => TrieHistoryEntry,
257262

258263
/// Class trie change set
259264
ClassesTrieChangeSet: (TrieDatabaseKey) => BlockList,
@@ -263,10 +268,20 @@ tables! {
263268
StoragesTrieChangeSet: (TrieDatabaseKey) => BlockList
264269
}
265270

266-
impl Trie for ClassesTrie {}
267-
impl Trie for ContractsTrie {}
268-
impl Trie for StoragesTrie {}
271+
impl Trie for ClassesTrie {
272+
type History = ClassesTrieHistory;
273+
type Changeset = ClassesTrieChangeSet;
274+
}
269275

276+
impl Trie for ContractsTrie {
277+
type History = ContractsTrieHistory;
278+
type Changeset = ContractsTrieChangeSet;
279+
}
280+
281+
impl Trie for StoragesTrie {
282+
type History = StoragesTrieHistory;
283+
type Changeset = StoragesTrieChangeSet;
284+
}
270285
#[cfg(test)]
271286
mod tests {
272287

0 commit comments

Comments
 (0)