def test_tx_propagation_nat_peers(self): """ manager1 <- manager2 <- manager3 """ self._add_new_blocks(25) manager2 = self.create_peer(self.network) conn1 = FakeConnection(self.manager1, manager2) for _ in range(1000): if conn1.is_empty(): break conn1.run_one_step() self.clock.advance(0.1) self.assertTipsEqual(self.manager1, manager2) self._add_new_blocks(1) for _ in range(1000): if conn1.is_empty(): break conn1.run_one_step() self.clock.advance(0.1) self.assertTipsEqual(self.manager1, manager2) manager3 = self.create_peer(self.network) conn2 = FakeConnection(manager2, manager3) for _ in range(1000): if conn1.is_empty() and conn2.is_empty(): break conn1.run_one_step() conn2.run_one_step() self.clock.advance(0.1) self.assertTipsEqual(self.manager1, manager2) self.assertTipsEqual(self.manager1, manager3) self._add_new_transactions(1) for _ in range(1000): if conn1.is_empty() and conn2.is_empty(): break conn1.run_one_step() conn2.run_one_step() self.clock.advance(0.1) self.assertTipsEqual(self.manager1, manager2) self.assertTipsEqual(self.manager1, manager3) self.assertConsensusEqual(self.manager1, manager2) self.assertConsensusEqual(self.manager1, manager3) self.assertConsensusValid(self.manager1) self.assertConsensusValid(manager2) self.assertConsensusValid(manager3)
def test_block_sync_many_new_blocks(self): self._add_new_blocks(150) manager2 = self.create_peer(self.network) self.assertEqual(manager2.state, manager2.NodeState.READY) conn = FakeConnection(self.manager1, manager2) while not conn.is_empty(): conn.run_one_step(debug=True) self.clock.advance(0.1) node_sync = conn.proto1.state.get_sync_plugin() self.assertEqual(node_sync.synced_timestamp, node_sync.peer_timestamp) self.assertTipsEqual(self.manager1, manager2) self.assertConsensusEqual(self.manager1, manager2) self.assertConsensusValid(self.manager1) self.assertConsensusValid(manager2)
def test_split_brain(self): debug_pdf = False manager1 = self.create_peer(self.network, unlock_wallet=True) manager1.avg_time_between_blocks = 3 manager2 = self.create_peer(self.network, unlock_wallet=True) manager2.avg_time_between_blocks = 3 for _ in range(10): add_new_block(manager1, advance_clock=1) add_blocks_unlock_reward(manager1) add_new_block(manager2, advance_clock=1) add_blocks_unlock_reward(manager2) self.clock.advance(10) for _ in range(random.randint(3, 10)): add_new_transactions(manager1, random.randint(2, 4)) add_new_transactions(manager2, random.randint(3, 7)) add_new_double_spending(manager1) add_new_double_spending(manager2) self.clock.advance(10) self.clock.advance(20) self.assertTipsNotEqual(manager1, manager2) self.assertConsensusValid(manager1) self.assertConsensusValid(manager2) if debug_pdf: dot1 = GraphvizVisualizer(manager1.tx_storage, include_verifications=True).dot() dot1.render('dot1-pre') conn = FakeConnection(manager1, manager2) conn.run_one_step() # HELLO conn.run_one_step() # PEER-ID empty_counter = 0 for i in range(1000): if conn.is_empty(): empty_counter += 1 if empty_counter > 10: break else: empty_counter = 0 conn.run_one_step() self.clock.advance(0.2) if debug_pdf: dot1 = GraphvizVisualizer(manager1.tx_storage, include_verifications=True).dot() dot1.render('dot1-post') dot2 = GraphvizVisualizer(manager2.tx_storage, include_verifications=True).dot() dot2.render('dot2-post') node_sync = conn.proto1.state.get_sync_plugin() self.assertEqual(node_sync.synced_timestamp, node_sync.peer_timestamp) self.assertTipsEqual(manager1, manager2) self.assertConsensusEqual(manager1, manager2) # self.assertConsensusValid(manager1) self.assertConsensusValid(manager2)