diff --git a/Cargo.lock b/Cargo.lock index e4606c9..556c450 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -535,16 +535,13 @@ dependencies = [ "log", "lru 0.12.1", "mp-commitments", - "mp-felt", - "mp-hashers", - "mp-transactions", "parity-scale-codec", - "parking_lot", "rand 0.8.5", "rocksdb", "rustc-hex", "serde", "smallvec", + "starknet-types-core", "tempfile", ] @@ -862,6 +859,38 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" +dependencies = [ + "cfg-if", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -1627,6 +1656,29 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "lambdaworks-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e0b347cdcff23c4b1f2a14ca475f6214106130e8c1df955352ddb01a37b8e8" +dependencies = [ + "lambdaworks-math", + "serde", + "sha2 0.10.8", + "sha3", + "thiserror", +] + +[[package]] +name = "lambdaworks-math" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "540c0715d7da472edc421ceca702d3f3a716b3b9168b6211f2e3939cb14c863c" +dependencies = [ + "rayon", + "thiserror", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1829,6 +1881,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + [[package]] name = "merlin" version = "2.0.1" @@ -2381,6 +2442,26 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -3058,6 +3139,21 @@ dependencies = [ "serde", ] +[[package]] +name = "starknet-types-core" +version = "0.0.4" +source = "git+https://github.com/starknet-io/types-rs?rev=096770d939b15f0d50d3b3a9735a0ca5522d4f37#096770d939b15f0d50d3b3a9735a0ca5522d4f37" +dependencies = [ + "bitvec", + "lambdaworks-crypto", + "lambdaworks-math", + "lazy_static", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "starknet_api" version = "0.4.1" @@ -3685,7 +3781,7 @@ dependencies = [ "log", "mach", "memfd", - "memoffset", + "memoffset 0.8.0", "paste", "rand 0.8.5", "rustix 0.36.17", diff --git a/Cargo.toml b/Cargo.toml index bb755ae..d17cad7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [features] -default = ["rocksdb"] +default = [] rocksdb = ["dep:rocksdb"] [dependencies] @@ -17,13 +17,9 @@ smallvec = "1.11.2" rustc-hex = "2.1.0" env_logger = "0.10.1" lru = "0.12.1" -parking_lot = "0.12.1" - -bitvec = { version = "1", default-features = false } +bitvec = { version = "1" } derive_more = { version = "0.99.17", features = ["constructor"] } -mp-felt = { git = "https://github.com/keep-starknet-strange/madara.git", rev = "f30acea8af7e28e956e771928130e12bfc084832", package = "mp-felt", features = ["parity-scale-codec", "serde"]} -mp-hashers = { git = "https://github.com/keep-starknet-strange/madara.git", rev = "f30acea8af7e28e956e771928130e12bfc084832", package = "mp-hashers" } -mp-transactions = { git = "https://github.com/keep-starknet-strange/madara.git", rev = "f30acea8af7e28e956e771928130e12bfc084832", package = "mp-transactions", features = ["parity-scale-codec", "serde"] } +starknet-types-core = { git = "https://github.com/starknet-io/types-rs", rev = "096770d939b15f0d50d3b3a9735a0ca5522d4f37", package = "starknet-types-core", features=["hash"] } [dev-dependencies] tempfile = "3.8.0" diff --git a/README.md b/README.md index 0052d1b..a38a913 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ use bonsai_trie::{ id::{BasicIdBuilder, BasicId}, BonsaiStorage, BonsaiStorageConfig, BonsaiTrieHash, }; -use mp_felt::Felt252Wrapper; +use mp_felt::Felt; use bitvec::prelude::*; fn main() { @@ -54,12 +54,12 @@ fn main() { let mut id_builder = BasicIdBuilder::new(); // Insert an item `pair1`. - let pair1 = (vec![1, 2, 1], Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap()); + let pair1 = (vec![1, 2, 1], Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap()); let bitvec_1 = BitVec::from_vec(pair1.0.clone()); bonsai_storage.insert(&bitvec_1, &pair1.1).unwrap(); // Insert a second item `pair2`. - let pair2 = (vec![1, 2, 2], Felt252Wrapper::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap()); + let pair2 = (vec![1, 2, 2], Felt::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap()); let bitvec = BitVec::from_vec(pair2.0.clone()); bonsai_storage.insert(&bitvec, &pair2.1).unwrap(); @@ -68,7 +68,7 @@ fn main() { bonsai_storage.commit(id1); // Insert a new item `pair3`. - let pair3 = (vec![1, 2, 2], Felt252Wrapper::from_hex_be("0x664D033c195fec3ce2568b62052e").unwrap()); + let pair3 = (vec![1, 2, 2], Felt::from_hex_be("0x664D033c195fec3ce2568b62052e").unwrap()); let bitvec = BitVec::from_vec(pair3.0.clone()); bonsai_storage.insert(&bitvec, &pair3.1).unwrap(); @@ -126,7 +126,7 @@ fn main() { // Insert a new item and commit. let pair4 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); bonsai_storage .insert(&BitVec::from_vec(pair4.0.clone()), &pair4.1) diff --git a/src/databases/hashmap_db.rs b/src/databases/hashmap_db.rs index df37e1f..5a0b8d1 100644 --- a/src/databases/hashmap_db.rs +++ b/src/databases/hashmap_db.rs @@ -25,7 +25,7 @@ impl From for BonsaiStorageError { } } -#[derive(Clone)] +#[derive(Clone, Default)] pub struct HashMapDbConfig {} #[derive(Clone)] diff --git a/src/databases/mod.rs b/src/databases/mod.rs index 27a1f3d..2f3eb0f 100644 --- a/src/databases/mod.rs +++ b/src/databases/mod.rs @@ -1,6 +1,9 @@ #![allow(dead_code)] mod hashmap_db; +pub use hashmap_db::{HashMapDb, HashMapDbConfig}; +#[cfg(feature = "rocksdb")] mod rocks_db; +#[cfg(feature = "rocksdb")] pub use rocks_db::{create_rocks_db, RocksDB, RocksDBBatch, RocksDBConfig}; diff --git a/src/felt.rs b/src/felt.rs new file mode 100644 index 0000000..0dfa0e0 --- /dev/null +++ b/src/felt.rs @@ -0,0 +1,21 @@ +// This file is there just to make Felts serializable with the parity-scale-codec crate. + +use parity_scale_codec::{Decode, Encode, Error, Input, Output}; +use starknet_types_core::felt::Felt; + +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct FeltWrapper(pub Felt); + +impl Encode for FeltWrapper { + fn encode_to(&self, dest: &mut T) { + dest.write(&self.0.to_bytes_be()); + } +} + +impl Decode for FeltWrapper { + fn decode(input: &mut I) -> Result { + let mut buf: [u8; 32] = [0; 32]; + input.read(&mut buf)?; + Ok(FeltWrapper(Felt::from_bytes_be(&buf))) + } +} diff --git a/src/lib.rs b/src/lib.rs index b3a8677..0d7ba7f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,7 +10,7 @@ //! # id::{BasicIdBuilder, BasicId}, //! # BonsaiStorage, BonsaiStorageConfig, BonsaiTrieHash, //! # }; -//! # use mp_felt::Felt252Wrapper; +//! # use mp_felt::Felt; //! # use bitvec::prelude::*; //! let db = create_rocks_db("./rocksdb").unwrap(); //! let config = BonsaiStorageConfig::default(); @@ -18,18 +18,18 @@ //! let mut bonsai_storage = BonsaiStorage::new(RocksDB::new(&db, RocksDBConfig::default()), config).unwrap(); //! let mut id_builder = BasicIdBuilder::new(); //! -//! let pair1 = (vec![1, 2, 1], Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap()); +//! let pair1 = (vec![1, 2, 1], Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap()); //! let bitvec_1 = BitVec::from_vec(pair1.0.clone()); //! bonsai_storage.insert(&bitvec_1, &pair1.1).unwrap(); //! -//! let pair2 = (vec![1, 2, 2], Felt252Wrapper::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap()); +//! let pair2 = (vec![1, 2, 2], Felt::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap()); //! let bitvec = BitVec::from_vec(pair2.0.clone()); //! bonsai_storage.insert(&bitvec, &pair2.1).unwrap(); //! //! let id1 = id_builder.new_id(); //! bonsai_storage.commit(id1); //! -//! let pair3 = (vec![1, 2, 2], Felt252Wrapper::from_hex_be("0x664D033c195fec3ce2568b62052e").unwrap()); +//! let pair3 = (vec![1, 2, 2], Felt::from_hex_be("0x664D033c195fec3ce2568b62052e").unwrap()); //! let bitvec = BitVec::from_vec(pair3.0.clone()); //! bonsai_storage.insert(&bitvec, &pair3.1).unwrap(); //! @@ -74,7 +74,7 @@ //! .unwrap(); //! let pair2 = ( //! vec![1, 2, 3], -//! Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), +//! Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), //! ); //! bonsai_storage //! .insert(&BitVec::from_vec(pair2.0.clone()), &pair2.1) @@ -84,15 +84,14 @@ use bitvec::{order::Msb0, slice::BitSlice}; use bonsai_database::BonsaiPersistentDatabase; +use bonsai_database::KeyType; use changes::ChangeBatch; use key_value_db::KeyValueDB; -use mp_felt::Felt252Wrapper; -use mp_hashers::pedersen::PedersenHasher; - -use bonsai_database::KeyType; +use starknet_types_core::{felt::Felt, hash::StarkHash}; use trie::merkle_tree::MerkleTree; mod changes; +mod felt; mod key_value_db; mod trie; @@ -140,22 +139,24 @@ impl Default for BonsaiStorageConfig { /// Structure that hold the trie and all the necessary information to work with it. /// /// This structure is the main entry point to work with this crate. -pub struct BonsaiStorage +pub struct BonsaiStorage where DB: BonsaiDatabase, ChangeID: id::Id, + H: StarkHash, { - trie: MerkleTree, + trie: MerkleTree, } /// Trie root hash type. -pub type BonsaiTrieHash = Felt252Wrapper; +pub type BonsaiTrieHash = Felt; -impl BonsaiStorage +impl BonsaiStorage where DB: BonsaiDatabase, ChangeID: id::Id, BonsaiStorageError: std::convert::From<::DatabaseError>, + H: StarkHash, { /// Create a new bonsai storage instance pub fn new(db: DB, config: BonsaiStorageConfig) -> Result { @@ -181,7 +182,7 @@ where pub fn insert( &mut self, key: &BitSlice, - value: &Felt252Wrapper, + value: &Felt, ) -> Result<(), BonsaiStorageError> { self.trie.set(key, *value)?; Ok(()) @@ -190,15 +191,12 @@ where /// Remove a key/value in the trie /// If the value doesn't exist it will do nothing pub fn remove(&mut self, key: &BitSlice) -> Result<(), BonsaiStorageError> { - self.trie.set(key, Felt252Wrapper::ZERO)?; + self.trie.set(key, Felt::ZERO)?; Ok(()) } /// Get a value in the trie. - pub fn get( - &self, - key: &BitSlice, - ) -> Result, BonsaiStorageError> { + pub fn get(&self, key: &BitSlice) -> Result, BonsaiStorageError> { self.trie.get(key) } @@ -298,11 +296,12 @@ where } } -impl BonsaiStorage +impl BonsaiStorage where DB: BonsaiDatabase + BonsaiPersistentDatabase, ChangeID: id::Id, BonsaiStorageError: std::convert::From<::DatabaseError>, + H: StarkHash, { /// Update trie and database using all changes since the last commit. pub fn commit(&mut self, id: ChangeID) -> Result<(), BonsaiStorageError> { @@ -320,7 +319,7 @@ where &self, change_id: ChangeID, config: BonsaiStorageConfig, - ) -> Result>, BonsaiStorageError> + ) -> Result>, BonsaiStorageError> where BonsaiStorageError: std::convert::From<::DatabaseError>, { @@ -343,7 +342,7 @@ where /// Merge a transactional state into the main trie. pub fn merge( &mut self, - transactional_bonsai_storage: BonsaiStorage, + transactional_bonsai_storage: BonsaiStorage, ) -> Result<(), BonsaiStorageError> where BonsaiStorageError: diff --git a/src/tests/madara_comparison.rs b/src/tests/madara_comparison.rs index b7d7c0d..62ce202 100644 --- a/src/tests/madara_comparison.rs +++ b/src/tests/madara_comparison.rs @@ -1,5 +1,5 @@ use bitvec::{bits, order::Msb0, vec::BitVec}; -use mp_felt::Felt252Wrapper; +use mp_felt::Felt; use crate::{ databases::{create_rocks_db, RocksDB, RocksDBConfig}, @@ -17,7 +17,7 @@ fn trie_height_251() { for i in 0..251 { let mut key: BitVec = bits![u8, Msb0; 0; 251].to_bitvec(); key.set(i, true); - let value = Felt252Wrapper::from_hex_be("0x01").unwrap(); + let value = Felt::from_hex_be("0x01").unwrap(); bonsai_storage.insert(key.as_bitslice(), &value).unwrap(); } let mut id_builder = BasicIdBuilder::new(); @@ -32,7 +32,7 @@ fn trie_height_251() { // for i in 0..251 { // let mut key: BitVec = bits![u8, Msb0; 0; 251].to_bitvec(); // key.set(i, true); -// let value = Felt252Wrapper::from_hex_be("0x01").unwrap(); +// let value = Felt::from_hex_be("0x01").unwrap(); // tree.set(key.as_bitslice(), value); // } // let root_hash = tree.commit(); diff --git a/src/tests/simple.rs b/src/tests/simple.rs index c9a4139..fbce972 100644 --- a/src/tests/simple.rs +++ b/src/tests/simple.rs @@ -4,7 +4,7 @@ use crate::{ BonsaiStorage, BonsaiStorageConfig, }; use bitvec::vec::BitVec; -use mp_felt::Felt252Wrapper; +use mp_felt::Felt; #[test] fn basics() { @@ -16,21 +16,21 @@ fn basics() { let mut id_builder = BasicIdBuilder::new(); let pair1 = ( vec![1, 2, 1], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); let bitvec = BitVec::from_vec(pair1.0.clone()); bonsai_storage.insert(&bitvec, &pair1.1).unwrap(); bonsai_storage.commit(id_builder.new_id()).unwrap(); let pair2 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap(), ); let bitvec = BitVec::from_vec(pair2.0.clone()); bonsai_storage.insert(&bitvec, &pair2.1).unwrap(); bonsai_storage.commit(id_builder.new_id()).unwrap(); let pair3 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap(), ); let bitvec = BitVec::from_vec(pair3.0.clone()); bonsai_storage.insert(&bitvec, &pair3.1).unwrap(); diff --git a/src/tests/transactional_state.rs b/src/tests/transactional_state.rs index 5311c2e..52ce090 100644 --- a/src/tests/transactional_state.rs +++ b/src/tests/transactional_state.rs @@ -4,7 +4,7 @@ use crate::{ BonsaiStorage, BonsaiStorageConfig, }; use bitvec::vec::BitVec; -use mp_felt::Felt252Wrapper; +use mp_felt::Felt; #[test] fn basics() { @@ -17,7 +17,7 @@ fn basics() { let pair1 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -26,7 +26,7 @@ fn basics() { let pair2 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap(), ); let id2 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair2.0.clone()); @@ -54,7 +54,7 @@ fn test_thread() { let pair1 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -86,7 +86,7 @@ fn test_thread() { .unwrap(); let pair2 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); bonsai_storage .insert(&BitVec::from_vec(pair2.0.clone()), &pair2.1) @@ -105,7 +105,7 @@ fn remove() { let pair1 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -144,7 +144,7 @@ fn merge() { let pair1 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -156,7 +156,7 @@ fn merge() { .unwrap(); let pair2 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); bonsai_at_txn .insert(&BitVec::from_vec(pair2.0.clone()), &pair2.1) @@ -184,7 +184,7 @@ fn merge_override() { let pair1 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -196,7 +196,7 @@ fn merge_override() { .unwrap(); let pair2 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); bonsai_at_txn .insert(&BitVec::from_vec(pair2.0.clone()), &pair2.1) @@ -224,7 +224,7 @@ fn merge_remove() { let pair1 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -258,7 +258,7 @@ fn merge_txn_revert() { let pair1 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -279,7 +279,7 @@ fn merge_txn_revert() { let pair2 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); bonsai_at_txn .insert(&BitVec::from_vec(pair2.0.clone()), &pair2.1) @@ -313,7 +313,7 @@ fn merge_invalid() { let pair1 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD5D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -332,7 +332,7 @@ fn merge_invalid() { let pair2 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); bonsai_storage .insert(&BitVec::from_vec(pair2.0.clone()), &pair2.1) @@ -357,7 +357,7 @@ fn many_snapshots() { let pair1 = ( vec![1, 2, 2], - Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -366,7 +366,7 @@ fn many_snapshots() { let pair2 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FD54D033c195fec3ce2568b62052e").unwrap(), ); let id2 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair2.0.clone()); diff --git a/src/tests/trie_log.rs b/src/tests/trie_log.rs index 7d50eb4..014ee29 100644 --- a/src/tests/trie_log.rs +++ b/src/tests/trie_log.rs @@ -4,7 +4,7 @@ use crate::{ BonsaiStorage, BonsaiStorageConfig, BonsaiTrieHash, }; use bitvec::vec::BitVec; -use mp_felt::Felt252Wrapper; +use mp_felt::Felt; #[test] fn basics() { @@ -17,7 +17,7 @@ fn basics() { let pair1 = ( vec![1, 2, 1], - &Felt252Wrapper::from_hex_be("0x16342762FDD54D033c195fec3ce2568b62052e").unwrap(), + &Felt::from_hex_be("0x16342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -28,7 +28,7 @@ fn basics() { let id2 = id_builder.new_id(); let pair2 = ( vec![1, 2, 2], - &Felt252Wrapper::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), + &Felt::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), ); let bitvec = BitVec::from_vec(pair2.0.clone()); bonsai_storage.insert(&bitvec, pair2.1).unwrap(); @@ -61,7 +61,7 @@ fn unrecorded_revert() { let pair1 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -103,7 +103,7 @@ fn truncated_revert() { let pair1 = ( vec![1, 2, 1], - &Felt252Wrapper::from_hex_be("0x16342762FDD54D033c195fec3ce2568b62052e").unwrap(), + &Felt::from_hex_be("0x16342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -114,7 +114,7 @@ fn truncated_revert() { let id2 = id_builder.new_id(); let pair2 = ( vec![1, 2, 2], - &Felt252Wrapper::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), + &Felt::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), ); let bitvec = BitVec::from_vec(pair2.0.clone()); bonsai_storage.insert(&bitvec, pair2.1).unwrap(); @@ -138,7 +138,7 @@ fn double_revert() { let pair1 = ( vec![1, 2, 1], - &Felt252Wrapper::from_hex_be("0x16342762FDD54D033c195fec3ce2568b62052e").unwrap(), + &Felt::from_hex_be("0x16342762FDD54D033c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); @@ -149,7 +149,7 @@ fn double_revert() { let id2 = id_builder.new_id(); let pair2 = ( vec![1, 2, 2], - &Felt252Wrapper::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), + &Felt::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), ); let bitvec = BitVec::from_vec(pair2.0.clone()); bonsai_storage.insert(&bitvec, pair2.1).unwrap(); @@ -175,7 +175,7 @@ fn remove_and_reinsert() { let pair1 = ( vec![1, 2, 3], - Felt252Wrapper::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), + Felt::from_hex_be("0x66342762FDD54D3c195fec3ce2568b62052e").unwrap(), ); let id1 = id_builder.new_id(); let bitvec = BitVec::from_vec(pair1.0.clone()); diff --git a/src/trie/merkle_node.rs b/src/trie/merkle_node.rs index 9ec8e1e..c02df4e 100644 --- a/src/trie/merkle_node.rs +++ b/src/trie/merkle_node.rs @@ -4,10 +4,11 @@ //! For more information about how these Starknet trees are structured, see //! [`MerkleTree`](super::merkle_tree::MerkleTree). +use crate::felt::FeltWrapper; use bitvec::order::Msb0; use bitvec::slice::BitSlice; -use mp_felt::Felt252Wrapper; use parity_scale_codec::{Decode, Encode}; +use starknet_types_core::felt::Felt; use super::merkle_tree::Path; @@ -33,7 +34,7 @@ pub enum Node { /// A node that has not been fetched from storage yet. /// /// As such, all we know is its hash. - Unresolved(Felt252Wrapper), + Unresolved(FeltWrapper), /// A branch node with exactly two children. Binary(BinaryNode), /// Describes a path connecting two other nodes. @@ -42,7 +43,7 @@ pub enum Node { #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Encode, Decode)] pub enum NodeHandle { - Hash(Felt252Wrapper), + Hash(FeltWrapper), InMemory(NodeId), } @@ -50,7 +51,7 @@ pub enum NodeHandle { #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Encode, Decode)] pub struct BinaryNode { /// The hash of this node. - pub hash: Option, + pub hash: Option, /// The height of this node in the tree. pub height: u64, /// [Left](Direction::Left) child. @@ -64,7 +65,7 @@ pub struct BinaryNode { pub struct EdgeNode { /// The hash of this node. Is [None] if the node /// has not yet been committed. - pub hash: Option, + pub hash: Option, /// The starting height of this node in the tree. pub height: u64, /// The path this edge takes. @@ -157,12 +158,12 @@ impl BinaryNode { impl Node { /// Returns true if the node represents an empty node -- this is defined as a node - /// with the [Felt252Wrapper::ZERO]. + /// with the [Felt::ZERO]. /// /// This can occur for the root node in an empty graph. pub fn is_empty(&self) -> bool { match self { - Node::Unresolved(hash) => hash == &Felt252Wrapper::ZERO, + Node::Unresolved(FeltWrapper(hash)) => hash == &Felt::ZERO, _ => false, } } @@ -180,11 +181,11 @@ impl Node { } } - pub fn hash(&self) -> Option { + pub fn hash(&self) -> Option { match self { - Node::Unresolved(hash) => Some(*hash), - Node::Binary(binary) => binary.hash, - Node::Edge(edge) => edge.hash, + Node::Unresolved(hash) => Some(hash.0), + Node::Binary(binary) => binary.hash.map(|hash| hash.0), + Node::Edge(edge) => edge.hash.map(|hash| hash.0), } } } diff --git a/src/trie/merkle_tree.rs b/src/trie/merkle_tree.rs index 2b6df9f..0badbe8 100644 --- a/src/trie/merkle_tree.rs +++ b/src/trie/merkle_tree.rs @@ -6,12 +6,11 @@ use bitvec::{ view::BitView, }; use derive_more::Constructor; -use mp_felt::Felt252Wrapper; -use mp_hashers::HasherT; use parity_scale_codec::{Decode, Encode, Error, Input, Output}; +use starknet_types_core::{felt::Felt, hash::StarkHash}; use std::{collections::HashMap, mem}; -use crate::{error::BonsaiStorageError, id::Id, BonsaiDatabase, KeyValueDB}; +use crate::{error::BonsaiStorageError, felt::FeltWrapper, id::Id, BonsaiDatabase, KeyValueDB}; use super::{ merkle_node::{BinaryNode, Direction, EdgeNode, Node, NodeHandle, NodeId}, @@ -119,14 +118,14 @@ fn test_shared_path_encode_decode() { /// states. /// /// For more information on how this functions internally, see [here](super::merkle_node). -pub struct MerkleTree { +pub struct MerkleTree { root_handle: NodeHandle, - root_hash: Felt252Wrapper, + root_hash: Felt, storage_nodes: NodesMapping, db: KeyValueDB, latest_node_id: NodeId, death_row: Vec, - cache_leaf_modified: HashMap, InsertOrRemove>, + cache_leaf_modified: HashMap, InsertOrRemove>, _hasher: PhantomData, } @@ -136,7 +135,7 @@ enum InsertOrRemove { Remove, } -impl MerkleTree { +impl MerkleTree { /// Less visible initialization for `MerkleTree` as the main entry points should be /// [`MerkleTree::::load`] for persistent trees and [`MerkleTree::empty`] for /// transient ones. @@ -153,16 +152,16 @@ impl MerkleTree { } else { db.insert( &TrieKeyType::Trie(vec![]), - &Node::Unresolved(Felt252Wrapper::ZERO).encode(), + &Node::Unresolved(FeltWrapper(Felt::ZERO)).encode(), None, )?; - Node::Unresolved(Felt252Wrapper::ZERO) + Node::Unresolved(FeltWrapper(Felt::ZERO)) }; let root = node.hash().ok_or(BonsaiStorageError::Trie( "Root doesn't exist in the storage".to_string(), ))?; Ok(Self { - root_handle: NodeHandle::Hash(root), + root_handle: NodeHandle::Hash(FeltWrapper(root)), root_hash: root, storage_nodes: NodesMapping(nodes_mapping), db, @@ -173,7 +172,7 @@ impl MerkleTree { }) } - pub fn root_hash(&self) -> Felt252Wrapper { + pub fn root_hash(&self) -> Felt { self.root_hash } @@ -192,13 +191,13 @@ impl MerkleTree { self.latest_node_id.reset(); self.storage_nodes.0.clear(); self.cache_leaf_modified.clear(); - self.root_handle = NodeHandle::Hash(node_hash); + self.root_handle = NodeHandle::Hash(FeltWrapper(node_hash)); self.root_hash = node_hash; Ok(()) } /// Persists all changes to storage and returns the new root hash. - pub fn commit(&mut self) -> Result + pub fn commit(&mut self) -> Result where BonsaiStorageError: std::convert::From<::DatabaseError>, { @@ -210,8 +209,11 @@ impl MerkleTree { for (key, value) in mem::take(&mut self.cache_leaf_modified) { match value { InsertOrRemove::Insert(value) => { - self.db - .insert(&TrieKeyType::Flat(key), &value.encode(), Some(&mut batch))?; + self.db.insert( + &TrieKeyType::Flat(key), + &FeltWrapper(value).encode(), + Some(&mut batch), + )?; } InsertOrRemove::Remove => { self.db.remove(&TrieKeyType::Flat(key), Some(&mut batch))?; @@ -221,7 +223,7 @@ impl MerkleTree { self.db.write_batch(batch)?; self.latest_node_id.reset(); self.root_hash = root_hash; - self.root_handle = NodeHandle::Hash(root_hash); + self.root_handle = NodeHandle::Hash(FeltWrapper(root_hash)); Ok(root_hash) } @@ -241,13 +243,13 @@ impl MerkleTree { node_handle: NodeHandle, path: BitVec, batch: &mut DB::Batch, - ) -> Result + ) -> Result where BonsaiStorageError: std::convert::From<::DatabaseError>, { use Node::*; let node_id = match node_handle { - NodeHandle::Hash(hash) => return Ok(hash), + NodeHandle::Hash(hash) => return Ok(hash.0), NodeHandle::InMemory(root_id) => root_id, }; @@ -265,9 +267,9 @@ impl MerkleTree { &Node::Unresolved(hash).encode(), Some(batch), )?; - Ok(hash) + Ok(hash.0) } else { - Ok(hash) + Ok(hash.0) } } Binary(mut binary) => { @@ -277,10 +279,10 @@ impl MerkleTree { let mut right_path = path.clone(); right_path.push(true); let right_hash = self.commit_subtree(binary.right, right_path, batch)?; - let hash = Felt252Wrapper(H::hash_elements(left_hash.0, right_hash.0)); - binary.hash = Some(hash); - binary.left = NodeHandle::Hash(left_hash); - binary.right = NodeHandle::Hash(right_hash); + let hash = H::hash(&left_hash, &right_hash); + binary.hash = Some(FeltWrapper(hash)); + binary.left = NodeHandle::Hash(FeltWrapper(left_hash)); + binary.right = NodeHandle::Hash(FeltWrapper(right_hash)); let key_bytes = [&[path.len() as u8], path.as_raw_slice()].concat(); self.db.insert( &TrieKeyType::Trie(key_bytes), @@ -298,19 +300,15 @@ impl MerkleTree { bytes.view_bits_mut::()[256 - edge.path.0.len()..] .copy_from_bitslice(&edge.path.0); - let felt_path = Felt252Wrapper::try_from(&bytes).map_err(|err| { - BonsaiStorageError::Trie(format!("Couldn't convert path to felt: {}", err)) - })?; + let felt_path = Felt::from_bytes_be(&bytes); let mut length = [0; 32]; // Safe as len() is guaranteed to be <= 251 length[31] = edge.path.0.len() as u8; - let length = Felt252Wrapper::try_from(&length).map_err(|err| { - BonsaiStorageError::Trie(format!("Couldn't convert length to felt: {}", err)) - })?; - let hash = Felt252Wrapper(H::hash_elements(child_hash.0, felt_path.0) + length.0); - edge.hash = Some(hash); - edge.child = NodeHandle::Hash(child_hash); + let length = Felt::from_bytes_be(&length); + let hash = H::hash(&child_hash, &felt_path) + &length; + edge.hash = Some(FeltWrapper(hash)); + edge.child = NodeHandle::Hash(FeltWrapper(child_hash)); let key_bytes = if path.is_empty() { vec![] } else { @@ -326,21 +324,17 @@ impl MerkleTree { } } - /// Sets the value of a key. To delete a key, set the value to [Felt252Wrapper::ZERO]. + /// Sets the value of a key. To delete a key, set the value to [Felt::ZERO]. /// /// # Arguments /// /// * `key` - The key to set. /// * `value` - The value to set. - pub fn set( - &mut self, - key: &BitSlice, - value: Felt252Wrapper, - ) -> Result<(), BonsaiStorageError> + pub fn set(&mut self, key: &BitSlice, value: Felt) -> Result<(), BonsaiStorageError> where BonsaiStorageError: std::convert::From<::DatabaseError>, { - if value == Felt252Wrapper::ZERO { + if value == Felt::ZERO { return self.delete_leaf(key); } let path = self.preload_nodes(key)?; @@ -371,7 +365,7 @@ impl MerkleTree { // Height of the binary node let branch_height = edge.height as usize + common.len(); if branch_height == key.len() { - edge.child = NodeHandle::Hash(value); + edge.child = NodeHandle::Hash(FeltWrapper(value)); // The leaf already exists, we simply change its value. let key_bytes = [&[key.len() as u8], key.to_bitvec().as_raw_slice()].concat(); @@ -395,13 +389,13 @@ impl MerkleTree { .insert(key_bytes, InsertOrRemove::Insert(value)); let new = if new_path.is_empty() { - NodeHandle::Hash(value) + NodeHandle::Hash(FeltWrapper(value)) } else { let new_edge = Node::Edge(EdgeNode { hash: None, height: child_height as u64, path: Path(new_path), - child: NodeHandle::Hash(value), + child: NodeHandle::Hash(FeltWrapper(value)), }); let edge_id = self.latest_node_id.next_id(); nodes_to_add.push((edge_id, new_edge)); @@ -475,7 +469,7 @@ impl MerkleTree { hash: None, height: 0, path: Path(key.to_bitvec()), - child: NodeHandle::Hash(value), + child: NodeHandle::Hash(FeltWrapper(value)), }); self.storage_nodes .0 @@ -506,7 +500,7 @@ impl MerkleTree { /// Deletes a leaf node from the tree. /// /// This is not an external facing API; the functionality is instead accessed by calling - /// [`MerkleTree::set`] with value set to [`Felt252Wrapper::ZERO`]. + /// [`MerkleTree::set`] with value set to [`Felt::ZERO`]. /// /// # Arguments /// @@ -606,11 +600,12 @@ impl MerkleTree { // We reached the root without a hitting binary node. The new tree // must therefore be empty. self.latest_node_id.next_id(); - self.storage_nodes - .0 - .insert(self.latest_node_id, Node::Unresolved(Felt252Wrapper::ZERO)); + self.storage_nodes.0.insert( + self.latest_node_id, + Node::Unresolved(FeltWrapper(Felt::ZERO)), + ); self.root_handle = NodeHandle::InMemory(self.latest_node_id); - self.root_hash = Felt252Wrapper::ZERO; + self.root_hash = Felt::ZERO; return Ok(()); } }; @@ -671,10 +666,7 @@ impl MerkleTree { /// # Returns /// /// The value of the key. - pub fn get( - &self, - key: &BitSlice, - ) -> Result, BonsaiStorageError> + pub fn get(&self, key: &BitSlice) -> Result, BonsaiStorageError> where BonsaiStorageError: std::convert::From<::DatabaseError>, { @@ -687,7 +679,7 @@ impl MerkleTree { } self.db .get(&TrieKeyType::Flat(key.to_vec())) - .map(|r| r.map(|opt| Felt252Wrapper::decode(&mut opt.as_slice()).unwrap())) + .map(|r| r.map(|opt| FeltWrapper::decode(&mut opt.as_slice()).unwrap().0)) } pub fn contains(&self, key: &BitSlice) -> Result @@ -949,11 +941,10 @@ impl MerkleTree { mod tests { use bitvec::vec::BitVec; use mp_commitments::{calculate_class_commitment_leaf_hash, StateCommitmentTree}; - use mp_felt::Felt252Wrapper; - use mp_hashers::pedersen::PedersenHasher; + use starknet_types_core::{felt::Felt, hash::StarkHash}; use crate::{ - databases::{create_rocks_db, RocksDB, RocksDBConfig}, + databases::{HashMapDb, HashMapDbConfig}, id::BasicId, key_value_db::KeyValueDBConfig, KeyValueDB, @@ -973,12 +964,11 @@ mod tests { let random_byte: u8 = rng.gen(); element.push_str(&format!("{:02x}", random_byte)); } - elements.push(Felt252Wrapper::from_hex_be(&element).unwrap()); + elements.push(Felt::from_hex(&element).unwrap()); } - let rocks_db = create_rocks_db(std::path::Path::new(tempdir.path())).unwrap(); - let rocks_db = RocksDB::new(&rocks_db, RocksDBConfig::default()); - let db = KeyValueDB::new(rocks_db, KeyValueDBConfig::default(), None); - let mut bonsai_tree: super::MerkleTree, BasicId> = + let underlying_db = HashMapDb::new(HashMapDbConfig::default()); + let db = KeyValueDB::new(underlying_db, KeyValueDBConfig::default(), None); + let mut bonsai_tree: super::MerkleTree, BasicId> = super::MerkleTree::new(db).unwrap(); let root_hash = mp_commitments::calculate_class_commitment_tree_root_hash::(&elements); @@ -1003,9 +993,9 @@ mod tests { let mut bonsai_tree: super::MerkleTree, BasicId> = super::MerkleTree::new(db).unwrap(); let elements = [ - [Felt252Wrapper::from_hex_be("0x665342762FDD54D0303c195fec3ce2568b62052e").unwrap()], - [Felt252Wrapper::from_hex_be("0x66342762FDD54D0303c195fec3ce2568b62052e").unwrap()], - [Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap()], + [Felt::from_hex_be("0x665342762FDD54D0303c195fec3ce2568b62052e").unwrap()], + [Felt::from_hex_be("0x66342762FDD54D0303c195fec3ce2568b62052e").unwrap()], + [Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap()], ]; for elem in elements { elem.iter().for_each(|class_hash| { @@ -1032,9 +1022,9 @@ mod tests { let mut bonsai_tree: super::MerkleTree, BasicId> = super::MerkleTree::new(db).unwrap(); let elements = [ - [Felt252Wrapper::from_hex_be("0x665342762FDD54D0303c195fec3ce2568b62052e").unwrap()], - [Felt252Wrapper::from_hex_be("0x66342762FDD54D0303c195fec3ce2568b62052e").unwrap()], - [Felt252Wrapper::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap()], + [Felt::from_hex_be("0x665342762FDD54D0303c195fec3ce2568b62052e").unwrap()], + [Felt::from_hex_be("0x66342762FDD54D0303c195fec3ce2568b62052e").unwrap()], + [Felt::from_hex_be("0x66342762FDD54D033c195fec3ce2568b62052e").unwrap()], ]; for elem in elements { elem.iter().for_each(|class_hash| { @@ -1051,7 +1041,7 @@ mod tests { elem.iter().for_each(|class_hash| { let key = &class_hash.0.to_bytes_be()[..31]; bonsai_tree - .set(&BitVec::from_vec(key.to_vec()), Felt252Wrapper::ZERO) + .set(&BitVec::from_vec(key.to_vec()), Felt::ZERO) .unwrap(); }); } @@ -1079,7 +1069,7 @@ mod tests { let random_byte: u8 = rng.gen(); element.push_str(&format!("{:02x}", random_byte)); } - elements.push(Felt252Wrapper::from_hex_be(&element).unwrap()); + elements.push(Felt::from_hex_be(&element).unwrap()); } elements.iter().for_each(|class_hash| { let final_hash = @@ -1117,10 +1107,10 @@ mod tests { // element.push_str(&format!("{:02x}", random_byte)); // } // if rng.gen_bool(0.1) { - // elements_to_delete.push(Felt252Wrapper::from_hex_be(&element).unwrap()); - // elements.push(Felt252Wrapper::from_hex_be(&element).unwrap()); + // elements_to_delete.push(Felt::from_hex_be(&element).unwrap()); + // elements.push(Felt::from_hex_be(&element).unwrap()); // } else { - // elements.push(Felt252Wrapper::from_hex_be(&element).unwrap()); + // elements.push(Felt::from_hex_be(&element).unwrap()); // } // } // elements.iter().for_each(|class_hash| { @@ -1136,9 +1126,9 @@ mod tests { // assert_eq!(bonsai_root_hash, madara_root_hash); // } // elements_to_delete.iter().for_each(|class_hash| { - // madara_tree.set(*class_hash, Felt252Wrapper::ZERO); + // madara_tree.set(*class_hash, Felt::ZERO); // let key = &class_hash.0.to_bytes_be()[..31]; - // bonsai_tree.set(&BitVec::from_vec(key.to_vec()), Felt252Wrapper::ZERO); + // bonsai_tree.set(&BitVec::from_vec(key.to_vec()), Felt::ZERO); // }); // let bonsai_root_hash = bonsai_tree.commit();