Skip to content

Commit 959e100

Browse files
authored
Merge pull request #218 from rsksmart/fingerroot5300-master-merge
Merge FINGERROOT-5.3.0.0 into master
2 parents 848a697 + cc88d37 commit 959e100

38 files changed

+1955
-1148
lines changed

gradle/verification-metadata.xml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,12 @@
6969
<sha256 value="c717c468bfc91536f1dbc0d98d6116a8e7c49fbaff643ef8710e7505cc450878" origin="Generated by Gradle"/>
7070
</artifact>
7171
</component>
72-
<component group="co.rsk" name="rskj-core" version="5.2.0-FINGERROOT">
73-
<artifact name="rskj-core-5.2.0-FINGERROOT.jar">
74-
<sha256 value="3b1dd7d624137fb1bcc133927a7357eed3228457e8db29f17cf0a193370bbe12" origin="Generated by Gradle"/>
72+
<component group="co.rsk" name="rskj-core" version="5.3.0-FINGERROOT">
73+
<artifact name="rskj-core-5.3.0-FINGERROOT.jar">
74+
<sha256 value="75bccfafb6f7569faf5ff8e152adfeed2eeec1296e4826d0073df234d1cd62f6" origin="Generated by Gradle"/>
7575
</artifact>
76-
<artifact name="rskj-core-5.2.0-FINGERROOT.module">
77-
<sha256 value="4d588eae64108680c6ae6e895e2d6d4a07cdd05a31718d6f4a34870153a51d5a" origin="Generated by Gradle"/>
76+
<artifact name="rskj-core-5.3.0-FINGERROOT.module">
77+
<sha256 value="7f9e66e43b8034b47996fc3542ff68dec4b3cb222fbe35e9072f746313dc2d3f" origin="Generated by Gradle"/>
7878
</artifact>
7979
</component>
8080
<component group="co.rsk.bitcoinj" name="bitcoinj-thin" version="0.14.4-rsk-14">
@@ -1390,6 +1390,11 @@
13901390
<sha256 value="4e10adf1477b8c711b45b8a15eb960f6b44871f5e1def38f16681348aa166b0c" origin="Generated by Gradle"/>
13911391
</artifact>
13921392
</component>
1393+
<component group="org.objenesis" name="objenesis-parent" version="3.2">
1394+
<artifact name="objenesis-parent-3.2.pom">
1395+
<sha256 value="0859ba0d5cfeefb13964e5862c036faa48a0bccff4932638fb13fe3445df33f7" origin="Generated by Gradle"/>
1396+
</artifact>
1397+
</component>
13931398
<component group="org.openjdk.jmh" name="jmh-core" version="1.36">
13941399
<artifact name="jmh-core-1.36.jar">
13951400
<sha256 value="f90974e37d0da8886b5c05e6e3e7e20556900d747c5a41c1023b47c3301ea73c" origin="Generated by Gradle"/>
@@ -1411,11 +1416,6 @@
14111416
<sha256 value="3b63ce6e8fefacb320376e05e9fbb3bae86a889239008759189a0b0d5ca5c5d6" origin="Generated by Gradle"/>
14121417
</artifact>
14131418
</component>
1414-
<component group="org.objenesis" name="objenesis-parent" version="3.2">
1415-
<artifact name="objenesis-parent-3.2.pom">
1416-
<sha256 value="0859ba0d5cfeefb13964e5862c036faa48a0bccff4932638fb13fe3445df33f7" origin="Generated by Gradle"/>
1417-
</artifact>
1418-
</component>
14191419
<component group="org.opentest4j" name="opentest4j" version="1.2.0">
14201420
<artifact name="opentest4j-1.2.0.jar">
14211421
<sha256 value="58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2" origin="Generated by Gradle"/>

