configtx代码分布在common/configtx目录,目录结构如下:
type Template interface {
????Envelope(chainID string) (*cb.ConfigUpdateEnvelope, error)
}
//代码在common/configtx/template.go
ConfigUpdateEnvelope定义:
type ConfigUpdateEnvelope struct {
????ConfigUpdate []byte //type ConfigUpdate struct
????Signatures []*ConfigSignature //type ConfigSignature struct
}
type ConfigUpdate struct {
????ChannelId string
????ReadSet *ConfigGroup //type ConfigGroup struct
????WriteSet *ConfigGroup //type ConfigGroup struct
}
type ConfigSignature struct {
????SignatureHeader []byte
????Signature []byte
}
type ConfigGroup struct {
????Version uint64
????Groups map[string]*ConfigGroup
????Values map[string]*ConfigValue
????Policies map[string]*ConfigPolicy
????ModPolicy string
}
//代码在protos/common/configtx.pb.go
type simpleTemplate struct {
????configGroup *cb.ConfigGroup
}
func NewSimpleTemplate(configGroups ...*cb.ConfigGroup) Template {
????sts := make([]Template, len(configGroups))
????for i, group := range configGroups {
????????sts[i] = &simpleTemplate{
????????????configGroup: group,
????????}
????}
????return NewCompositeTemplate(sts...)
}
func (st *simpleTemplate) Envelope(chainID string) (*cb.ConfigUpdateEnvelope, error) {
????config, err := proto.Marshal(&cb.ConfigUpdate{
????????ChannelId: chainID,
????????WriteSet: st.configGroup,
????})
????return &cb.ConfigUpdateEnvelope{
????????ConfigUpdate: config,
????}, nil
}
//代码在common/configtx/template.go
type compositeTemplate struct {
????templates []Template
}
func NewCompositeTemplate(templates ...Template) Template {
????return &compositeTemplate{templates: templates}
}
func (ct *compositeTemplate) Envelope(chainID string) (*cb.ConfigUpdateEnvelope, error) {
????channel := cb.NewConfigGroup()
????for i := range ct.templates {
????????configEnv, err := ct.templates[i].Envelope(chainID)
????????config, err := UnmarshalConfigUpdate(configEnv.ConfigUpdate)
????????err = copyGroup(config.WriteSet, channel)
????}
????marshaledConfig, err := proto.Marshal(&cb.ConfigUpdate{
????????ChannelId: chainID,
????????WriteSet: channel,
????})
????return &cb.ConfigUpdateEnvelope{ConfigUpdate: marshaledConfig}, nil
}
//代码在common/configtx/template.go
type modPolicySettingTemplate struct {
????modPolicy string
????template Template
}
func NewModPolicySettingTemplate(modPolicy string, template Template) Template {
????return &modPolicySettingTemplate{
????????modPolicy: modPolicy,
????????template: template,
????}
}
func (mpst *modPolicySettingTemplate) Envelope(channelID string) (*cb.ConfigUpdateEnvelope, error) {
????configUpdateEnv, err := mpst.template.Envelope(channelID)
????config, err := UnmarshalConfigUpdate(configUpdateEnv.ConfigUpdate)
????setGroupModPolicies(mpst.modPolicy, config.WriteSet)
????configUpdateEnv.ConfigUpdate = utils.MarshalOrPanic(config)
????return configUpdateEnv, nil
}
//代码在common/configtx/template.go
func UnmarshalConfig(data []byte) (*cb.Config, error)
func UnmarshalConfigOrPanic(data []byte) *cb.Config
func UnmarshalConfigUpdate(data []byte) (*cb.ConfigUpdate, error)
func UnmarshalConfigUpdateOrPanic(data []byte) *cb.ConfigUpdate
func UnmarshalConfigUpdateEnvelope(data []byte) (*cb.ConfigUpdateEnvelope, error)
func UnmarshalConfigUpdateEnvelopeOrPanic(data []byte) *cb.ConfigUpdateEnvelope
func UnmarshalConfigEnvelope(data []byte) (*cb.ConfigEnvelope, error)
func UnmarshalConfigEnvelopeOrPanic(data []byte) *cb.ConfigEnvelope
//代码在common/configtx/util.go
type Resources interface {
????PolicyManager() policies.Manager //获取通道策略管理器,即policies.Manager
????ChannelConfig() config.Channel //获取通道配置
????OrdererConfig() (config.Orderer, bool) //获取Orderer配置
????ConsortiumsConfig() (config.Consortiums, bool) //获取config.Consortiums
????ApplicationConfig() (config.Application, bool) //获取config.Application
????MSPManager() msp.MSPManager //获取通道msp管理器,即msp.MSPManager
}
//代码在common/configtx/api/api.go
Resources接口实现,即resources结构体及方法。
type resources struct {
????policyManager *policies.ManagerImpl
????configRoot *config.Root
????mspConfigHandler *configtxmsp.MSPConfigHandler
}
//代码在common/configtx/initializer.go
涉及方法如下:
//获取r.policyManager
func (r *resources) PolicyManager() policies.Manager
//获取r.configRoot.Channel()
func (r *resources) ChannelConfig() config.Channel
//获取r.configRoot.Orderer()
func (r *resources) OrdererConfig() (config.Orderer, bool)
//获取r.configRoot.Application()
func (r *resources) ApplicationConfig() (config.Application, bool)
//获取r.configRoot.Consortiums()
func (r *resources) ConsortiumsConfig() (config.Consortiums, bool)
//获取r.mspConfigHandler
func (r *resources) MSPManager() msp.MSPManager
//构造resources
func newResources() *resources
//代码在common/configtx/initializer.go
原文:http://blog.51cto.com/14041296/2310772