@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; }
@Before public void setUp() { when(ethPeers.availablePeers()).then(invocation -> peers.stream()); when(blockchain.getChainHeadBlockNumber()).thenReturn(CHAIN_HEAD); }
@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); }
@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; }
@Test public void shouldBecomeInSyncWhenOurBlockchainCatchesUp() { setupOutOfSyncState(); when(blockchain.getChainHeadBlockNumber()).thenReturn(TARGET_SYNC_NUMBER); blockAddedObserver.onBlockAdded( BlockAddedEvent.createForHeadAdvancement( new Block( targetBlockHeader(), new BlockBody(Collections.emptyList(), Collections.emptyList()))), blockchain); assertThat(syncState.isInSync()).isTrue(); verify(inSyncListener).onSyncStatusChanged(true); }
final long startNumber = reverse ? blockchain.getChainHeadBlockNumber() - 2 : 2; final int delta = (skip + 1) * (reverse ? -1 : 1); final int count = 4;
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()); } }
final List<Hash> requestedHashes = new ArrayList<>(); final long startBlock = blockchain.getChainHeadBlockNumber() - 5; final int blockCount = 2; for (int i = 0; i < blockCount; i++) {
final long startNumber = reverse ? blockchain.getChainHeadBlockNumber() - 2 : 2; final int delta = (skip + 1) * (reverse ? -1 : 1); final int count = 4;
@Test public void respondToGetHeadersPartial() throws ExecutionException, InterruptedException { final CompletableFuture<Void> done = new CompletableFuture<>(); try (final EthProtocolManager ethManager = new EthProtocolManager(blockchain, protocolContext.getWorldStateArchive(), 1, true, 1, 1)) { final long startBlock = blockchain.getChainHeadBlockNumber() - 1L; final int blockCount = 5; final MessageData messageData = GetBlockHeadersMessage.create(startBlock, blockCount, 0, false); final PeerSendHandler onSend = (cap, message, conn) -> { if (message.getCode() == EthPV62.STATUS) { // Ignore status message return; } assertThat(message.getCode()).isEqualTo(EthPV62.BLOCK_HEADERS); final BlockHeadersMessage headersMsg = BlockHeadersMessage.readFrom(message); final List<BlockHeader> headers = Lists.newArrayList(headersMsg.getHeaders(protocolSchedule)); assertThat(headers.size()).isEqualTo(2); for (int i = 0; i < 2; i++) { assertThat(headers.get(i).getNumber()).isEqualTo(startBlock + i); } done.complete(null); }; final PeerConnection peer = setupPeer(ethManager, onSend); ethManager.processMessage(EthProtocol.ETH63, new DefaultMessage(peer, messageData)); done.get(); } }
@Test public void respondToGetHeadersEmpty() throws ExecutionException, InterruptedException { final CompletableFuture<Void> done = new CompletableFuture<>(); try (final EthProtocolManager ethManager = new EthProtocolManager(blockchain, protocolContext.getWorldStateArchive(), 1, true, 1, 1)) { final long startBlock = blockchain.getChainHeadBlockNumber() + 1; final int blockCount = 5; final MessageData messageData = GetBlockHeadersMessage.create(startBlock, blockCount, 0, false); final PeerSendHandler onSend = (cap, message, conn) -> { if (message.getCode() == EthPV62.STATUS) { // Ignore status message return; } assertThat(message.getCode()).isEqualTo(EthPV62.BLOCK_HEADERS); final BlockHeadersMessage headersMsg = BlockHeadersMessage.readFrom(message); final List<BlockHeader> headers = Lists.newArrayList(headersMsg.getHeaders(protocolSchedule)); assertThat(headers.size()).isEqualTo(0); done.complete(null); }; final PeerConnection peer = setupPeer(ethManager, onSend); ethManager.processMessage(EthProtocol.ETH63, new DefaultMessage(peer, messageData)); done.get(); } }
final long startBlock = blockchain.getChainHeadBlockNumber() - blockCount; final List<List<TransactionReceipt>> expectedReceipts = new ArrayList<>(blockCount); final List<Hash> blockHashes = new ArrayList<>(blockCount);
final long startBlock = blockchain.getChainHeadBlockNumber() - blockCount; final Block[] expectedBlocks = new Block[blockCount]; for (int i = 0; i < blockCount; i++) {
new EthProtocolManager(blockchain, protocolContext.getWorldStateArchive(), 1, true, 1, 1)) { final long expectedBlockNumber = blockchain.getChainHeadBlockNumber() - 1; final BlockHeader header = blockchain.getBlockHeader(expectedBlockNumber).get(); final BlockBody body = blockchain.getBlockBody(header.getHash()).get();
new EthProtocolManager(blockchain, protocolContext.getWorldStateArchive(), 1, true, 1, 1)) { final long blockNumber = blockchain.getChainHeadBlockNumber() - 5; final BlockHeader header = blockchain.getBlockHeader(blockNumber).get(); final List<TransactionReceipt> expectedReceipts =
@Test public void syncsToBetterChain_multipleSegments() { otherBlockchainSetup.importFirstBlocks(15); final long targetBlock = otherBlockchain.getChainHeadBlockNumber(); // Sanity check assertThat(targetBlock).isGreaterThan(localBlockchain.getChainHeadBlockNumber()); final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, otherBlockchain); final Responder responder = RespondingEthPeer.blockchainResponder(otherBlockchain); final SynchronizerConfiguration syncConfig = SynchronizerConfiguration.builder() .downloaderChainSegmentSize(10) .build() .validated(localBlockchain); final FullSyncDownloader<?> downloader = downloader(syncConfig); downloader.start(); while (!syncState.syncTarget().isPresent()) { peer.respond(responder); } assertThat(syncState.syncTarget()).isPresent(); assertThat(syncState.syncTarget().get().peer()).isEqualTo(peer.getEthPeer()); while (localBlockchain.getChainHeadBlockNumber() < targetBlock) { peer.respond(responder); } assertThat(localBlockchain.getChainHeadBlockNumber()).isEqualTo(targetBlock); }
@Test public void syncsToBetterChain_singleSegment() { otherBlockchainSetup.importFirstBlocks(5); final long targetBlock = otherBlockchain.getChainHeadBlockNumber(); // Sanity check assertThat(targetBlock).isGreaterThan(localBlockchain.getChainHeadBlockNumber()); final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, otherBlockchain); final Responder responder = RespondingEthPeer.blockchainResponder(otherBlockchain); final SynchronizerConfiguration syncConfig = SynchronizerConfiguration.builder() .downloaderChainSegmentSize(10) .build() .validated(localBlockchain); final FullSyncDownloader<?> downloader = downloader(syncConfig); downloader.start(); while (!syncState.syncTarget().isPresent()) { peer.respond(responder); } assertThat(syncState.syncTarget()).isPresent(); assertThat(syncState.syncTarget().get().peer()).isEqualTo(peer.getEthPeer()); while (localBlockchain.getChainHeadBlockNumber() < targetBlock) { peer.respond(responder); } assertThat(localBlockchain.getChainHeadBlockNumber()).isEqualTo(targetBlock); }
@Test public void syncsToBetterChain_singleSegmentOnBoundary() { otherBlockchainSetup.importFirstBlocks(5); final long targetBlock = otherBlockchain.getChainHeadBlockNumber(); // Sanity check assertThat(targetBlock).isGreaterThan(localBlockchain.getChainHeadBlockNumber()); final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, otherBlockchain); final Responder responder = RespondingEthPeer.blockchainResponder(otherBlockchain); final SynchronizerConfiguration syncConfig = SynchronizerConfiguration.builder() .downloaderChainSegmentSize(4) .build() .validated(localBlockchain); final FullSyncDownloader<?> downloader = downloader(syncConfig); downloader.start(); while (!syncState.syncTarget().isPresent()) { peer.respond(responder); } assertThat(syncState.syncTarget()).isPresent(); assertThat(syncState.syncTarget().get().peer()).isEqualTo(peer.getEthPeer()); while (localBlockchain.getChainHeadBlockNumber() < targetBlock) { peer.respond(responder); } assertThat(localBlockchain.getChainHeadBlockNumber()).isEqualTo(targetBlock); }
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 syncsToBetterChain_fromFork() { otherBlockchainSetup.importFirstBlocks(15); final long targetBlock = otherBlockchain.getChainHeadBlockNumber();