code: func CreateChaincodeInvokeProposal(txh fab.TransactionHeader, request fab.ChaincodeInvokeRequest) (*fab.TransactionProposal, error) {
  	if request.ChaincodeID == "" {
  		return nil, errors.New("ChaincodeID is required")
  	}
  
  	if request.Fcn == "" {
  		return nil, errors.New("Fcn is required")
  	}
  
  	// Add function name to arguments
  	argsArray := make([][]byte, len(request.Args)+1)
  	argsArray[0] = []byte(request.Fcn)
  	for i, arg := range request.Args {
  		argsArray[i+1] = arg
  	}
  
  	// create invocation spec to target a chaincode with arguments
  	ccis := &pb.ChaincodeInvocationSpec{ChaincodeSpec: &pb.ChaincodeSpec{
  		Type: pb.ChaincodeSpec_GOLANG, ChaincodeId: &pb.ChaincodeID{Name: request.ChaincodeID},
  		Input: &pb.ChaincodeInput{Args: argsArray}}}
  
  	proposal, _, err := protoutil.CreateChaincodeProposalWithTxIDNonceAndTransient(string(txh.TransactionID()), common.HeaderType_ENDORSER_TRANSACTION, txh.ChannelID(), ccis, txh.Nonce(), txh.Creator(), request.TransientMap)
  	if err != nil {
  		return nil, errors.Wrap(err, "failed to create chaincode proposal")
  	}
  
  	tp := fab.TransactionProposal{
  		TxnID:    txh.TransactionID(),
  		Proposal: proposal,
  	}
  
  	return &tp, nil
  }
docs: // CreateChaincodeInvokeProposal creates a proposal for transaction.