def receive_message(self, datagram):
     if len(datagram) < 166:
         self.log.warning("received datagram too small from %s, ignoring" % self.addr)
         return False
     m = Message()
     try:
         m.ParseFromString(datagram)
         self.node = Node(m.sender.guid,
                          m.sender.nodeAddress.ip,
                          m.sender.nodeAddress.port,
                          m.sender.publicKey,
                          None if not m.sender.HasField("relayAddress") else
                          (m.sender.relayAddress.ip, m.sender.relayAddress.port),
                          m.sender.natType,
                          m.sender.vendor)
         pubkey = m.sender.publicKey
         verify_key = nacl.signing.VerifyKey(pubkey)
         signature = m.signature
         m.ClearField("signature")
         verify_key.verify(m.SerializeToString(), signature)
         h = nacl.hash.sha512(m.sender.publicKey)
         pow_hash = h[40:]
         if int(pow_hash[:6], 16) >= 50 or m.sender.guid.encode("hex") != h[:40]:
             raise Exception('Invalid GUID')
     except Exception:
         # If message isn't formatted property then ignore
         self.log.warning("received an invalid message from %s, ignoring" % self.addr)
         return False
     for processor in self.processors:
         if m.command in processor or m.command == NOT_FOUND:
             processor.receive_message(m, self.node, self.connection, self.ban_score)