code: func (h *Handler) checkACL(signedProp *pb.SignedProposal, proposal *pb.Proposal, ccIns *sysccprovider.ChaincodeInstance) error {
  	// ensure that we don't invoke a system chaincode
  	// that is not invokable through a cc2cc invocation
  	if h.SystemCCProvider.IsSysCCAndNotInvokableCC2CC(ccIns.ChaincodeName) {
  		return errors.Errorf("system chaincode %s cannot be invoked with a cc2cc invocation", ccIns.ChaincodeName)
  	}
  
  	// if we are here, all we know is that the invoked chaincode is either
  	// - a system chaincode that *is* invokable through a cc2cc
  	//   (but we may still have to determine whether the invoker can perform this invocation)
  	// - an application chaincode
  	//   (and we still need to determine whether the invoker can invoke it)
  
  	if h.SystemCCProvider.IsSysCC(ccIns.ChaincodeName) {
  		// Allow this call
  		return nil
  	}
  
  	// A Nil signedProp will be rejected for non-system chaincodes
  	if signedProp == nil {
  		return errors.Errorf("signed proposal must not be nil from caller [%s]", ccIns.String())
  	}
  
  	return h.ACLProvider.CheckACL(resources.Peer_ChaincodeToChaincode, ccIns.ChainID, signedProp)
  }
docs: // Check if the transactor is allow to call this chaincode on this channel