use of org.ethereum.core.ImportResult in project rskj by rsksmart.
the class TestRunner method runTestCase.
public List<String> runTestCase(BlockTestCase testCase) {
/* 1 */
// Create genesis + init pre state
Block genesis = BlockBuilder.build(testCase.getGenesisBlockHeader(), null, null);
Repository repository = RepositoryBuilder.build(testCase.getPre());
IndexedBlockStore blockStore = new IndexedBlockStore(new HashMap<>(), new HashMapDB(), null);
blockStore.saveBlock(genesis, genesis.getCumulativeDifficulty(), true);
EthereumListener listener = new CompositeEthereumListener();
KeyValueDataSource ds = new HashMapDB();
ds.init();
ReceiptStore receiptStore = new ReceiptStoreImpl(ds);
BlockChainImpl blockchain = new BlockChainImpl(config, repository, blockStore, receiptStore, null, null, null, new DummyBlockValidator());
// BlockchainImpl blockchain = new BlockchainImpl(blockStore, repository, wallet, adminInfo, listener,
// new CommonConfig().parentHeaderValidator(), receiptStore);
blockchain.setNoValidation(true);
TransactionPoolImpl transactionPool = new TransactionPoolImpl(config, repository, null, receiptStore, null, listener, 10, 100);
blockchain.setBestBlock(genesis);
blockchain.setTotalDifficulty(genesis.getCumulativeDifficulty());
blockchain.setTransactionPool(transactionPool);
/* 2 */
// Create block traffic list
List<Block> blockTraffic = new ArrayList<>();
for (BlockTck blockTck : testCase.getBlocks()) {
Block block = BlockBuilder.build(blockTck.getBlockHeader(), blockTck.getTransactions(), blockTck.getUncleHeaders());
setNewStateRoot = !((blockTck.getTransactions() == null) && (blockTck.getUncleHeaders() == null) && (blockTck.getBlockHeader() == null));
Block tBlock = null;
try {
byte[] rlp = parseData(blockTck.getRlp());
tBlock = new Block(rlp);
ArrayList<String> outputSummary = BlockHeaderValidator.valid(tBlock.getHeader(), block.getHeader());
if (!outputSummary.isEmpty()) {
for (String output : outputSummary) logger.error("at block {}: {}", Integer.toString(blockTraffic.size()), output);
}
blockTraffic.add(tBlock);
} catch (Exception e) {
System.out.println("*** Exception");
}
}
// Inject blocks to the blockchain execution
for (Block block : blockTraffic) {
ImportResult importResult = blockchain.tryToConnect(block);
logger.debug("{} ~ {} difficulty: {} ::: {}", block.getShortHash(), shortHash(block.getParentHash().getBytes()), block.getCumulativeDifficulty(), importResult.toString());
}
// Check state root matches last valid block
List<String> results = new ArrayList<>();
String currRoot = Hex.toHexString(repository.getRoot());
byte[] bestHash = Hex.decode(testCase.getLastblockhash());
String finalRoot = Hex.toHexString(blockStore.getBlockByHash(bestHash).getStateRoot());
/*
if (!blockchain.byTest) // If this comes from ETH, it won't match
if (!finalRoot.equals(currRoot)){
String formattedString = String.format("Root hash doesn't match best: expected: %s current: %s",
finalRoot, currRoot);
results.add(formattedString);
}
*/
Repository postRepository = RepositoryBuilder.build(testCase.getPostState());
List<String> repoResults = RepositoryValidator.valid(repository, postRepository, false);
results.addAll(repoResults);
return results;
}
use of org.ethereum.core.ImportResult in project rskj by rsksmart.
the class BlockchainTest method checkItDoesntAddAnInvalidBlock.
@Test
public void checkItDoesntAddAnInvalidBlock() {
Blockchain blockchain = createBlockchain();
BlockGenerator blockGenerator = new BlockGenerator();
Block block1 = blockGenerator.createChildBlock(blockchain.getBestBlock());
ImportResult importResult1 = blockchain.tryToConnect(block1);
assertTrue(importResult1.isSuccessful());
Block block2 = blockGenerator.createChildBlock(blockchain.getBestBlock());
Block block2b = blockGenerator.createBlock(10, 5);
Block block3 = Block.fromValidData(block2.getHeader(), block2b.getTransactionsList(), block2b.getUncleList());
ImportResult importResult2 = blockchain.tryToConnect(block3);
Assert.assertFalse(importResult2.isSuccessful());
}
use of org.ethereum.core.ImportResult in project rskj by rsksmart.
the class BlockSyncService method processBlock.
public BlockProcessResult processBlock(@Nonnull Block block, MessageChannel sender, boolean ignoreMissingHashes) {
Instant start = Instant.now();
long bestBlockNumber = this.getBestBlockNumber();
long blockNumber = block.getNumber();
final Keccak256 blockHash = block.getHash();
int syncMaxDistance = syncConfiguration.getChunkSize() * syncConfiguration.getMaxSkeletonChunks();
tryReleaseStore(bestBlockNumber);
store.removeHeader(block.getHeader());
unknownBlockHashes.remove(blockHash);
if (blockNumber > bestBlockNumber + syncMaxDistance) {
logger.trace("Block too advanced {} {} from {} ", blockNumber, block.getShortHash(), sender != null ? sender.getPeerNodeID().toString() : "N/A");
return new BlockProcessResult(false, null, block.getShortHash(), Duration.between(start, Instant.now()));
}
if (sender != null) {
nodeInformation.addBlockToNode(blockHash, sender.getPeerNodeID());
}
// already in a blockchain
if (BlockUtils.blockInSomeBlockChain(block, blockchain)) {
logger.trace("Block already in a chain {} {}", blockNumber, block.getShortHash());
return new BlockProcessResult(false, null, block.getShortHash(), Duration.between(start, Instant.now()));
}
trySaveStore(block);
Set<Keccak256> unknownHashes = BlockUtils.unknownDirectAncestorsHashes(block, blockchain, store);
// We can't add the block if there are missing ancestors or uncles. Request the missing blocks to the sender.
if (!unknownHashes.isEmpty()) {
if (!ignoreMissingHashes) {
logger.trace("Missing hashes for block in process {} {}", blockNumber, block.getShortHash());
requestMissingHashes(sender, unknownHashes);
}
return new BlockProcessResult(false, null, block.getShortHash(), Duration.between(start, Instant.now()));
}
logger.trace("Trying to add to blockchain");
Map<Keccak256, ImportResult> connectResult = connectBlocksAndDescendants(sender, BlockUtils.sortBlocksByNumber(this.getParentsNotInBlockchain(block)), ignoreMissingHashes);
return new BlockProcessResult(true, connectResult, block.getShortHash(), Duration.between(start, Instant.now()));
}
Aggregations