use of org.ethereum.core.BlockHeader in project rskj by rsksmart.
the class BlockDifficultyRule method isValid.
@Override
public boolean isValid(Block block, Block parent) {
if (block == null || parent == null) {
logger.warn("BlockDifficultyRule - block or parent are null");
return false;
}
BlockHeader header = block.getHeader();
BlockDifficulty calcDifficulty = difficultyCalculator.calcDifficulty(header, parent.getHeader());
BlockDifficulty difficulty = header.getDifficulty();
if (!difficulty.equals(calcDifficulty)) {
logger.warn("#{}: difficulty != calcDifficulty", header.getNumber());
return false;
}
return true;
}
use of org.ethereum.core.BlockHeader in project rskj by rsksmart.
the class BlockParentGasLimitRule method isValid.
@Override
public boolean isValid(Block block, Block parent) {
if (block == null || parent == null) {
logger.warn("BlockParentGasLimitRule - block or parent are null");
return false;
}
BlockHeader header = block.getHeader();
BigInteger headerGasLimit = new BigInteger(1, header.getGasLimit());
BigInteger parentGasLimit = new BigInteger(1, parent.getGasLimit());
if (headerGasLimit.compareTo(parentGasLimit.multiply(BigInteger.valueOf(gasLimitBoundDivisor - 1L)).divide(BigInteger.valueOf(gasLimitBoundDivisor))) < 0 || headerGasLimit.compareTo(parentGasLimit.multiply(BigInteger.valueOf(gasLimitBoundDivisor + 1L)).divide(BigInteger.valueOf(gasLimitBoundDivisor))) > 0) {
logger.warn(String.format("#%d: gas limit exceeds parentBlock.getGasLimit() (+-) GAS_LIMIT_BOUND_DIVISOR", header.getNumber()));
return false;
}
return true;
}
use of org.ethereum.core.BlockHeader in project rskj by rsksmart.
the class ValidGasUsedRule method isValid.
@Override
public boolean isValid(Block block) {
BlockHeader header = block.getHeader();
long gasUsed = header.getGasUsed();
long gasLimit = new BigInteger(1, header.getGasLimit()).longValue();
if (gasUsed < 0 || gasUsed > gasLimit) {
logger.warn("Block gas used is less than 0 or more than the gas limit of the block");
panicProcessor.panic("invalidGasValue", "Block gas used is less than 0 or more than the gas limit of the block");
return false;
}
return true;
}
use of org.ethereum.core.BlockHeader in project rskj by rsksmart.
the class BlockHeadersMessage method encode.
private void encode() {
List<byte[]> encodedElements = new ArrayList<>();
for (BlockHeader blockHeader : blockHeaders) {
encodedElements.add(blockHeader.getEncoded());
}
byte[][] encodedElementArray = encodedElements.toArray(new byte[encodedElements.size()][]);
this.encoded = RLP.encodeList(encodedElementArray);
}
use of org.ethereum.core.BlockHeader in project rskj by rsksmart.
the class BlockUtilsTest method unknowAncestorsHashesUsingUncles.
@Test
public void unknowAncestorsHashesUsingUncles() {
BlockChainBuilder blockChainBuilder = new BlockChainBuilder();
BlockGenerator blockGenerator = new BlockGenerator();
Genesis genesis = blockGenerator.getGenesisBlock();
BlockChainImpl blockChain = blockChainBuilder.setGenesis(genesis).build();
BlockStore store = new BlockStore();
genesis.setStateRoot(blockChain.getRepository().getRoot());
genesis.flushRLP();
BlockBuilder blockBuilder = new BlockBuilder(blockChain, blockGenerator);
Block block1 = blockBuilder.parent(genesis).build();
Block block1b = blockBuilder.parent(genesis).build();
Block block2 = blockBuilder.parent(block1).build();
Block uncle1 = blockBuilder.parent(block1).build();
Block uncle2 = blockBuilder.parent(block1).build();
List<BlockHeader> uncles = new ArrayList<>();
uncles.add(uncle1.getHeader());
uncles.add(uncle2.getHeader());
Block block3 = blockBuilder.parent(block2).uncles(uncles).build();
store.saveBlock(block3);
blockChain.tryToConnect(genesis);
blockChain.tryToConnect(block1);
blockChain.tryToConnect(block1b);
Set<Keccak256> hashes = BlockUtils.unknownAncestorsHashes(genesis.getHash(), blockChain, store);
Assert.assertNotNull(hashes);
Assert.assertTrue(hashes.isEmpty());
hashes = BlockUtils.unknownAncestorsHashes(block1.getHash(), blockChain, store);
Assert.assertNotNull(hashes);
Assert.assertTrue(hashes.isEmpty());
hashes = BlockUtils.unknownAncestorsHashes(block1b.getHash(), blockChain, store);
Assert.assertNotNull(hashes);
Assert.assertTrue(hashes.isEmpty());
hashes = BlockUtils.unknownAncestorsHashes(block2.getHash(), blockChain, store);
Assert.assertNotNull(hashes);
Assert.assertFalse(hashes.isEmpty());
Assert.assertEquals(1, hashes.size());
Assert.assertTrue(hashes.contains(block2.getHash()));
hashes = BlockUtils.unknownAncestorsHashes(block3.getHash(), blockChain, store);
Assert.assertNotNull(hashes);
Assert.assertFalse(hashes.isEmpty());
Assert.assertEquals(3, hashes.size());
Assert.assertTrue(hashes.contains(block2.getHash()));
Assert.assertTrue(hashes.contains(uncle1.getHash()));
Assert.assertTrue(hashes.contains(uncle2.getHash()));
}
Aggregations