library_blockchain/
factory.rs1use 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())?;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 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 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 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 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 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 match blockchain.blockchain_update_with_block(block) {
84 Ok(_) => {
85 info!("Success updated With the block {}.\n", 1+i.to_owned());
86 }
89 Err(err) => {
90 eprintln!("Did not update on the Blockchain-Error in the block {} : {err:?}.",1+i.to_owned());
91 }
93 }
94 }
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}