blockchain.getBlockBody(chainHeadHash).get()); final UInt256 expectedTotalDifficulty = blockchain.getChainHead().getTotalDifficulty();
previousBlockFuture.join(); return new BlockImporter.ImportResult(blockchain.getChainHead().getTotalDifficulty(), count); } finally { validationExecutor.shutdownNow();
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()); } }
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()); }
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; }
@Test public void choosesBestPeerAsSyncTarget_byTd() { final UInt256 localTd = localBlockchain.getChainHead().getTotalDifficulty(); final Responder responder = RespondingEthPeer.blockchainResponder(otherBlockchain); final RespondingEthPeer peerA = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, localTd.plus(100)); final RespondingEthPeer peerB = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, localTd.plus(200)); final FullSyncDownloader<?> downloader = downloader(); downloader.start(); // Process until the sync target is selected while (!syncState.syncTarget().isPresent()) { RespondingEthPeer.respondOnce(responder, peerA, peerB); } assertThat(syncState.syncTarget()).isPresent(); assertThat(syncState.syncTarget().get().peer()).isEqualTo(peerB.getEthPeer()); }
@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(); } }
EthProtocol.EthVersion.V63, 1, blockchain.getChainHead().getTotalDifficulty(), blockchain.getChainHeadHash(), blockchain.getBlockHeader(BlockHeader.GENESIS_BLOCK_NUMBER).get().getHash());
@Test public void disconnectOnWrongChainId() { 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, 2222, blockchain.getChainHead().getTotalDifficulty(), blockchain.getChainHeadHash(), 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(); } }
@Test public void choosesBestPeerAsSyncTarget_byTdAndHeight() { final UInt256 localTd = localBlockchain.getChainHead().getTotalDifficulty(); final Responder responder = RespondingEthPeer.blockchainResponder(otherBlockchain); final RespondingEthPeer peerA = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, localTd.plus(100), 0); peerA.getEthPeer().chainState().update(gen.hash(), 100); final RespondingEthPeer peerB = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, localTd.plus(200), 0); peerA.getEthPeer().chainState().update(gen.hash(), 50); final FullSyncDownloader<?> downloader = downloader(); downloader.start(); // Process until the sync target is selected while (!syncState.syncTarget().isPresent()) { RespondingEthPeer.respondOnce(responder, peerA, peerB); } assertThat(syncState.syncTarget()).isPresent(); assertThat(syncState.syncTarget().get().peer()).isEqualTo(peerA.getEthPeer()); }
@Test public void switchesSyncTarget_betterHeight() { final UInt256 localTd = localBlockchain.getChainHead().getTotalDifficulty(); final Responder responder = RespondingEthPeer.blockchainResponder(otherBlockchain);
@Test public void doesNotSwitchSyncTarget_betterHeightUnderThreshold() { otherBlockchainSetup.importFirstBlocks(8); final UInt256 localTd = localBlockchain.getChainHead().getTotalDifficulty(); final Responder responder = RespondingEthPeer.blockchainResponder(otherBlockchain);
@Test public void switchesSyncTarget_betterTd() { final UInt256 localTd = localBlockchain.getChainHead().getTotalDifficulty(); final Responder responder = RespondingEthPeer.blockchainResponder(otherBlockchain);