code: func (e *DefaultEndorsement) Endorse(prpBytes []byte, sp *peer.SignedProposal) (*peer.Endorsement, []byte, error) {
  	signer, err := e.SigningIdentityForRequest(sp)
  	if err != nil {
  		return nil, nil, errors.Wrap(err, "failed fetching signing identity")
  	}
  	// serialize the signing identity
  	identityBytes, err := signer.Serialize()
  	if err != nil {
  		return nil, nil, errors.Wrapf(err, "could not serialize the signing identity")
  	}
  
  	// sign the concatenation of the proposal response and the serialized endorser identity with this endorser's key
  	signature, err := signer.Sign(append(prpBytes, identityBytes...))
  	if err != nil {
  		return nil, nil, errors.Wrapf(err, "could not sign the proposal response payload")
  	}
  	endorsement := &peer.Endorsement{Signature: signature, Endorser: identityBytes}
  	return endorsement, prpBytes, nil
  }
docs: // Endorse signs the given payload(ProposalResponsePayload bytes), and optionally mutates it.
  // Returns:
  // The Endorsement: A signature over the payload, and an identity that is used to verify the signature
  // The payload that was given as input (could be modified within this function)
  // Or error on failure