src/main/java/co/rsk/federate/FedNodeRunner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
import co.rsk.federate.signing.*;
3838
import co.rsk.federate.signing.hsm.HSMClientException;
3939
import co.rsk.federate.signing.hsm.SignerException;
40-
import co.rsk.federate.signing.hsm.advanceblockchain.ConfirmedBlockHeadersProvider;
40+
import co.rsk.federate.signing.hsm.advanceblockchain.ConfirmedBlocksProvider;
4141
import co.rsk.federate.signing.hsm.advanceblockchain.HSMBookKeepingClientProvider;
4242
import co.rsk.federate.signing.hsm.advanceblockchain.HSMBookkeepingService;
4343
import co.rsk.federate.signing.hsm.client.HSMBookkeepingClient;
@@ -222,7 +222,7 @@ private HSMBookkeepingService buildBookKeepingService(
222222
HSMBookkeepingService service = new HSMBookkeepingService(
223223
fedNodeContext.getBlockStore(),
224224
bookKeepingClient,
225-
new ConfirmedBlockHeadersProvider(
225+
new ConfirmedBlocksProvider(
226226
bookKeepingConfig.getDifficultyTarget(),
227227
bookKeepingConfig.getMaxAmountBlockHeaders(),
228228
fedNodeContext.getBlockStore(),

src/main/java/co/rsk/federate/signing/ECDSAHSMSigner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public ECDSASignerCheckResult check() {
9090
client.getPublicKey(mapping.getValue());
9191
} catch (HSMClientException e) {
9292
messages.add(e.getMessage());
93-
LOGGER.error("Unable to retrieve public key", e);
93+
LOGGER.error("[check] Unable to retrieve public key", e);
9494
}
9595
}
9696

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package co.rsk.federate.signing;
2+
3+
/**
4+
* Created by Kelvin Isievwore on 21/08/2023.
5+
*/
6+
public enum HSMCommand {
7+
VERSION("version"),
8+
SIGN("sign"),
9+
GET_PUB_KEY("getPubKey"),
10+
ADVANCE_BLOCKCHAIN("advanceBlockchain"),
11+
RESET_ADVANCE_BLOCKCHAIN("resetAdvanceBlockchain"),
12+
BLOCKCHAIN_STATE("blockchainState"),
13+
UPDATE_ANCESTOR_BLOCK("updateAncestorBlock"),
14+
BLOCKCHAIN_PARAMETERS("blockchainParameters");
15+
16+
private final String command;
17+
18+
HSMCommand(String command) {
19+
this.command = command;
20+
}
21+
22+
public String getCommand() {
23+
return command;
24+
}
25+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package co.rsk.federate.signing;
2+
3+
/**
4+
* Created by Kelvin Isievwore on 22/08/2023.
5+
*/
6+
public enum HSMField {
7+
ANCESTOR_BLOCK("ancestor_block"),
8+
AUTH("auth"),
9+
BEST_BLOCK("best_block"),
10+
BLOCKS("blocks"),
11+
BROTHERS("brothers"),
12+
CHECKPOINT("checkpoint"),
13+
COMMAND("command"),
14+
ERROR("error"),
15+
ERROR_CODE("errorcode"),
16+
HASH("hash"),
17+
INPUT("input"),
18+
IN_PROGRESS("in_progress"),
19+
KEY_ID("keyId"),
20+
NETWORK("network"),
21+
MESSAGE("message"),
22+
MINIMUM_DIFFICULTY("minimum_difficulty"),
23+
PARAMETERS("parameters"),
24+
PUB_KEY("pubKey"),
25+
RECEIPT("receipt"),
26+
RECEIPT_MERKLE_PROOF("receipt_merkle_proof"),
27+
R("r"),
28+
S("s"),
29+
SIGNATURE("signature"),
30+
STATE("state"),
31+
TX("tx"),
32+
UPDATING("updating"),
33+
V("v"),
34+
VERSION("version");
35+
36+
private final String name;
37+
38+
HSMField(String name) {
39+
this.name = name;
40+
}
41+
42+
public String getFieldName() {
43+
return name;
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
package co.rsk.federate.signing.hsm.advanceblockchain;
22

33
import co.rsk.crypto.Keccak256;
4+
import java.math.BigInteger;
5+
import java.util.ArrayList;
6+
import java.util.List;
47
import org.ethereum.core.Block;
5-
import org.ethereum.core.BlockHeader;
68
import org.ethereum.db.BlockStore;
79
import org.slf4j.Logger;
810
import 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
}

src/main/java/co/rsk/federate/signing/hsm/advanceblockchain/HSMBookkeepingService.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,24 @@
44
import co.rsk.federate.signing.hsm.HSMBlockchainBookkeepingRelatedException;
55
import co.rsk.federate.signing.hsm.HSMClientException;
66
import co.rsk.federate.signing.hsm.client.HSMBookkeepingClient;
7-
import co.rsk.federate.signing.hsm.message.AdvanceBlockchainMessage;
87
import co.rsk.net.NodeBlockProcessor;
8+
import org.ethereum.core.Block;
9+
import org.ethereum.db.BlockStore;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
913
import java.util.ArrayList;
1014
import java.util.List;
1115
import java.util.concurrent.Executors;
1216
import java.util.concurrent.ScheduledExecutorService;
1317
import java.util.concurrent.TimeUnit;
14-
import org.ethereum.core.Block;
15-
import org.ethereum.core.BlockHeader;
16-
import org.ethereum.db.BlockStore;
17-
import org.slf4j.Logger;
18-
import org.slf4j.LoggerFactory;
1918

2019
public class HSMBookkeepingService {
2120
private static final Logger logger = LoggerFactory.getLogger(HSMBookkeepingService.class);
2221

2322
private final BlockStore blockStore;
2423
private final HSMBookkeepingClient hsmBookkeepingClient;
25-
private final ConfirmedBlockHeadersProvider confirmedBlockHeadersProvider;
24+
private final ConfirmedBlocksProvider confirmedBlocksProvider;
2625
private final long advanceBlockchainTimeInterval;
2726
private final List<HSMBookeepingServiceListener> listeners;
2827
private final NodeBlockProcessor nodeBlockProcessor;
@@ -37,14 +36,14 @@ public class HSMBookkeepingService {
3736
public HSMBookkeepingService(
3837
BlockStore blockStore,
3938
HSMBookkeepingClient hsmBookkeepingClient,
40-
ConfirmedBlockHeadersProvider confirmedBlockHeadersProvider,
39+
ConfirmedBlocksProvider confirmedBlocksProvider,
4140
NodeBlockProcessor nodeBlockProcessor,
4241
long advanceBlockchainTimeInterval,
4342
boolean stopBookkeepingScheduler
4443
) {
4544
this.blockStore = blockStore;
4645
this.hsmBookkeepingClient = hsmBookkeepingClient;
47-
this.confirmedBlockHeadersProvider = confirmedBlockHeadersProvider;
46+
this.confirmedBlocksProvider = confirmedBlocksProvider;
4847
this.advanceBlockchainTimeInterval = advanceBlockchainTimeInterval;
4948
this.listeners = new ArrayList<>();
5049
this.nodeBlockProcessor = nodeBlockProcessor;
@@ -100,7 +99,7 @@ public void stop() {
10099
return;
101100
}
102101
this.setStopSending();
103-
logger.info("[stop] Stop HSMBookkeepingService");;
102+
logger.info("[stop] Stop HSMBookkeepingService");
104103
// TODO: IS THIS TRULY CALLED AND IF SO, IS IT STOPPING THE SCHEDULED TASKS?
105104
if (updateAdvanceBlockchain != null) {
106105
updateAdvanceBlockchain.shutdown();
@@ -149,20 +148,24 @@ protected void informConfirmedBlockHeaders() {
149148
hsmCurrentBestBlock.getNumber()
150149
);
151150

152-
List<BlockHeader> blockHeaders = this.confirmedBlockHeadersProvider.getConfirmedBlockHeaders(hsmCurrentBestBlock.getHash());
153-
if (blockHeaders.isEmpty()) {
151+
List<Block> blocks = this.confirmedBlocksProvider.getConfirmedBlocks(hsmCurrentBestBlock.getHash());
152+
if (blocks.isEmpty()) {
154153
logger.debug("[informConfirmedBlockHeaders] No new block headers to inform");
155154
logger.info("[informConfirmedBlockHeaders] Finished HSM bookkeeping process");
156155
informing = false;
157156
return;
158157
}
158+
159159
logger.debug(
160-
"[informConfirmedBlockHeaders] Going to inform {} block headers. From {} to {}",
161-
blockHeaders.size(),
162-
blockHeaders.get(0).getHash(),
163-
blockHeaders.get(blockHeaders.size() - 1).getHash()
160+
"[informConfirmedBlockHeaders] Going to inform {} block headers. From block number {} with hash {} to block number {} with hash {}",
161+
blocks.size(),
162+
blocks.get(0).getNumber(),
163+
blocks.get(0).getHash(),
164+
blocks.get(blocks.size() - 1).getNumber(),
165+
blocks.get(blocks.size() - 1).getHash()
164166
);
165-
hsmBookkeepingClient.advanceBlockchain(new AdvanceBlockchainMessage(blockHeaders));
167+
168+
hsmBookkeepingClient.advanceBlockchain(blocks);
166169
hsmCurrentBestBlock = getHsmBestBlock();
167170
logger.debug(
168171
"[informConfirmedBlockHeaders] HSM best block after informing {} (height: {})",

0 commit comments

Comments
 (0)