code: func (ks *KeyStore) SetPeerPublicKey(pubkey *ecdsa.PublicKey, topic Topic, address PssAddress) error {
  	if err := validateAddress(address); err != nil {
  		return err
  	}
  	pubkeybytes := crypto.FromECDSAPub(pubkey)
  	if len(pubkeybytes) == 0 {
  		return fmt.Errorf("invalid public key: %v", pubkey)
  	}
  	pubkeyid := common.ToHex(pubkeybytes)
  	psp := &pssPeer{
  		address: address,
  	}
  	ks.mx.Lock()
  	if _, ok := ks.pubKeyPool[pubkeyid]; !ok {
  		ks.pubKeyPool[pubkeyid] = make(map[Topic]*pssPeer)
  	}
  	ks.pubKeyPool[pubkeyid][topic] = psp
  	ks.mx.Unlock()
  	log.Trace("added pubkey", "pubkeyid", pubkeyid, "topic", topic, "address", address)
  	return nil
  }
docs: // Links a peer ECDSA public key to a topic.
  // This is required for asymmetric message exchange on the given topic.
  // The value in `address` will be used as a routing hint for the public key / topic association.