code: def connect(self,
                  name=None,
                  remoteId=None,
                  ha=None,
                  verKeyRaw=None,
                  publicKeyRaw=None):
          
          if not name:
              raise ValueError('Remote name should be specified')
  
          publicKey = None
          if name in self.remotes:
              remote = self.remotes[name]
          else:
              publicKey = z85.encode(
                  publicKeyRaw) if publicKeyRaw else self.getPublicKey(name)
              verKey = z85.encode(
                  verKeyRaw) if verKeyRaw else self.getVerKey(name)
              if not ha or not publicKey or (self.isRestricted and not verKey):
                  raise ValueError('{} doesnt have enough info to connect. '
                                   'Need ha, public key and verkey. {} {} {}'.
                                   format(name, ha, verKey, publicKey))
              remote = self.addRemote(name, ha, verKey, publicKey)
  
          public, secret = self.selfEncKeys
          remote.connect(self.ctx, public, secret)
  
          logger.info("{}{} looking for {} at {}:{}"
                      .format(CONNECTION_PREFIX, self,
                              name or remote.name, *remote.ha),
                      extra={"cli": "PLAIN", "tags": ["node-looking"]})
  
          # This should be scheduled as an async task
  
          self.sendPingPong(remote, is_ping=True)
  
          # re-send previously stashed pings/pongs from unknown remotes
          logger.trace("{} stashed pongs: {}".format(self.name, str(self._stashed_pongs)))
          if publicKey in self._stashed_pongs:
              logger.trace("{} sending stashed pongs to {}".format(self.name, str(z85_to_friendly(publicKey))))
              self._stashed_pongs.discard(publicKey)
              self.sendPingPong(name, is_ping=False)
  
          return remote.uid
docs: Connect to the node specified by name.