10
10
import java .util .List ;
11
11
import java .util .Map ;
12
12
import java .util .Objects ;
13
+ import java .util .stream .Collectors ;
13
14
import java .util .stream .Stream ;
14
15
import javafx .util .Pair ;
15
16
import lombok .Getter ;
21
22
import org .tron .core .capsule .BlockCapsule ;
22
23
import org .tron .core .capsule .BlockCapsule .BlockId ;
23
24
import org .tron .core .exception .BadNumberBlockException ;
25
+ import org .tron .core .exception .NonCommonBlockException ;
24
26
import org .tron .core .exception .UnLinkedBlockException ;
25
27
26
28
@ Component
27
29
public class KhaosDatabase extends TronDatabase {
28
30
29
- private class KhaosBlock {
31
+ public static class KhaosBlock {
30
32
31
33
public Sha256Hash getParentHash () {
32
34
return this .blk .getParentHash ();
@@ -38,6 +40,7 @@ public KhaosBlock(BlockCapsule blk) {
38
40
this .num = blk .getNum ();
39
41
}
40
42
43
+ @ Getter
41
44
BlockCapsule blk ;
42
45
Reference <KhaosBlock > parent = new WeakReference <>(null );
43
46
BlockId id ;
@@ -82,10 +85,16 @@ public class KhaosStore {
82
85
83
86
@ Override
84
87
protected boolean removeEldestEntry (Map .Entry <Long , ArrayList <KhaosBlock >> entry ) {
85
- if (entry .getKey () < Long .max (0L , head .num - maxCapcity )) {
86
- entry .getValue ().forEach (b -> hashKblkMap .remove (b .id ));
87
- return true ;
88
- }
88
+ long minNum = Long .max (0L , head .num - maxCapcity );
89
+ Map <Long , ArrayList <KhaosBlock >> minNumMap = numKblkMap .entrySet ().stream ()
90
+ .filter (e -> e .getKey () < minNum )
91
+ .collect (Collectors .toMap (Map .Entry ::getKey , Map .Entry ::getValue ));
92
+
93
+ minNumMap .forEach ((k , v ) -> {
94
+ numKblkMap .remove (k );
95
+ v .forEach (b -> hashKblkMap .remove (b .id ));
96
+ });
97
+
89
98
return false ;
90
99
}
91
100
};
@@ -260,33 +269,48 @@ public void setMaxSize(int maxSize) {
260
269
/**
261
270
* Find two block's most recent common parent block.
262
271
*/
263
- public Pair <LinkedList <BlockCapsule >, LinkedList <BlockCapsule >> getBranch (
264
- Sha256Hash block1 , Sha256Hash block2 ) {
265
- LinkedList <BlockCapsule > list1 = new LinkedList <>();
266
- LinkedList <BlockCapsule > list2 = new LinkedList <>();
272
+ public Pair <LinkedList <KhaosBlock >, LinkedList <KhaosBlock >> getBranch (Sha256Hash block1 , Sha256Hash block2 )
273
+ throws NonCommonBlockException {
274
+ LinkedList <KhaosBlock > list1 = new LinkedList <>();
275
+ LinkedList <KhaosBlock > list2 = new LinkedList <>();
267
276
KhaosBlock kblk1 = miniStore .getByHash (block1 );
277
+ checkNull (kblk1 );
268
278
KhaosBlock kblk2 = miniStore .getByHash (block2 );
279
+ checkNull (kblk2 );
269
280
270
- if (kblk1 != null && kblk2 != null ) {
271
- while (!Objects .equals (kblk1 , kblk2 )) {
272
- if (kblk1 .num > kblk2 .num ) {
273
- list1 .add (kblk1 .blk );
274
- kblk1 = kblk1 .getParent ();
275
- } else if (kblk1 .num < kblk2 .num ) {
276
- list2 .add (kblk2 .blk );
277
- kblk2 = kblk2 .getParent ();
278
- } else {
279
- list1 .add (kblk1 .blk );
280
- list2 .add (kblk2 .blk );
281
- kblk1 = kblk1 .getParent ();
282
- kblk2 = kblk2 .getParent ();
283
- }
284
- }
281
+ while (kblk1 .num > kblk2 .num ) {
282
+ list1 .add (kblk1 );
283
+ kblk1 = kblk1 .getParent ();
284
+ checkNull (kblk1 );
285
+ checkNull (miniStore .getByHash (kblk1 .id ));
286
+ }
287
+
288
+ while (kblk2 .num > kblk1 .num ) {
289
+ list2 .add (kblk2 );
290
+ kblk2 = kblk2 .getParent ();
291
+ checkNull (kblk2 );
292
+ checkNull (miniStore .getByHash (kblk2 .id ));
293
+ }
294
+
295
+ while (!Objects .equals (kblk1 , kblk2 )) {
296
+ list1 .add (kblk1 );
297
+ list2 .add (kblk2 );
298
+ kblk1 = kblk1 .getParent ();
299
+ checkNull (kblk1 );
300
+ checkNull (miniStore .getByHash (kblk1 .id ));
301
+ kblk2 = kblk2 .getParent ();
302
+ checkNull (kblk2 );
303
+ checkNull (miniStore .getByHash (kblk2 .id ));
285
304
}
286
305
287
306
return new Pair <>(list1 , list2 );
288
307
}
289
308
309
+ private void checkNull (Object o ) throws NonCommonBlockException {
310
+ if (o == null ) {
311
+ throw new NonCommonBlockException ();
312
+ }
313
+ }
290
314
/**
291
315
* Find two block's most recent common parent block.
292
316
*/
0 commit comments