区块链教程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
欢迎继续关注兄弟连区块链教程分享!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
区块链教程Fabric1.0源代码分析Chaincode(链码)体系总结-兄弟连
Fabric 1.0源代码笔记 之 Chaincode(链码) 1、Chaincode概述 Chaincode,即链码或智能合约,代码分布在protos/peer目录、core/chaincode和core/common/ccprovider目录,目录结构如下: protos/peer目录:* chaincode.pb.go,ChaincodeDeploymentSpec、ChaincodeInvocationSpec结构体定义。 core/chaincode目录:* platforms目录,链码的编写语言平台实现,如golang或java。 * platforms.go,Platform接口定义,及部分工具函数。* java目录,java语言平台实现。* golang目录,golang语言平台实现。 core/common/ccprovider目录:ccprovider相关实现。 2、protos相关结构体定义 2.1、ChaincodeDeploymentSpec结构体定义(用于Chaincode部署) 2.1.1 ChaincodeDeploymentSpec结构体定义 type...
-
下一篇
如何开发一款java应用运行时的监控程序?
前言 每个程序员都或多或少遇到过相当多的疑难杂症问题排查的时刻。我自己也是工作中遇到许多稀奇古怪的问题。最开始我们排查问题使用的是jprofiler。特别是使用jprofiler来排查调用链路的耗时问题。如下图所示: 但是jprofiler只能用于排查一些本地的问题。对于一些生产环境的由于网络隔离在加上权限受限, jprofiler就不是那么好使了。这时候萌生了自己做个小工具的想法。同时参考了一些工具和apm的实现, 简单实现了所需的功能。 我们现在思考下, 假设要开发一个java程序的监控工具,比如包含以下功能, 都需要怎么实现? 1. 实时或周期性的获取java进程运行数据, 包括但不限于内存,线程,操作系统,GC等。 2. 如何在运行时知道一个class是被哪个classloader加载的? 3. 如何动态的知道一个方法的执行时间?(对于基础的排查性能问题很有用) 4. 如何动态知道一个方法被调用时候的完整调用栈? 5. 如何动态的知道一次调用下一个方法的入参,返回值? ... 基础部分 在这个【基础部分】里, 我们可以很轻松的解决上边的问题1。这要感谢JDK5后提供的两大神器:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker容器配置,解决镜像无法拉取问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- MySQL数据库在高并发下的优化方案