def handle_version(self, source, message: qrllegacy_pb2.LegacyMessage): """ Version If version is empty, it sends the version & genesis_prev_headerhash. Otherwise, processes the content of data. In case of mismatches, it disconnects from the peer """ self._validate_message(message, qrllegacy_pb2.LegacyMessage.VE) if not message.veData.version: msg = qrllegacy_pb2.LegacyMessage( func_name=qrllegacy_pb2.LegacyMessage.VE, veData=qrllegacy_pb2.VEData(version=config.dev.version, genesis_prev_hash=config.dev.genesis_prev_headerhash, rate_limit=config.user.peer_rate_limit)) source.send(msg) return logger.info('%s version: %s | genesis prev_headerhash %s', source.peer_ip, message.veData.version, message.veData.genesis_prev_hash) if source.last_rate_limit_update > 0: source.factory.ban_peer(source) # Peer Breaking protocol, disconnect & Ban source.rate_limit = min(config.user.peer_rate_limit, message.veData.rate_limit) if message.veData.genesis_prev_hash != config.dev.genesis_prev_headerhash: logger.warning('%s genesis_prev_headerhash mismatch', source.connection_id) logger.warning('Expected: %s', config.dev.genesis_prev_headerhash) logger.warning('Found: %s', message.veData.genesis_prev_hash) source.loseConnection()
def test_wrap_message_works(self): veData = qrllegacy_pb2.VEData(version="version", genesis_prev_hash=b'genesis_hash') msg = qrllegacy_pb2.LegacyMessage( func_name=qrllegacy_pb2.LegacyMessage.VE, veData=veData) self.assertEqual( '000000191a170a0776657273696f6e120c67656e657369735f68617368', bin2hstr(P2PProtocol._wrap_message(msg)))
def test_handle_version_wrong_genesis_prev_headerhash(self): """ If the genesis_prev_headerhash is different, the nodes should disconnect from each other. """ channel = make_channel() message = qrllegacy_pb2.LegacyMessage( func_name=qrllegacy_pb2.LegacyMessage.VE, veData=qrllegacy_pb2.VEData( version=config.dev.version, genesis_prev_hash=b'TEST123', rate_limit=config.user.peer_rate_limit)) self.peer_manager.handle_version(channel, message) channel.loseConnection.assert_any_call()
def test_handle_version_empty_version_message(self): """ If the incoming version message has an empty version field, then send another version request. That message should have the node's version in it. """ channel = make_channel() message = qrllegacy_pb2.LegacyMessage( func_name=qrllegacy_pb2.LegacyMessage.VE, veData=qrllegacy_pb2.VEData( version='', genesis_prev_hash=config.user.genesis_prev_headerhash, rate_limit=config.user.peer_rate_limit)) self.peer_manager.handle_version(channel, message) self.assertEqual(channel.send.call_args[0][0].veData.version, config.dev.version)
def test_handle_version(self): """ When a version message arrives from a peer, and all else is normal: A version request message was not sent to the peer. The peer is not banned. P2PProtocol.loseConnection() is not called. """ channel = make_channel() message = qrllegacy_pb2.LegacyMessage( func_name=qrllegacy_pb2.LegacyMessage.VE, veData=qrllegacy_pb2.VEData( version=config.dev.version, genesis_prev_hash=config.user.genesis_prev_headerhash, rate_limit=config.user.peer_rate_limit)) self.peer_manager.handle_version(channel, message) channel.peer_manager.ban_channel.assert_not_called() channel.loseConnection.assert_not_called()
def handle_version(self, source, message: qrllegacy_pb2.LegacyMessage): """ Version If version is empty, it sends the version & genesis_prev_headerhash. Otherwise, processes the content of data. In case of mismatches, it disconnects from the peer """ self._validate_message(message, qrllegacy_pb2.LegacyMessage.VE) if not message.veData.version: msg = qrllegacy_pb2.LegacyMessage( func_name=qrllegacy_pb2.LegacyMessage.VE, veData=qrllegacy_pb2.VEData( version=config.dev.version, genesis_prev_hash=config.user.genesis_prev_headerhash, rate_limit=config.user.peer_rate_limit)) source.send(msg) return logger.info('%s version: %s | genesis prev_headerhash %s', source.peer.ip, message.veData.version, message.veData.genesis_prev_hash) if not self._get_version_compatibility(message.veData.version): logger.warning( "Disconnecting from Peer %s running incompatible node version %s", source.peer.ip, message.veData.version) source.loseConnection() self.ban_channel(source) return source.rate_limit = min(config.user.peer_rate_limit, message.veData.rate_limit) if message.veData.genesis_prev_hash != config.user.genesis_prev_headerhash: logger.warning('%s genesis_prev_headerhash mismatch', source.peer) logger.warning('Expected: %s', config.user.genesis_prev_headerhash) logger.warning('Found: %s', message.veData.genesis_prev_hash) source.loseConnection() self.ban_channel(source)
def send_version_request(self): msg = qrllegacy_pb2.LegacyMessage(func_name=qrllegacy_pb2.LegacyMessage.VE, veData=qrllegacy_pb2.VEData()) self.send(msg)