@Override protected List<Block> generateDataToBeRequested() { final List<Block> requestedBlocks = new ArrayList<>(); for (long i = 0; i < 3; i++) { final BlockHeader header = blockchain.getBlockHeader(10 + i).get(); final BlockBody body = blockchain.getBlockBody(header.getHash()).get(); requestedBlocks.add(new Block(header, body)); } return requestedBlocks; }
private void assertTotalDifficultiesAreConsistent(final Blockchain blockchain, final Block head) { // Check that total difficulties are summed correctly long num = BlockHeader.GENESIS_BLOCK_NUMBER; UInt256 td = UInt256.of(0); while (num <= head.getHeader().getNumber()) { final Hash curHash = blockchain.getBlockHashByNumber(num).get(); final BlockHeader curHead = blockchain.getBlockHeader(curHash).get(); td = td.plus(curHead.getDifficulty()); assertEquals(td, blockchain.getTotalDifficultyByHash(curHash).get()); num += 1; } // Check reported chainhead td assertEquals(td, blockchain.getChainHead().getTotalDifficulty()); }
@Override protected List<Block> generateDataToBeRequested() { final long chainHead = blockchain.getChainHeadBlockNumber(); final long importSize = 5; final long startNumber = chainHead - importSize + 1; final List<Block> blocksToImport = new ArrayList<>(); for (long i = 0; i < importSize; i++) { final BlockHeader header = blockchain.getBlockHeader(startNumber + i).get(); final BlockBody body = blockchain.getBlockBody(header.getHash()).get(); blocksToImport.add(new Block(header, body)); } return blocksToImport; }
@Override protected Map<BlockHeader, List<TransactionReceipt>> generateDataToBeRequested() { final Map<BlockHeader, List<TransactionReceipt>> expectedData = new HashMap<>(); for (long i = 0; i < 3; i++) { final BlockHeader header = blockchain.getBlockHeader(10 + i).get(); final List<TransactionReceipt> transactionReceipts = blockchain.getTxReceipts(header.getHash()).get(); expectedData.put(header, transactionReceipts); } return expectedData; }
private BlockHeader block(final long blockNumber) { return otherBlockchain.getBlockHeader(blockNumber).get(); } }
private void assertBlockDataIsStored( final Blockchain blockchain, final Block block, final List<TransactionReceipt> receipts) { final Hash hash = block.getHash(); assertEquals(hash, blockchain.getBlockHashByNumber(block.getHeader().getNumber()).get()); assertEquals(block.getHeader(), blockchain.getBlockHeader(block.getHeader().getNumber()).get()); assertEquals(block.getHeader(), blockchain.getBlockHeader(hash).get()); assertEquals(block.getBody(), blockchain.getBlockBody(hash).get()); assertThat(blockchain.blockIsOnCanonicalChain(block.getHash())).isTrue(); final List<Transaction> txs = block.getBody().getTransactions(); for (int i = 0; i < txs.size(); i++) { final Transaction expected = txs.get(i); final Transaction actual = blockchain.getTransactionByHash(expected.hash()).get(); assertEquals(expected, actual); } final List<TransactionReceipt> actualReceipts = blockchain.getTxReceipts(hash).get(); assertEquals(receipts, actualReceipts); }
private MutableBlockchain createShortChain( final Blockchain blockchain, final long truncateAtBlockNumber) { final BlockHeader genesisHeader = blockchain.getBlockHeader(BlockHeader.GENESIS_BLOCK_NUMBER).get(); final BlockBody genesisBody = blockchain.getBlockBody(genesisHeader.getHash()).get(); final Block genesisBlock = new Block(genesisHeader, genesisBody); final MutableBlockchain shortChain = createInMemoryBlockchain(genesisBlock); long nextBlock = genesisHeader.getNumber() + 1; while (nextBlock <= truncateAtBlockNumber) { final BlockHeader header = blockchain.getBlockHeader(nextBlock).get(); final BlockBody body = blockchain.getBlockBody(header.getHash()).get(); final List<TransactionReceipt> receipts = blockchain.getTxReceipts(header.getHash()).get(); final Block block = new Block(header, body); shortChain.appendBlock(block, receipts); nextBlock++; } return shortChain; } }
final long startBlock = blockchain.getChainHeadBlockNumber() - blockCount; final List<List<TransactionReceipt>> expectedReceipts = new ArrayList<>(blockCount); final List<Hash> blockHashes = new ArrayList<>(blockCount); for (int i = 0; i < blockCount; i++) { final BlockHeader header = blockchain.getBlockHeader(startBlock + i).get(); expectedReceipts.add(blockchain.getTxReceipts(header.getHash()).get()); blockHashes.add(header.getHash());
final Hash chainHeadHash = blockchain.getChainHeadHash(); final Block minedBlock = new Block( blockchain.getBlockHeader(chainHeadHash).get(), blockchain.getBlockBody(chainHeadHash).get()); final UInt256 expectedTotalDifficulty = blockchain.getChainHead().getTotalDifficulty();
private MockPeerConnection setupPeer( final EthProtocolManager ethManager, final PeerSendHandler onSend) { final MockPeerConnection peer = setupPeerWithoutStatusExchange(ethManager, onSend); final StatusMessage statusMessage = StatusMessage.create( EthVersion.V63, 1, blockchain.getChainHead().getTotalDifficulty(), blockchain.getChainHeadHash(), blockchain.getBlockHeader(BlockHeader.GENESIS_BLOCK_NUMBER).get().getHash()); ethManager.processMessage(EthProtocol.ETH63, new DefaultMessage(peer, statusMessage)); return peer; }
final long startNumber = reverse ? blockchain.getChainHeadBlockNumber() - 2 : 2; final int delta = (skip + 1) * (reverse ? -1 : 1); final int count = 4; final List<BlockHeader> expectedHeaders = new ArrayList<>(count); for (long i = 0; i < count; i++) { expectedHeaders.add(blockchain.getBlockHeader(startNumber + delta * i).get()); protocolSchedule, ethContext, blockchain.getBlockHashByNumber(startNumber).get(), startNumber, count,
final long startNumber = reverse ? blockchain.getChainHeadBlockNumber() - 2 : 2; final int delta = (skip + 1) * (reverse ? -1 : 1); final int count = 4; final List<BlockHeader> expectedHeaders = new ArrayList<>(count); for (long i = 0; i < count; i++) { expectedHeaders.add(blockchain.getBlockHeader(startNumber + delta * i).get());
private void assertBlockIsHead(final Blockchain blockchain, final Block head) { assertEquals(head.getHash(), blockchain.getChainHeadHash()); assertEquals(head.getHeader().getNumber(), blockchain.getChainHeadBlockNumber()); assertEquals(head.getHash(), blockchain.getChainHead().getHash()); }
@Test public void disconnectOnWrongGenesisHash() { try (final EthProtocolManager ethManager = new EthProtocolManager(blockchain, protocolContext.getWorldStateArchive(), 1, true, 1, 1)) { final MessageData messageData = BlockHeadersMessage.create(Collections.singletonList(blockchain.getBlockHeader(1).get())); final MockPeerConnection peer = setupPeerWithoutStatusExchange(ethManager, (cap, msg, conn) -> {}); // Send status message with wrong chain final StatusMessage statusMessage = StatusMessage.create( EthVersion.V63, 1, blockchain.getChainHead().getTotalDifficulty(), gen.hash(), blockchain.getBlockHeader(BlockHeader.GENESIS_BLOCK_NUMBER).get().getHash()); ethManager.processMessage(EthProtocol.ETH63, new DefaultMessage(peer, statusMessage)); ethManager.processMessage(EthProtocol.ETH63, new DefaultMessage(peer, messageData)); assertThat(peer.isDisconnected()).isTrue(); } }
@Override protected List<Block> generateDataToBeRequested() { final long chainHead = blockchain.getChainHeadBlockNumber(); final long importSize = 5; final long startNumber = chainHead - importSize + 1; final List<Block> blocksToImport = new ArrayList<>(); for (long i = 0; i < importSize; i++) { blocksToImport.add(getBlockAtNumber(startNumber + i)); } return blocksToImport; }
@Test public void importsAnnouncedNewBlocks_aheadOfChainInOrder() { blockchainUtil.importFirstBlocks(2); final Block nextBlock = blockchainUtil.getBlock(2); final Block nextNextBlock = blockchainUtil.getBlock(3); // Sanity check assertThat(blockchain.contains(nextBlock.getHash())).isFalse(); assertThat(blockchain.contains(nextNextBlock.getHash())).isFalse(); blockPropagationManager.start(); // Setup peer and messages final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 0); final NewBlockMessage nextAnnouncement = NewBlockMessage.create( nextBlock, fullBlockchain.getTotalDifficultyByHash(nextBlock.getHash()).get()); final NewBlockMessage nextNextAnnouncement = NewBlockMessage.create( nextNextBlock, fullBlockchain.getTotalDifficultyByHash(nextNextBlock.getHash()).get()); final Responder responder = RespondingEthPeer.blockchainResponder(fullBlockchain); // Broadcast first message EthProtocolManagerTestUtil.broadcastMessage(ethProtocolManager, peer, nextAnnouncement); peer.respondWhile(responder, peer::hasOutstandingRequests); // Broadcast second message EthProtocolManagerTestUtil.broadcastMessage(ethProtocolManager, peer, nextNextAnnouncement); peer.respondWhile(responder, peer::hasOutstandingRequests); assertThat(blockchain.contains(nextBlock.getHash())).isTrue(); assertThat(blockchain.contains(nextNextBlock.getHash())).isTrue(); }
@Before public void setUp() { final ArgumentCaptor<BlockAddedObserver> captor = ArgumentCaptor.forClass(BlockAddedObserver.class); when(blockchain.observeBlockAdded(captor.capture())).thenReturn(1L); when(peer.chainState()).thenReturn(peerChainHead); when(blockchain.getChainHeadBlockNumber()).thenReturn(OUR_CHAIN_HEAD_NUMBER); syncState = new SyncState(blockchain, ethPeers); blockAddedObserver = captor.getValue(); syncState.addInSyncListener(inSyncListener); }
public static RespondingEthPeer createPeer( final EthProtocolManager ethProtocolManager, final Blockchain blockchain) { final ChainHead head = blockchain.getChainHead(); return RespondingEthPeer.create( ethProtocolManager, head.getHash(), head.getTotalDifficulty(), blockchain.getChainHeadBlockNumber()); } }
@Before public void setup() { when(blockChain.getChainHeadHeader()).thenReturn(chainHeadBlockHeader); when(blockHeightManagerFactory.create(any())).thenReturn(blockHeightManager); when(ibftFinalState.getValidators()).thenReturn(ImmutableList.of(validator)); ibftController = new IbftController( blockChain, ibftFinalState, blockHeightManagerFactory, ibftGossip, futureMessages); when(chainHeadBlockHeader.getNumber()).thenReturn(1L); when(chainHeadBlockHeader.getHash()).thenReturn(Hash.ZERO); when(blockHeightManager.getParentBlockHeader()).thenReturn(chainHeadBlockHeader); when(nextBlock.getNumber()).thenReturn(2L); when(ibftFinalState.isLocalNodeValidator()).thenReturn(true); }
@Test public void syncsToBetterChain_fromFork() { otherBlockchainSetup.importFirstBlocks(15); final long targetBlock = otherBlockchain.getChainHeadBlockNumber(); assertThat(otherBlockchain.contains(localBlockchain.getChainHead().getHash())).isFalse();