code: func (v *Signature) Verify(response *fab.TransactionProposalResponse) error {
  
  	if response.ProposalResponse.GetResponse().Status < int32(common.Status_SUCCESS) || response.ProposalResponse.GetResponse().Status >= int32(common.Status_BAD_REQUEST) {
  		return status.NewFromProposalResponse(response.ProposalResponse, response.Endorser)
  	}
  
  	res := response.ProposalResponse
  
  	if res.GetEndorsement() == nil {
  		return errors.WithStack(status.New(status.EndorserClientStatus, status.MissingEndorsement.ToInt32(), "missing endorsement in proposal response", nil))
  	}
  	creatorID := res.GetEndorsement().Endorser
  
  	err := v.Membership.Validate(creatorID)
  	if err != nil {
  		return errors.WithStack(status.New(status.EndorserClientStatus, status.SignatureVerificationFailed.ToInt32(), "the creator certificate is not valid", []interface{}{err.Error()}))
  	}
  
  	// check the signature against the endorser and payload hash
  	digest := append(res.GetPayload(), res.GetEndorsement().Endorser...)
  
  	// validate the signature
  	err = v.Membership.Verify(creatorID, digest, res.GetEndorsement().Signature)
  	if err != nil {
  		return errors.WithStack(status.New(status.EndorserClientStatus, status.SignatureVerificationFailed.ToInt32(), "the creator's signature over the proposal is not valid", []interface{}{err.Error()}))
  	}
  
  	return nil
  }
docs: // Verify checks transaction proposal response