code: func (p *Protocol) AddPeer(peer *p2p.Peer, topic Topic, asymmetric bool, key string) (p2p.MsgReadWriter, error) {
  	rw := &PssReadWriter{
  		Pss:   p.Pss,
  		rw:    make(chan p2p.Msg),
  		spec:  p.spec,
  		topic: p.topic,
  		key:   key,
  	}
  	if asymmetric {
  		rw.sendFunc = p.Pss.SendAsym
  	} else {
  		rw.sendFunc = p.Pss.SendSym
  	}
  	if asymmetric {
  		if !p.Pss.isPubKeyStored(key) {
  			return nil, fmt.Errorf("asym key does not exist: %s", key)
  		}
  		p.RWPoolMu.Lock()
  		p.pubKeyRWPool[key] = rw
  		p.RWPoolMu.Unlock()
  	} else {
  		if !p.Pss.isSymKeyStored(key) {
  			return nil, fmt.Errorf("symkey does not exist: %s", key)
  		}
  		p.RWPoolMu.Lock()
  		p.symKeyRWPool[key] = rw
  		p.RWPoolMu.Unlock()
  	}
  	go func() {
  		err := p.proto.Run(peer, rw)
  		log.Warn(fmt.Sprintf("pss vprotocol quit on %v topic %v: %v", peer, topic, err))
  	}()
  	return rw, nil
  }
docs: // Runs an emulated pss Protocol on the specified peer,
  // linked to a specific topic
  // `key` and `asymmetric` specifies what encryption key
  // to link the peer to.
  // The key must exist in the pss store prior to adding the peer.