@Test public void getLatestBlockOmmerByIndexShouldReturnExpectedOmmerHeader() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(data.blockData.size() - 1).block; final BlockHeader ommerBlockHeader = targetBlock.getBody().getOmmers().get(0); final BlockHeader retrievedOmmerBlockHeader = queries.getOmmer(0).get(); assertThat(retrievedOmmerBlockHeader).isEqualTo(ommerBlockHeader); }
@Test public void getOmmerByBlockHashAndIndexShouldReturnExpectedOmmerHeader() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(data.blockData.size() - 1).block; final BlockHeader ommerBlockHeader = targetBlock.getBody().getOmmers().get(0); final BlockHeader retrievedOmmerBlockHeader = queries.getOmmer(targetBlock.getHash(), 0).get(); assertThat(retrievedOmmerBlockHeader).isEqualTo(ommerBlockHeader); }
@Test public void getLatestBlockOmmerByIndexShouldReturnEmptyWhenIndexIsOutOfRange() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(data.blockData.size() - 1).block; final int indexOutOfRange = targetBlock.getBody().getOmmers().size() + 1; final Optional<BlockHeader> ommerOptional = queries.getOmmer(indexOutOfRange); assertThat(ommerOptional).isEmpty(); }
@Test public void getOmmerByBlockNumberAndIndexShouldReturnExpectedOmmerHeader() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(data.blockData.size() - 1).block; final BlockHeader ommerBlockHeader = targetBlock.getBody().getOmmers().get(1); final BlockHeader retrievedOmmerBlockHeader = queries.getOmmer(targetBlock.getHeader().getNumber(), 1).get(); assertThat(retrievedOmmerBlockHeader).isEqualTo(ommerBlockHeader); }
@Test public void getOmmerCountForLatestBlock() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(data.blockData.size() - 1).block; final Optional<Integer> result = queries.getOmmerCount(); assertEquals(targetBlock.getBody().getOmmers().size(), (int) result.get()); }
@Test public void calculateOmmersHash() throws IOException { for (final int block : Arrays.asList(300006, 4400002)) { final BlockHeader header = ValidationTestUtils.readHeader(block); final BlockBody body = ValidationTestUtils.readBody(block); final Bytes32 ommersHash = BodyValidation.ommersHash(body.getOmmers()); Assertions.assertThat(header.getOmmersHash()).isEqualTo(ommersHash); } } }
@Test public void getOmmerByBlockHashAndIndexShouldReturnEmptyWhenBlockDoesNotHaveOmmers() { final BlockchainWithData data = setupBlockchain(1); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(0).block; final Optional<BlockHeader> ommerOptional = queries.getOmmer(targetBlock.getHash(), 0); assertThat(targetBlock.getBody().getOmmers()).hasSize(0); assertThat(ommerOptional).isEmpty(); }
@Test public void getOmmerByBlockHashAndIndexShouldReturnEmptyWhenIndexIsOutOfRange() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(0).block; final int indexOutOfRange = targetBlock.getBody().getOmmers().size() + 1; final Optional<BlockHeader> ommerOptional = queries.getOmmer(targetBlock.getHash(), indexOutOfRange); assertThat(ommerOptional).isEmpty(); }
@Test public void getOmmerByBlockNumberAndIndexShouldReturnEmptyWhenBlockDoesNotHaveOmmers() { final BlockchainWithData data = setupBlockchain(1); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(0).block; final Optional<BlockHeader> ommerOptional = queries.getOmmer(targetBlock.getHeader().getNumber(), 0); assertThat(targetBlock.getBody().getOmmers()).hasSize(0); assertThat(ommerOptional).isEmpty(); }
public BlockWithMetadata<Hash, Hash> blockWithMetadataAndTxHashes(final Block block) { final UInt256 td = block.getHeader().getDifficulty().plus(10L); final int size = block.calculateSize(); final List<Hash> txs = block .getBody() .getTransactions() .stream() .map(Transaction::hash) .collect(Collectors.toList()); final List<Hash> ommers = block.getBody().getOmmers().stream().map(BlockHeader::getHash).collect(Collectors.toList()); return new BlockWithMetadata<>(block.getHeader(), txs, ommers, td, size); }
@Test public void getOmmerCountByHash() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(1).block; final Optional<Integer> result = queries.getOmmerCount(targetBlock.getHash()); assertEquals(targetBlock.getBody().getOmmers().size(), (int) result.get()); }
@Test public void getOmmerByBlockNumberAndIndexShouldReturnEmptyWhenIndexIsOutOfRange() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(0).block; final int indexOutOfRange = targetBlock.getBody().getOmmers().size() + 1; final Optional<BlockHeader> ommerOptional = queries.getOmmer(targetBlock.getHeader().getNumber(), indexOutOfRange); assertThat(ommerOptional).isEmpty(); }
@Test public void getOmmerCountByNumber() { final BlockchainWithData data = setupBlockchain(3); final BlockchainQueries queries = data.blockchainQueries; final Block targetBlock = data.blockData.get(1).block; final Optional<Integer> result = queries.getOmmerCount(targetBlock.getHeader().getNumber()); assertEquals(targetBlock.getBody().getOmmers().size(), (int) result.get()); }
public BlockWithMetadata<TransactionWithMetadata, Hash> blockWithMetadata(final Block block) { final UInt256 td = block.getHeader().getDifficulty().plus(10L); final int size = block.calculateSize(); final List<Transaction> txs = block.getBody().getTransactions(); final List<TransactionWithMetadata> formattedTxs = new ArrayList<>(txs.size()); for (int i = 0; i < txs.size(); i++) { formattedTxs.add( new TransactionWithMetadata( txs.get(i), block.getHeader().getNumber(), block.getHash(), i)); } final List<Hash> ommers = block.getBody().getOmmers().stream().map(BlockHeader::getHash).collect(Collectors.toList()); return new BlockWithMetadata<>(block.getHeader(), formattedTxs, ommers, td, size); }
private void assertBlockMatchesResultWithTxHashes( final Block targetBlock, final BlockWithMetadata<Hash, Hash> result) { assertEquals(targetBlock.getHeader(), result.getHeader()); final List<Hash> expectedOmmers = targetBlock .getBody() .getOmmers() .stream() .map(BlockHeader::getHash) .collect(Collectors.toList()); assertEquals(expectedOmmers, result.getOmmers()); for (int i = 0; i < result.getTransactions().size(); i++) { final Hash txResult = result.getTransactions().get(i); final Transaction actualTx = targetBlock.getBody().getTransactions().get(i); assertEquals(actualTx.hash(), txResult); } }
assertThat(ommersResult.size()).isEqualTo(block.getBody().getOmmers().size()); for (int i = 0; i < block.getBody().getOmmers().size(); i++) { final BlockHeader ommer = block.getBody().getOmmers().get(i); final Hash ommerHash = ommer.getHash(); assertThat(Hash.fromHexString(ommersResult.getString(i))).isEqualTo(ommerHash);
private void assertBlockMatchesResult( final Block targetBlock, final BlockWithMetadata<TransactionWithMetadata, Hash> result) { assertEquals(targetBlock.getHeader(), result.getHeader()); final List<Hash> expectedOmmers = targetBlock .getBody() .getOmmers() .stream() .map(BlockHeader::getHash) .collect(Collectors.toList()); assertEquals(expectedOmmers, result.getOmmers()); for (int i = 0; i < result.getTransactions().size(); i++) { final TransactionWithMetadata txResult = result.getTransactions().get(i); final Transaction targetTx = targetBlock.getBody().getTransactions().get(i); assertEquals(targetTx, txResult.getTransaction()); assertEquals(i, txResult.getTransactionIndex()); assertEquals(targetBlock.getHash(), txResult.getBlockHash()); assertEquals(targetBlock.getHeader().getNumber(), txResult.getBlockNumber()); } }
private byte[] serializeBlock(final Block block) { final BytesValueRLPOutput out = new BytesValueRLPOutput(); out.startList(); block.getHeader().writeTo(out); out.writeList(block.getBody().getTransactions(), Transaction::writeTo); out.writeList(block.getBody().getOmmers(), BlockHeader::writeTo); out.endList(); return out.encoded().extractArray(); } }