11use std:: {
2- collections:: HashMap ,
2+ collections:: BTreeMap ,
33 fs:: File ,
44 io:: { BufReader , BufWriter } ,
5+ str:: FromStr ,
56} ;
67
78use lambdaworks_crypto:: merkle_tree:: merkle:: MerkleTree ;
8- use primitive_types:: H160 ;
9+ use primitive_types:: { H160 , U256 } ;
910use rand:: Rng ;
1011use types:: { Transfer , UserState } ;
1112
1213pub 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
2323impl 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
69104pub 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