区块链教程Fabric1.0源代码分析configtx#ChannelConfig-兄弟连

简介:

Fabric 1.0源代码笔记 之 configtx(配置交易) #ChannelConfig(通道配置)

1、ChannelConfig概述

ChannelConfig代码分布在common/config目录下。目录结构如下:

  • channel_util.go,channel相关工具函数。
  • orderer_util.go,orderer(系统通道)相关工具函数。
  • application_util.go,应用通道相关工具函数。
  • consortiums_util.go,联盟相关工具函数。
  • api.go,核心接口定义,如Org、ApplicationOrg、Channel、Orderer、Application、Consortium、Consortiums、ValueProposer接口定义。
  • root.go,Root结构体及方法。
  • channel.go,ChannelGroup结构体及方法。
  • orderer.go,OrdererGroup结构体及方法。
  • application.go,ApplicationGroup结构体及方法。

2、工具函数

2.1、channel相关工具函数

//用key和value构建cb.ConfigGroup
func configGroup(key string, value []byte) *cb.ConfigGroup {
    result := cb.NewConfigGroup()
    result.Values[key] = &cb.ConfigValue{
        Value: value,
    }
}

//设置联盟
//ConsortiumKey = "Consortium"
//configGroup(ConsortiumKey, utils.MarshalOrPanic(&cb.Consortium{Name: name}))
func TemplateConsortium(name string) *cb.ConfigGroup

//设置哈希函数
//HashingAlgorithmKey = "HashingAlgorithm"
//configGroup(HashingAlgorithmKey, utils.MarshalOrPanic(&cb.HashingAlgorithm{Name: name}))
func TemplateHashingAlgorithm(name string) *cb.ConfigGroup

//默认哈希函数
//const defaultHashingAlgorithm = bccsp.SHA256
//TemplateHashingAlgorithm(defaultHashingAlgorithm)
func DefaultHashingAlgorithm() *cb.ConfigGroup

//设置块数据哈希结构
//BlockDataHashingStructureKey = "BlockDataHashingStructure"
//configGroup(BlockDataHashingStructureKey, utils.MarshalOrPanic(&cb.BlockDataHashingStructure{Width: width}))
func TemplateBlockDataHashingStructure(width uint32) *cb.ConfigGroup

//默认块数据哈希结构
//const defaultBlockDataHashingStructureWidth = math.MaxUint32
//TemplateBlockDataHashingStructure(defaultBlockDataHashingStructureWidth)
func DefaultBlockDataHashingStructure() *cb.ConfigGroup

//设置Orderer地址
//OrdererAddressesKey = "OrdererAddresses"
//configGroup(OrdererAddressesKey, utils.MarshalOrPanic(&cb.OrdererAddresses{Addresses: addresses}))
func TemplateOrdererAddresses(addresses []string) *cb.ConfigGroup

//默认Orderer地址
//var defaultOrdererAddresses = []string{"127.0.0.1:7050"}
//TemplateOrdererAddresses(defaultOrdererAddresses)
func DefaultOrdererAddresses() *cb.ConfigGroup
//代码在common/config/channel_util.go

补充cb.ConfigGroup定义:

type ConfigGroup struct {
    Version   uint64
    Groups    map[string]*ConfigGroup
    Values    map[string]*ConfigValue
    Policies  map[string]*ConfigPolicy
    ModPolicy string
}
//代码在protos/common/configtx.pb.go

2.2、orderer相关工具函数

func ordererConfigGroup(key string, value []byte) *cb.ConfigGroup
func TemplateConsensusType(typeValue string) *cb.ConfigGroup
func TemplateBatchSize(batchSize *ab.BatchSize) *cb.ConfigGroup
func TemplateBatchTimeout(batchTimeout string) *cb.ConfigGroup
func TemplateChannelRestrictions(maxChannels uint64) *cb.ConfigGroup
func TemplateKafkaBrokers(brokers []string) *cb.ConfigGroup
//代码在common/config/orderer_util.go

2.3、应用通道相关工具函数

func applicationConfigGroup(orgID string, key string, value []byte) *cb.ConfigGroup
func TemplateAnchorPeers(orgID string, anchorPeers []*pb.AnchorPeer) *cb.ConfigGroup
//代码在common/config/application_util.go

2.4、联盟相关工具函数

