func (r *Root) Orderer() *OrdererGroup {
	return r.channel.OrdererConfig()
}
Orderer returns the associated Orderer level config
package config
import (
	"fmt"
	"github.com/inklabsfoundation/inkchain/common/config/msp"
	"github.com/golang/protobuf/proto"
)
type Root struct {
	channel          *ChannelGroup
	mspConfigHandler *msp.MSPConfigHandler
}
func NewRoot(mspConfigHandler *msp.MSPConfigHandler) *Root {
	return &Root{
		channel:          NewChannelGroup(mspConfigHandler),
		mspConfigHandler: mspConfigHandler,
	}
}
type failDeserializer struct{}
func (fd failDeserializer) Deserialize(key string, value []byte) (proto.Message, error) {
	return nil, fmt.Errorf("Programming error, this should never be invoked")
}
func (r *Root) BeginValueProposals(tx interface{}, groups []string) (ValueDeserializer, []ValueProposer, error) {
	if len(groups) != 1 {
		return nil, nil, fmt.Errorf("Root config only supports having one base group")
	}
	if groups[0] != ChannelGroupKey {
		return nil, nil, fmt.Errorf("Root group must have channel")
	}
	r.mspConfigHandler.BeginConfig(tx)
	return failDeserializer{}, []ValueProposer{r.channel}, nil
}
func (r *Root) RollbackProposals(tx interface{}) {
	r.mspConfigHandler.RollbackProposals(tx)
}
func (r *Root) PreCommit(tx interface{}) error {
	return r.mspConfigHandler.PreCommit(tx)
}
func (r *Root) CommitProposals(tx interface{}) {
	r.mspConfigHandler.CommitProposals(tx)
}
func (r *Root) Channel() *ChannelGroup {
	return r.channel
}