Skip to content

Commit b7f99ff

Browse files
committed
feat: db initial state
1 parent ebc7f84 commit b7f99ff

1 file changed

Lines changed: 63 additions & 27 deletions

File tree

  • examples/L2/crates/l2/src

examples/L2/crates/l2/src/db.rs

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
use std::{
2-
collections::HashMap,
2+
collections::BTreeMap,
33
fs::File,
44
io::{BufReader, BufWriter},
5+
str::FromStr,
56
};
67

78
use lambdaworks_crypto::merkle_tree::merkle::MerkleTree;
8-
use primitive_types::H160;
9+
use primitive_types::{H160, U256};
910
use rand::Rng;
1011
use types::{Transfer, UserState};
1112

1213
pub struct DB {
13-
pub user_states: HashMap<H160, UserState>,
14-
pub root: [u8; 32],
14+
pub user_states: BTreeMap<H160, UserState>,
1515
pub file_path: String,
1616
}
1717

@@ -21,21 +21,39 @@ pub enum DBError {
2121
}
2222

2323
impl DB {
24-
pub fn new(file_path: String) -> Result<Self, DBError> {
24+
pub fn new(file_path: String) -> Self {
25+
match Self::new_from_file(file_path.clone()) {
26+
Ok(db) => db,
27+
Err(e) => {
28+
println!("Error when loading db from file {:?}, will start a new db with a default initial state", e);
29+
// if db does not exists, create one with initial state
30+
let initial_state = Self::initial_state();
31+
let mut user_states: BTreeMap<H160, UserState> = BTreeMap::new();
32+
for state in initial_state {
33+
user_states.insert(state.address, state);
34+
}
35+
36+
DB {
37+
user_states,
38+
file_path,
39+
}
40+
}
41+
}
42+
}
43+
44+
fn new_from_file(file_path: String) -> Result<Self, DBError> {
2545
let file = File::open(&file_path).map_err(|e| DBError::IO(e.to_string()))?;
2646
let reader = BufReader::new(file);
2747
let user_states: Vec<UserState> =
2848
serde_json::from_reader(reader).map_err(|e| DBError::IO(e.to_string()))?;
29-
let root = MerkleTree::<UserState>::build(&user_states).unwrap().root;
3049

31-
let mut user_states_map: HashMap<H160, UserState> = HashMap::new();
50+
let mut user_states_map: BTreeMap<H160, UserState> = BTreeMap::new();
3251
for state in user_states {
3352
user_states_map.insert(state.address, state);
3453
}
3554

3655
let db = Self {
3756
user_states: user_states_map,
38-
root,
3957
file_path,
4058
};
4159

@@ -58,36 +76,54 @@ impl DB {
5876
}
5977

6078
fn initial_state() -> Vec<UserState> {
61-
vec![]
62-
}
63-
64-
pub fn upsert(&mut self, address: H160, new_state: UserState) {
65-
self.user_states.insert(address, new_state);
79+
vec![
80+
UserState {
81+
address: H160::from_str("0x742d35Cc6634C0532925a3b844Bc454e4438f44e").unwrap(),
82+
balance: U256::from_dec_str("100000000000000000000").unwrap(),
83+
nonce: U256::from(0),
84+
},
85+
UserState {
86+
address: H160::from_str("0x53d284357ec70cE289D6D64134DfAc8E511c8a3D").unwrap(),
87+
balance: U256::from_dec_str("50000000000000000000").unwrap(),
88+
nonce: U256::from(1),
89+
},
90+
UserState {
91+
address: H160::from_str("0xfe9e8709d3215310075d67e3ed32a380ccf451c8").unwrap(),
92+
balance: U256::from_dec_str("250000000000000000000").unwrap(),
93+
nonce: U256::from(2),
94+
},
95+
UserState {
96+
address: H160::from_str("0xab5801a7d398351b8be11c439e05c5b3259aec9b").unwrap(),
97+
balance: U256::from_dec_str("75000000000000000000").unwrap(),
98+
nonce: U256::from(5),
99+
},
100+
]
66101
}
67102
}
68103

69104
pub fn generate_random_transfers(db: &DB, num_to_generate: usize) -> Vec<Transfer> {
70105
let mut transfers = vec![];
71106
let mut rng = rand::thread_rng();
72107

73-
for _ in 0..num_to_generate {
74-
let accounts: Vec<&UserState> = db.user_states.values().collect();
108+
let mut accounts: Vec<UserState> = db.user_states.clone().into_values().collect();
75109

76-
let sender = accounts
77-
.get(rng.gen_range(0..db.user_states.len()))
78-
.cloned()
79-
.unwrap();
110+
for _ in 0..num_to_generate {
111+
let (from, amount) = {
112+
let user = accounts
113+
.get_mut(rng.gen_range(0..db.user_states.len()))
114+
.unwrap();
115+
let new_balance = user.balance / 2;
116+
user.balance = new_balance;
117+
118+
(user.address, new_balance)
119+
};
80120

81-
let receiver = accounts
121+
let to = accounts
82122
.get(rng.gen_range(0..db.user_states.len()))
83-
.cloned()
84-
.unwrap();
123+
.unwrap()
124+
.address;
85125

86-
let transfer = Transfer {
87-
amount: sender.balance / 2,
88-
from: sender.address,
89-
to: receiver.address,
90-
};
126+
let transfer = Transfer { amount, from, to };
91127

92128
transfers.push(transfer);
93129
}

0 commit comments

Comments
 (0)