library_blockchain/
factory.rs

1use super::*;
2use transaction::{Amount, Transaction};
3use log::info;
4use std::cell::{Cell};
5use std::rc::Rc;
6
7#[allow(dead_code)]
8#[allow(unused_mut)]
9
10pub fn blockchain_factory<F>(
11    mut blockchain: Blockchain,
12    difficulty: u128,
13    f: F,
14) -> Result<(), CustomError>
15where
16    F: FnOnce() -> Result<serde_json::Value, CustomError>,
17{
18    let serde_values_transactions: serde_json::Value =
19        serde_json::from_value(f().unwrap())?;//.unwrap();
20    let blocks_val: serde_json::Value = serde_values_transactions["blocks"].clone();
21    let mut prev_hash: Box<[u8]> = Box::default();
22    blocks_val[0]
23        .as_object()
24        .unwrap()
25        .into_iter()
26        .enumerate()
27        .for_each(|(_i, block)| {
28            
29            let mut maked_transactions_of_a_block: Vec<Transaction> = vec![];
30            //info!("\nBlock {:?}\n",block);
31            block
32                .1
33                .as_array()
34                .unwrap()
35                .into_iter()
36                .enumerate()
37                .for_each(|(_j, trxs)| {
38                    let transactions = trxs.get("transactions").unwrap();
39                    let obg_trx = transactions.as_array().unwrap();
40                    let trx = obg_trx[0].as_object().unwrap();
41                    let length = &trx.keys().len() + 1;
42                    //info!("\n{:?}\n",trx);
43
44                    for c in 1..length {                        
45                        let mut  trx_name_string="transaction".to_string().to_owned();
46                        let trx_name=lib_block_concat_two_string(trx_name_string, c.to_string());                                                                        
47                        let trx = (transactions[0].as_object().unwrap())
48                            .get(&trx_name)
49                            .unwrap();
50                        let puts: Transaction = blockchain_transaction_split(trx).unwrap();
51                        //info!("\n{:?}\n",puts);
52                        maked_transactions_of_a_block.push(puts);
53                    }
54                });
55
56            let mut c: Cell<Vec<Transaction>> =
57                    Cell::new(maked_transactions_of_a_block.to_vec());
58            let mut r: Rc<Cell<Vec<Transaction>>> = Rc::new(c);
59            let mut rc: &mut Rc<Cell<Vec<Transaction>>> = &mut r;
60
61            if _i == 0 {
62                let mut genesis_block = Block::new(0, lib_block_now(), vec![0; 32], &mut Rc::clone(rc), difficulty);
63                prev_hash = genesis_block.blockchain_mine().unwrap().into_boxed_slice();
64                //info!("**Mined_hash:**\n{:?}\n",prev_hash.clone());                
65                blockchain_update_blockchain_result(&mut blockchain, genesis_block,&_i);
66                
67            } else if _i > 0 {
68                let mut maked_block: Block =
69                    Block::new(_i as u32, lib_block_now(), prev_hash.clone().to_vec(), &mut Rc::clone(rc), difficulty);
70                prev_hash = maked_block.blockchain_mine().unwrap().into_boxed_slice();
71                //info!("**Mined_hash:**\n{:?}\n",prev_hash.clone());                
72                blockchain_update_blockchain_result(&mut blockchain, maked_block,&_i);                
73            }
74        });
75
76    Ok(())
77}
78
79fn blockchain_update_blockchain_result(blockchain: &mut Blockchain, block: Block,& i:&usize) {
80    
81    //std::process::exit(
82        
83        match blockchain.blockchain_update_with_block(block) {
84        Ok(_) => {
85            info!("Success updated With the block {}.\n", 1+i.to_owned());
86            //info!("**Maked_hash:**\n{:?}\n",&blockchain.blocks[i].prev_block_hash.clone());
87            //0
88        }
89        Err(err) => {
90            eprintln!("Did not update on the Blockchain-Error in the block {} : {err:?}.",1+i.to_owned());
91            //1
92        }
93    }
94    //);
95}
96
97fn blockchain_transaction_split(trx: &serde_json::Value) -> Result<Transaction, CustomError> {
98    let mut trx_inputs_model_vec: Vec<Amount> = vec![];
99    let new_option_transaction: Transaction;
100
101    if trx.is_null() {
102        return Err(CustomError::BlockchainFactory(BlockainFactoryError::Other));
103    }
104    if trx[0].as_object().unwrap().is_empty() || trx[0].as_object().unwrap().len() < 1usize {
105        return Err(CustomError::BlockchainFactory(
106            BlockainFactoryError::IsNullTransaction,
107        ));
108    }
109    let trx_inputs = (trx[0].as_object().unwrap()).get("inputs").unwrap();
110
111    if !(trx_inputs.is_null()) && !(trx_inputs.as_array().is_none()) {
112        let trx_inputs_vec = trx_inputs.as_array().unwrap();
113
114        for item_internal_inputs in trx_inputs_vec {
115            let trx_inputs_model ;
116
117            if !item_internal_inputs.is_null() {
118                if !((item_internal_inputs["value"].is_null()
119                    && item_internal_inputs["to_addr"].is_null())
120                    || (item_internal_inputs["to_addr"].as_str().unwrap().is_empty()
121                        && item_internal_inputs["value"].as_str().unwrap().is_empty()))
122                {
123                    trx_inputs_model = Amount {
124                        to_addr: item_internal_inputs["to_addr"].as_str().unwrap().to_owned(),
125                        amount: item_internal_inputs["value"]
126                            .as_str()
127                            .unwrap()
128                            .parse::<u64>()
129                            .unwrap(),
130                    };
131                    trx_inputs_model_vec.push(trx_inputs_model);
132                }
133            }
134        }
135    }
136
137    let mut trx_outputs_model_vec: Vec<Amount> = vec![];
138    let trx_outputs = (trx[0].as_object().unwrap()).get("outputs").unwrap();
139
140    if !(trx_outputs.is_null()) && !(trx_outputs.as_array().is_none()) {
141        let trx_outputs_vec = trx_outputs.as_array().unwrap();
142
143        for item_internal_outputs in trx_outputs_vec {
144            let trx_outputs_model ;
145
146            if !item_internal_outputs.is_null() {
147                if !((item_internal_outputs["value"].is_null()
148                    && item_internal_outputs["to_addr"].is_null())
149                    || item_internal_outputs["value"].as_str().unwrap().is_empty()
150                        && item_internal_outputs["to_addr"]
151                            .as_str()
152                            .unwrap()
153                            .is_empty())
154                {
155                    trx_outputs_model = Amount {
156                        to_addr: item_internal_outputs["to_addr"]
157                            .as_str()
158                            .unwrap()
159                            .to_owned(),
160                        amount: item_internal_outputs["value"]
161                            .as_str()
162                            .unwrap()
163                            .parse::<u64>()
164                            .unwrap(),
165                    };
166                    trx_outputs_model_vec.push(trx_outputs_model);
167                }
168            }
169        }
170        new_option_transaction = Transaction::new(trx_inputs_model_vec, trx_outputs_model_vec);
171
172        return Ok(new_option_transaction);
173    }
174    return Err(CustomError::BlockchainFactory(BlockainFactoryError::Other));
175}