示例#1
0
    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()
示例#2
0
 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)))
示例#3
0
    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()
示例#4
0
    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)
示例#5
0
    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)
示例#7
0
 def send_version_request(self):
     msg = qrllegacy_pb2.LegacyMessage(func_name=qrllegacy_pb2.LegacyMessage.VE,
                                       veData=qrllegacy_pb2.VEData())
     self.send(msg)