1
- use std:: { collections:: HashMap , path:: Path } ;
1
+ use std:: { collections:: HashMap , path:: Path , sync :: Arc } ;
2
2
3
3
use crate :: {
4
4
block:: { self , BlockArc , TransactionBlock } ,
5
5
chain,
6
6
errors:: { BCTreeErrorKind , BlockChainTreeError } ,
7
- merkletree, tools,
7
+ merkletree,
8
+ static_values:: {
9
+ AMMOUNT_SUMMARY , BLOCKS_PER_EPOCH , GAS_SUMMARY , OLD_AMMOUNT_SUMMARY , OLD_GAS_SUMMARY ,
10
+ } ,
11
+ tools,
8
12
transaction:: Transaction ,
9
13
txpool,
14
+ types:: Hash ,
10
15
} ;
11
16
use error_stack:: { Report , ResultExt } ;
12
17
use primitive_types:: U256 ;
13
18
use sled:: Db ;
14
19
15
- static BLOCKCHAIN_DIRECTORY : & str = "./BlockChainTree/" ;
16
-
17
- static AMMOUNT_SUMMARY : & str = "./BlockChainTree/SUMMARY/" ;
18
- static OLD_AMMOUNT_SUMMARY : & str = "./BlockChainTree/SUMMARYOLD/" ;
19
-
20
- static GAS_SUMMARY : & str = "./BlockChainTree/GASSUMMARY/" ;
21
- static OLD_GAS_SUMMARY : & str = "./BlockChainTree/GASSUMMARYOLD/" ;
22
-
23
- static MAIN_CHAIN_DIRECTORY : & str = "./BlockChainTree/MAIN/" ;
24
-
25
- static DERIVATIVE_CHAINS_DIRECTORY : & str = "./BlockChainTree/DERIVATIVES/" ;
26
- static CHAINS_FOLDER : & str = "CHAINS/" ;
27
-
28
- static BLOCKS_FOLDER : & str = "BLOCKS/" ;
29
- static REFERENCES_FOLDER : & str = "REF/" ;
30
- static TRANSACTIONS_FOLDER : & str = "TRANSACTIONS/" ;
31
-
32
- static CONFIG_FILE : & str = "Chain.config" ;
33
- static LOOKUP_TABLE_FILE : & str = "LookUpTable.dat" ;
34
- static TRANSACTIONS_POOL : & str = "TRXS_POOL.pool" ;
35
-
36
- pub static BEGINNING_DIFFICULTY : [ u8 ; 32 ] = [
37
- 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
38
- 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
39
- ] ;
40
- static MAX_DIFFICULTY : [ u8 ; 32 ] = [
41
- 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
42
- 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 128 ,
43
- ] ;
44
-
45
- pub static FEE_STEP : u64 = 1000000 ;
46
-
47
- pub static ROOT_PRIVATE_ADDRESS : [ u8 ; 32 ] = [ 1u8 ; 32 ] ;
48
- pub static ROOT_PUBLIC_ADDRESS : [ u8 ; 33 ] = [
49
- 3 , 27 , 132 , 197 , 86 , 123 , 18 , 100 , 64 , 153 , 93 , 62 , 213 , 170 , 186 , 5 , 101 , 215 , 30 , 24 , 52 , 96 ,
50
- 72 , 25 , 255 , 156 , 23 , 245 , 233 , 213 , 221 , 7 , 143 ,
51
- ] ;
52
- pub static BLOCKS_PER_EPOCH : u64 = 100000 ;
53
- pub static INCEPTION_TIMESTAMP : u64 = 1597924800 ;
54
-
55
20
pub struct BlockChainTree {
56
21
pub main_chain : chain:: MainChain ,
57
22
pub derivative_chains : HashMap < [ u8 ; 32 ] , chain:: DerivativeChain > ,
@@ -352,9 +317,9 @@ impl BlockChainTree {
352
317
& self ,
353
318
pow : [ u8 ; 32 ] ,
354
319
founder : [ u8 ; 33 ] ,
355
- transactions : & [ Transaction ] ,
320
+ transactions : & [ Hash ] ,
356
321
timestamp : u64 ,
357
- ) -> Result < [ u8 ; 32 ] , Report < BlockChainTreeError > > {
322
+ ) -> Result < block :: BlockArc , Report < BlockChainTreeError > > {
358
323
let last_block = self . main_chain . get_last_block ( ) . await ?. unwrap ( ) ; // practically cannot fail
359
324
let prev_hash = last_block
360
325
. hash ( )
@@ -364,33 +329,54 @@ impl BlockChainTree {
364
329
if !tools:: check_pow ( & prev_hash, & last_block. get_info ( ) . difficulty , & pow) {
365
330
return Err ( BlockChainTreeError :: BlockChainTree ( BCTreeErrorKind :: WrongPow ) . into ( ) ) ;
366
331
} ;
367
-
332
+ let mut difficulty = last_block. get_info ( ) . difficulty ;
333
+ tools:: recalculate_difficulty ( last_block. get_info ( ) . timestamp , timestamp, & mut difficulty) ;
334
+ let fee = tools:: recalculate_fee ( & difficulty) ;
368
335
let default_info = block:: BasicInfo {
369
336
timestamp,
370
337
pow,
371
338
previous_hash : prev_hash,
372
339
height : last_block. get_info ( ) . height ,
373
- difficulty : last_block . get_info ( ) . difficulty ,
340
+ difficulty,
374
341
founder,
375
342
} ;
376
- if ( ( last_block. get_info ( ) . height + 1 ) % BLOCKS_PER_EPOCH ) . is_zero ( ) {
377
- if transactions. len ( ) != 0 {
378
- return Err ( BlockChainTreeError :: BlockChainTree (
379
- BCTreeErrorKind :: SummarizeBlockWrongTransactionsAmount ,
380
- )
381
- . into ( ) ) ;
382
- }
383
-
384
- let summarized_hash = self . summarize ( ) ?;
385
-
386
- //let merkle_tree = merkletree::MerkleTree::build_tree()
387
- //block::SummarizeBlock {
388
- // default_info,
389
- // merkle_tree_root: todo!(),
390
- //};
391
- }
392
-
393
- todo ! ( )
343
+ let new_block: block:: BlockArc =
344
+ if ( ( last_block. get_info ( ) . height + 1 ) % BLOCKS_PER_EPOCH ) . is_zero ( ) {
345
+ if transactions. len ( ) != 0 {
346
+ return Err ( BlockChainTreeError :: BlockChainTree (
347
+ BCTreeErrorKind :: SummarizeBlockWrongTransactionsAmount ,
348
+ )
349
+ . into ( ) ) ;
350
+ }
351
+
352
+ let merkle_tree_root = self . summarize ( ) ?;
353
+
354
+ let summarize_block = Arc :: new ( block:: SummarizeBlock {
355
+ default_info,
356
+ merkle_tree_root,
357
+ } ) ;
358
+
359
+ summarize_block
360
+ } else {
361
+ if transactions. len ( ) == 0 {
362
+ return Err ( BlockChainTreeError :: BlockChainTree (
363
+ BCTreeErrorKind :: CreateMainChainBlock ,
364
+ )
365
+ . into ( ) ) ;
366
+ }
367
+
368
+ let merkle_tree = merkletree:: MerkleTree :: build_tree ( transactions) ;
369
+ let transaction_block = Arc :: new ( block:: TransactionBlock :: new (
370
+ fee,
371
+ default_info,
372
+ * merkle_tree. get_root ( ) ,
373
+ Vec :: from_iter ( transactions. iter ( ) . cloned ( ) ) ,
374
+ ) ) ;
375
+ transaction_block
376
+ } ;
377
+
378
+ self . main_chain . add_block ( new_block. clone ( ) ) . await ?;
379
+ Ok ( new_block)
394
380
}
395
381
396
382
pub async fn flush ( & self ) -> Result < ( ) , Report < BlockChainTreeError > > {
0 commit comments