11package co .rsk .federate .signing .hsm .advanceblockchain ;
22
33import co .rsk .crypto .Keccak256 ;
4+ import java .math .BigInteger ;
5+ import java .util .ArrayList ;
6+ import java .util .List ;
47import org .ethereum .core .Block ;
5- import org .ethereum .core .BlockHeader ;
68import org .ethereum .db .BlockStore ;
79import org .slf4j .Logger ;
810import org .slf4j .LoggerFactory ;
911
10- import java .math .BigInteger ;
11- import java .util .ArrayList ;
12- import java .util .List ;
13-
14- public class ConfirmedBlockHeadersProvider {
15- private static final Logger logger = LoggerFactory .getLogger (ConfirmedBlockHeadersProvider .class );
12+ public class ConfirmedBlocksProvider {
13+ private static final Logger logger = LoggerFactory .getLogger (ConfirmedBlocksProvider .class );
1614
1715 private final BigInteger minimumAccumulatedDifficulty ;
1816 private final int maximumElementsToSendHSM ;
1917 private final BlockStore blockStore ;
2018 private final int hsmVersion ;
2119 private final BigInteger difficultyCap ;
2220
23- public ConfirmedBlockHeadersProvider (
21+ public ConfirmedBlocksProvider (
2422 BigInteger minimumAccumulatedDifficulty ,
2523 int maximumElementsToSendHSM ,
2624 BlockStore blockStore ,
@@ -33,15 +31,15 @@ public ConfirmedBlockHeadersProvider(
3331 this .hsmVersion = hsmVersion ;
3432 }
3533
36- public List <BlockHeader > getConfirmedBlockHeaders (Keccak256 startingPoint ) {
37- List <BlockHeader > potentialConfirmed = new ArrayList <>();
34+ public List <Block > getConfirmedBlocks (Keccak256 startingPoint ) {
35+ List <Block > potentialBlocks = new ArrayList <>();
36+ List <Block > confirmedBlocks = new ArrayList <>();
3837 BigInteger accumulatedDifficulty = BigInteger .ZERO ;
39- List <BlockHeader > confirmedBlockHeaders = new ArrayList <>();
4038
4139 Block initialBlock = blockStore .getBlockByHash (startingPoint .getBytes ());
4240 Block bestBlock = blockStore .getBestBlock ();
4341 logger .trace (
44- "[getConfirmedBlockHeaders ] Initial block height is {} and RSK best block height {}. Using HSM version {}, difficulty target {}, difficulty cap {}, sending max {} elements" ,
42+ "[getConfirmedBlocks ] Initial block height is {} and RSK best block height {}. Using HSM version {}, difficulty target {}, difficulty cap {}, sending max {} elements" ,
4543 initialBlock .getNumber (),
4644 bestBlock .getNumber (),
4745 hsmVersion ,
@@ -52,56 +50,65 @@ public List<BlockHeader> getConfirmedBlockHeaders(Keccak256 startingPoint) {
5250
5351 int lastIndexToConfirmBlock = 0 ;
5452 Block blockToProcess = blockStore .getChainBlockByNumber (initialBlock .getNumber () + 1 );
55- while (blockToProcess != null && confirmedBlockHeaders .size () < maximumElementsToSendHSM ) {
56- BigInteger difficultyToConsider = getBlockDifficultyToConsider ( blockToProcess . getHeader () );
57- potentialConfirmed . add (blockToProcess . getHeader () );
53+ while (blockToProcess != null && confirmedBlocks .size () < maximumElementsToSendHSM ) {
54+ potentialBlocks . add ( blockToProcess );
55+ BigInteger difficultyToConsider = getBlockDifficultyToConsider (blockToProcess );
5856 accumulatedDifficulty = accumulatedDifficulty .add (difficultyToConsider );
5957
6058 if (accumulatedDifficulty .compareTo (minimumAccumulatedDifficulty ) >= 0 ) { // Enough difficulty accumulated
6159 logger .trace (
62- "[getConfirmedBlockHeaders ] Accumulated enough difficulty {} with {} blocks" ,
60+ "[getConfirmedBlocks ] Accumulated enough difficulty {} with {} blocks" ,
6361 accumulatedDifficulty ,
64- potentialConfirmed .size ()
62+ potentialBlocks .size ()
6563 );
6664
6765 // The first block was confirmed. Add it to confirm, subtract its difficulty from the accumulated and from the potentials list
68- BlockHeader confirmedBlockHeader = potentialConfirmed .get (0 );
69- BigInteger confirmedBlockDifficultyToConsider = getBlockDifficultyToConsider ( confirmedBlockHeader );
70- confirmedBlockHeaders . add ( confirmedBlockHeader );
66+ Block confirmedBlock = potentialBlocks .get (0 );
67+ confirmedBlocks . add ( confirmedBlock );
68+ BigInteger confirmedBlockDifficultyToConsider = getBlockDifficultyToConsider ( confirmedBlock );
7169 accumulatedDifficulty = accumulatedDifficulty .subtract (confirmedBlockDifficultyToConsider );
72- potentialConfirmed .remove (confirmedBlockHeader );
73- lastIndexToConfirmBlock = potentialConfirmed .size ();
70+ potentialBlocks .remove (confirmedBlock );
71+ lastIndexToConfirmBlock = potentialBlocks .size ();
7472
75- logger .trace ("[getConfirmedBlockHeaders] Confirmed block {}" , confirmedBlockHeader .getHash ());
73+ logger .trace (
74+ "[getConfirmedBlocks] Confirmed block {} (height {})" ,
75+ confirmedBlock .getHash (),
76+ confirmedBlock .getNumber ()
77+ );
7678 }
7779
7880 blockToProcess = blockStore .getChainBlockByNumber (blockToProcess .getNumber () + 1 );
7981 }
80- logger .debug ("[getConfirmedBlockHeaders ] Got {} confirmed blocks" , confirmedBlockHeaders .size ());
81- if (confirmedBlockHeaders .isEmpty ()) {
82- return confirmedBlockHeaders ;
82+ logger .debug ("[getConfirmedBlocks ] Got {} confirmed blocks" , confirmedBlocks .size ());
83+ if (confirmedBlocks .isEmpty ()) {
84+ return confirmedBlocks ;
8385 }
8486 // Adding the proof of the confirmed elements from the potential elements
85- potentialConfirmed = potentialConfirmed .subList (0 , lastIndexToConfirmBlock );
86- confirmedBlockHeaders .addAll (potentialConfirmed );
87- logger .debug ("[getConfirmedBlockHeaders ] Added {} extra blocks as proof" , potentialConfirmed .size ());
87+ potentialBlocks = potentialBlocks .subList (0 , lastIndexToConfirmBlock );
88+ confirmedBlocks .addAll (potentialBlocks );
89+ logger .debug ("[getConfirmedBlocks ] Added {} extra blocks as proof" , potentialBlocks .size ());
8890
89- return confirmedBlockHeaders ;
91+ return confirmedBlocks ;
9092 }
9193
92- private BigInteger getBlockDifficultyToConsider (BlockHeader block ) {
94+ private BigInteger getBlockDifficultyToConsider (Block block ) {
9395 BigInteger blockDifficulty = block .getDifficulty ().asBigInteger ();
94- BigInteger difficultyToConsider = hsmVersion >= 3 ?
95- difficultyCap .min (blockDifficulty ) :
96- blockDifficulty ;
96+ BigInteger difficultyToConsider = blockDifficulty ;
97+ if (hsmVersion >= 3 ) {
98+ BigInteger unclesDifficulty = block .getUncleList ().stream ()
99+ .map (uncle -> uncle .getDifficulty ().asBigInteger ())
100+ .reduce (BigInteger .ZERO , BigInteger ::add );
101+ blockDifficulty = blockDifficulty .add (unclesDifficulty );
102+ difficultyToConsider = difficultyCap .min (blockDifficulty );
103+ }
97104 logger .trace (
98- "[getBlockDifficultyToConsider] Block {}, total difficulty {}, considering {}" ,
105+ "[getBlockDifficultyToConsider] Block {} (height {}) , total difficulty {}, considering {}" ,
99106 block .getHash (),
107+ block .getNumber (),
100108 blockDifficulty ,
101109 difficultyToConsider
102110 );
103111
104112 return difficultyToConsider ;
105113 }
106-
107114}
0 commit comments