Skip to content

Commit

Permalink
Move parent block validation out of BlockchainImpl
Browse files Browse the repository at this point in the history
  • Loading branch information
mkalinin committed Oct 26, 2018
1 parent 429e179 commit 3817dce
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -726,7 +726,6 @@ private boolean isValid(Repository repo, Block block) {
boolean isValid = true;

if (!block.isGenesis()) {
isValid = isValid(block.getHeader());

// Sanity checks
String trieHash = toHexString(block.getTxTrieRoot());
Expand Down
23 changes: 21 additions & 2 deletions ethereumj-core/src/main/java/org/ethereum/manager/BlockLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import org.ethereum.db.DbFlushManager;
import org.ethereum.util.ExecutorPipeline;
import org.ethereum.validator.BlockHeaderValidator;
import org.ethereum.validator.DependentBlockHeaderRule;
import org.ethereum.validator.ParentBlockHeaderValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.spongycastle.util.encoders.Hex;
Expand Down Expand Up @@ -57,15 +59,18 @@ default void close() throws IOException {
private final static DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss.SSSS");

private final BlockHeaderValidator headerValidator;
private final ParentBlockHeaderValidator parentHeaderValidator;
private final Blockchain blockchain;
private final DbFlushManager dbFlushManager;

private ExecutorPipeline<Block, Block> exec1;
private ExecutorPipeline<Block, ?> exec2;

@Autowired
public BlockLoader(BlockHeaderValidator headerValidator, Blockchain blockchain, DbFlushManager dbFlushManager) {
public BlockLoader(BlockHeaderValidator headerValidator, Blockchain blockchain, DbFlushManager dbFlushManager,
ParentBlockHeaderValidator parentHeaderValidator) {
this.headerValidator = headerValidator;
this.parentHeaderValidator = parentHeaderValidator;
this.blockchain = blockchain;
this.dbFlushManager = dbFlushManager;
}
Expand Down Expand Up @@ -177,7 +182,21 @@ public boolean loadBlocks(Path... paths) {
}

private boolean isValid(BlockHeader header) {
return headerValidator.validateAndLog(header, logger);
return isParentValid(header) && headerValidator.validateAndLog(header, logger);
}

private boolean isParentValid(BlockHeader header) {
Block parent = blockchain.getBlockByHash(header.getParentHash());
if (parent == null) {
return true;
}
boolean valid = parentHeaderValidator.validate(header, parent.getHeader());

if (!valid) {
parentHeaderValidator.logErrors(logger);
}

return valid;
}

private class HexLineDumpWalker implements DumpWalker {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
import org.ethereum.listener.CompositeEthereumListener;
import org.ethereum.validator.BlockHeaderRule;
import org.ethereum.validator.BlockHeaderValidator;
import org.ethereum.validator.DependentBlockHeaderRule;
import org.ethereum.validator.DependentBlockHeaderRuleAdapter;
import org.ethereum.validator.ParentBlockHeaderValidator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
Expand Down Expand Up @@ -75,6 +78,11 @@ public BlockHeaderValidator headerValidator() {
return validator;
}

@Bean
public ParentBlockHeaderValidator parentHeaderValidator() {
return new ParentBlockHeaderValidator(Collections.emptyList());
}

@Bean
public Blockchain blockchain(Holder<Block> lastBlockHolder) {
Blockchain blockchain = Mockito.mock(Blockchain.class);
Expand Down Expand Up @@ -107,8 +115,9 @@ public EventDispatchThread dispatchThread() {
}

@Bean
public BlockLoader blockLoader(BlockHeaderValidator headerValidator, Blockchain blockchain, DbFlushManager dbFlushManager) {
return new BlockLoader(headerValidator, blockchain, dbFlushManager);
public BlockLoader blockLoader(BlockHeaderValidator headerValidator, Blockchain blockchain, DbFlushManager dbFlushManager,
ParentBlockHeaderValidator parentHeaderValidator) {
return new BlockLoader(headerValidator, blockchain, dbFlushManager, parentHeaderValidator);
}
}

Expand Down

0 comments on commit 3817dce

Please sign in to comment.