code: func MakeChannelCreationTransactionFromTemplate(channelID string, signer crypto.LocalSigner, conf *genesisconfig.Profile, template *cb.ConfigGroup) (*cb.Envelope, error) {
  	newChannelConfigUpdate, err := NewChannelCreateConfigUpdate(channelID, conf, template)
  	if err != nil {
  		return nil, errors.Wrap(err, "config update generation failure")
  	}
  
  	newConfigUpdateEnv := &cb.ConfigUpdateEnvelope{
  		ConfigUpdate: utils.MarshalOrPanic(newChannelConfigUpdate),
  	}
  
  	if signer != nil {
  		sigHeader, err := signer.NewSignatureHeader()
  		if err != nil {
  			return nil, errors.Wrap(err, "creating signature header failed")
  		}
  
  		newConfigUpdateEnv.Signatures = []*cb.ConfigSignature{{
  			SignatureHeader: utils.MarshalOrPanic(sigHeader),
  		}}
  
  		newConfigUpdateEnv.Signatures[0].Signature, err = signer.Sign(util.ConcatenateBytes(newConfigUpdateEnv.Signatures[0].SignatureHeader, newConfigUpdateEnv.ConfigUpdate))
  		if err != nil {
  			return nil, errors.Wrap(err, "signature failure over config update")
  		}
  
  	}
  
  	return utils.CreateSignedEnvelope(cb.HeaderType_CONFIG_UPDATE, channelID, signer, newConfigUpdateEnv, msgVersion, epoch)
  }
docs: // MakeChannelCreationTransactionFromTemplate creates a transaction for creating a channel.  It uses
  // the given template to produce the config update set.  Usually, the caller will want to invoke
  // MakeChannelCreationTransaction or MakeChannelCreationTransactionWithSystemChannelContext.