func TemplateConsortiumsGroup() *cb.ConfigGroup
func TemplateConsortiumChannelCreationPolicy(name string, policy *cb.Policy) *cb.ConfigGroup
//代码在common/config/consortiums_util.go

3、核心接口定义

type Org interface { //组织接口
    Name() string //组织名称
    MSPID() string //组织MSPID
}

type ApplicationOrg interface { //应用组织接口
    Org //嵌入Org
    AnchorPeers() []*pb.AnchorPeer //锚节点
}

type Channel interface { //通道配置接口
    HashingAlgorithm() func(input []byte) []byte //哈希算法
    BlockDataHashingStructureWidth() uint32 //指定计算 BlockDataHash 时使用的 Merkle 树的宽度
    OrdererAddresses() []string //Orderer地址
}

type Application interface { //应用配置接口
    Organizations() map[string]ApplicationOrg //应用组织map
}

type Consortiums interface { //联盟配置map接口
    Consortiums() map[string]Consortium //Consortium map
}

type Consortium interface { //联盟配置接口
    ChannelCreationPolicy() *cb.Policy //通道创建策略
}

type Orderer interface { //Orderer配置接口
    ConsensusType() string //共识类型
    BatchSize() *ab.BatchSize //块中的最大消息数
    BatchTimeout() time.Duration //创建批处理之前等待的时间量
    MaxChannelsCount() uint64 //最大通道数
    KafkaBrokers() []string //Kafka地址
    Organizations() map[string]Org //Orderer组织
}

type ValueProposer interface {
    BeginValueProposals(tx interface{}, groups []string) (ValueDeserializer, []ValueProposer, error) //配置Proposal前
    RollbackProposals(tx interface{}) //回滚配置Proposal
    PreCommit(tx interface{}) error //提交前
    CommitProposals(tx interface{}) //提交
}
//代码在common/config/api.go

4、Root结构体及方法

type Root struct {
    channel          *ChannelGroup
    mspConfigHandler *msp.MSPConfigHandler
}

func NewRoot(mspConfigHandler *msp.MSPConfigHandler) *Root //构造Root
//启动新的配置Proposal,r.mspConfigHandler.BeginConfig(tx)
func (r *Root) BeginValueProposals(tx interface{}, groups []string) (ValueDeserializer, []ValueProposer, error) 
//回滚配置Proposal,r.mspConfigHandler.RollbackProposals(tx)
func (r *Root) RollbackProposals(tx interface{})
//提交前校验配置,r.mspConfigHandler.PreCommit(tx)
func (r *Root) PreCommit(tx interface{}) error
//提交配置Proposal,r.mspConfigHandler.CommitProposals(tx)
func (r *Root) CommitProposals(tx interface{})
//获取r.channel
func (r *Root) Channel() *ChannelGroup
//获取r.channel.OrdererConfig()
func (r *Root) Orderer() *OrdererGroup
//获取r.channel.ApplicationConfig()
func (r *Root) Application() *ApplicationGroup
//获取r.channel.ConsortiumsConfig()
func (r *Root) Consortiums() *ConsortiumsGroup {
//代码在common/config/root.go

5、ChannelGroup结构体及方法

5.1、ChannelGroup结构体及方法

type ChannelGroup struct {
    *ChannelConfig //嵌入ChannelConfig
    *Proposer //嵌入Proposer
    mspConfigHandler *msp.MSPConfigHandler
}

type ChannelConfig struct {
    *standardValues
    protos *ChannelProtos
    hashingAlgorithm func(input []byte) []byte
    appConfig         *ApplicationGroup
    ordererConfig     *OrdererGroup
    consortiumsConfig *ConsortiumsGroup
}

type ChannelProtos struct {
    HashingAlgorithm          *cb.HashingAlgorithm
    BlockDataHashingStructure *cb.BlockDataHashingStructure
    OrdererAddresses          *cb.OrdererAddresses
    Consortium                *cb.Consortium
}

构造ChannelGroup,以及构造ChannelConfig和Proposer
func NewChannelGroup(mspConfigHandler *msp.MSPConfigHandler) *ChannelGroup
func (cg *ChannelGroup) Allocate() Values //构造channelConfigSetter
//获取cg.ChannelConfig.ordererConfig
func (cg *ChannelGroup) OrdererConfig() *OrdererGroup
//获取cg.ChannelConfig.appConfig
func (cg *ChannelGroup) ApplicationConfig() *ApplicationGroup
//获取cg.ChannelConfig.consortiumsConfig
func (cg *ChannelGroup) ConsortiumsConfig() *ConsortiumsGroup
func (cg *ChannelGroup) NewGroup(group string) (ValueProposer, error)

//构造ChannelConfig,NewStandardValues(cc.protos)
func NewChannelConfig() *ChannelConfig
//获取cc.hashingAlgorithm
func (cc *ChannelConfig) HashingAlgorithm() func(input []byte) []byte
//获取cc.protos.BlockDataHashingStructure.Width
func (cc *ChannelConfig) BlockDataHashingStructureWidth() uint32
//获取cc.protos.OrdererAddresses.Addresses
func (cc *ChannelConfig) OrdererAddresses() []string
//获取cc.protos.Consortium.Name
func (cc *ChannelConfig) ConsortiumName() string
func (cc *ChannelConfig) Validate(tx interface{}, groups map[string]ValueProposer) error
func (cc *ChannelConfig) validateHashingAlgorithm() error
func (cc *ChannelConfig) validateBlockDataHashingStructure() error
func (cc *ChannelConfig) validateOrdererAddresses() error
//代码在common/config/channel.go

补充cb.HashingAlgorithm、cb.BlockDataHashingStructure、cb.OrdererAddresses、cb.Consortium定义:

//哈希算法
type HashingAlgorithm struct {
    Name string
}

//块数据哈希结构
type BlockDataHashingStructure struct {
    Width uint32 //指定计算 BlockDataHash 时使用的 Merkle 树的宽度
}

//Orderer地址
type OrdererAddresses struct {
    Addresses []string
}

type Consortium struct {
    Name string
}
//代码在protos/common/configuration.pb.go

5.2、Proposer结构体及方法

type Proposer struct {
    vh          Handler
    pending     map[interface{}]*config
    current     *config
    pendingLock sync.RWMutex
}
func NewProposer(vh Handler) *Proposer
func (p *Proposer) BeginValueProposals(tx interface{}, groups []string) (ValueDeserializer, []ValueProposer, error)
func (p *Proposer) PreCommit(tx interface{}) error
func (p *Proposer) RollbackProposals(tx interface{})
func (p *Proposer) CommitProposals(tx interface{})
//代码在common/config/proposer.go

5.3、OrdererGroup结构体及方法

type OrdererGroup struct {
    *Proposer
    *OrdererConfig
    mspConfig *msp.MSPConfigHandler
}

type OrdererConfig struct {
    *standardValues
    protos       *OrdererProtos
    ordererGroup *OrdererGroup
    orgs         map[string]Org
    batchTimeout time.Duration
}

type OrdererProtos struct {
    ConsensusType       *ab.ConsensusType
    BatchSize           *ab.BatchSize
    BatchTimeout        *ab.BatchTimeout
    KafkaBrokers        *ab.KafkaBrokers
    ChannelRestrictions *ab.ChannelRestrictions
}

//构造OrdererGroup,以及Proposer
func NewOrdererGroup(mspConfig *msp.MSPConfigHandler) *OrdererGroup
func (og *OrdererGroup) NewGroup(name string) (ValueProposer, error)
func (og *OrdererGroup) Allocate() Values

//构造OrdererConfig
func NewOrdererConfig(og *OrdererGroup) *OrdererConfig
//oc.ordererGroup.OrdererConfig = oc
func (oc *OrdererConfig) Commit()
//获取oc.protos.ConsensusType.Type
func (oc *OrdererConfig) ConsensusType() string
//获取oc.protos.BatchSize
func (oc *OrdererConfig) BatchSize() *ab.BatchSize
//获取oc.batchTimeout
func (oc *OrdererConfig) BatchTimeout() time.Duration
//获取oc.protos.KafkaBrokers.Brokers
func (oc *OrdererConfig) KafkaBrokers() []string
//获取oc.protos.ChannelRestrictions.MaxCount
func (oc *OrdererConfig) MaxChannelsCount() uint64
//获取oc.orgs
func (oc *OrdererConfig) Organizations() map[string]Org
func (oc *OrdererConfig) Validate(tx interface{}, groups map[string]ValueProposer) error
func (oc *OrdererConfig) validateConsensusType() error
func (oc *OrdererConfig) validateBatchSize() error
func (oc *OrdererConfig) validateBatchTimeout() error
func (oc *OrdererConfig) validateKafkaBrokers() error
func brokerEntrySeemsValid(broker string) bool
//代码在common/config/orderer.go

5.4、ApplicationGroup结构体及方法

//代码在common/config/application.go

欢迎继续关注兄弟连区块链教程分享!

相关文章
|
6月前
|
存储 供应链 监控
区块链技术在供应链管理中的应用与前景分析
随着信息化时代的到来,供应链管理面临着越来越多的挑战和机遇。本文主要探讨了区块链技术在供应链管理中的应用,以及未来的发展前景。通过对区块链技术的特点和优势进行分析,结合实际案例和趋势展望,展示了区块链技术在提升供应链透明度、效率和安全性方面的潜力,以及未来发展的可能方向。
|
6月前
|
安全 区块链
区块链积分商城系统开发详细指南//需求功能/指南教程/源码流程
Developing a blockchain points mall system involves multiple aspects such as blockchain technology, smart contracts, front-end development, and business logic design. The following is the general process for developing a blockchain points mall system
|
6月前
|
存储 算法 API
面向企业的区块链教程(一)(2)
面向企业的区块链教程(一)
107 6
|
3月前
|
安全 区块链
Massa Layer 1区块链 POS 安全性分析
Massa Labs 回应 Certik 的挑战,通过严格的数学分析证明了其权益证明系统的安全性,抵抗了潜在攻击者试图操纵随机抽签的企图。
59 0
Massa Layer 1区块链 POS 安全性分析
|
6月前
|
存储 供应链 安全
基于区块链技术的智能合约安全性分析
【5月更文挑战第31天】本文深入探讨了区块链技术中智能合约的安全性问题,通过分析现有智能合约的安全漏洞和攻击手段,提出了一系列增强智能合约安全性的策略。文章首先介绍了区块链和智能合约的基本概念,随后详细讨论了智能合约面临的安全挑战,包括代码漏洞、重入攻击等问题,并对比分析了不同平台下智能合约的安全性差异。最后,文章提出了一系列提高智能合约安全性的建议,旨在为区块链应用的健康发展提供参考。
|
5月前
|
存储 安全 区块链
元宇宙与区块链技术的关系可以从多个角度进行阐述。以下是对这两者之间关系的详细分析
**元宇宙:虚拟世界融合现实元素,强调交互与沉浸;区块链:去中心化、安全的分布式账本。两者结合,区块链确保元宇宙中虚拟资产安全、支付高效、身份验证私密、治理透明,支撑其经济体系与用户信任,驱动未来发展。**
|
6月前
|
存储 算法 安全
区块链系统开发技术规则分析
区块链核心技术包括:1) 哈希算法,利用单向函数将任意数据转化为固定长度代码,确保安全验证;2) 非对称加密,使用公钥和私钥一对进行加密解密,保证信息安全;3) 共识机制,如PoW、PoS、DPoS等,实现快速交易验证和确认;4) 智能合约,自动执行的可信代码,一旦编写即不可更改,用于自动化交易;5) 分布式存储,将数据分散存储在网络各处,涵盖结构化、非结构化和半结构化数据。
|
5月前
|
区块链
近期区块链市场趋势分析
**区块链市场趋势摘要:** - 跨链技术成熟,提升互操作性,助力区块链网络融合。 - DeFi持续繁荣,智能合约与AMM创新活跃,市场竞争驱动市场壮大。 - NFT市场多样化,拓展至游戏、音乐等领域,实用性增强。 - 区块链寻求绿色转型,通过PoS共识与绿色能源减少能耗。 - 技术模块化、可组合性提升,降低成本,增强系统灵活性。 这些趋势展现区块链潜力,带来机遇与挑战,促进行业创新。
|
6月前
|
供应链 区块链 数据安全/隐私保护
探索区块链技术在金融领域的应用与前景分析
本文将深入探讨区块链技术在金融领域的具体应用场景,分析其优势与挑战,并展望未来发展趋势。通过案例分析和技术解析,揭示区块链技术在金融行业中的革新意义及前景。
939 15
|
6月前
|
安全 区块链
区块链游戏系统开发步骤需求丨功能逻辑丨规则玩法丨指南教程丨源码详细
Developing blockchain game systems has been a highly anticipated field in recent years. By combining blockchain technology and game mechanics, players can enjoy a brand new gaming experience and higher game credibility.