培训首页  >  web前端新闻  >  兄弟连区块链教程处理通道配置更新

兄弟连区块链教程处理通道配置更新

[2018-11-05 16:32:45] 浏览量:134 来源:

北京兄弟连IT

  兄弟连区块链教程Fabric1.0源代码分析configupdate处理通道配置更新2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。

# Fabric 1.0源代码笔记 之 Orderer #configupdate(处理通道配置更新)

 

## 1、configupdate概述

 

configupdate,用于接收配置交-易,并处理通道配置更新。

相关代码在orderer/configupdate目录。

 

## 2、SupportManager接口定义及实现

 

### 2.1、SupportManager接口定义

 

```go

type SupportManager interface {

    GetChain(chainID string) (Support, bool)

    NewChannelConfig(envConfigUpdate *cb.Envelope) (configtxapi.Manager, error)

}

//代码在orderer/configupdate/configupdate.go

```

 

### 2.2、SupportManager接口实现

 

SupportManager接口实现,即configUpdateSupport结构体及方法。

 

```go

type configUpdateSupport struct {

    multichain.Manager //type multiLedger struct

}

 

func (cus configUpdateSupport) GetChain(chainID string) (configupdate.Support, bool) {

    return cus.Manager.GetChain(chainID)

}

//代码在orderer/server.go

```

 

multichain.Manager接口及实现multiLedger,见Fabric 1.0源代码笔记 之 Orderer #multichain(多链支持包)

## 3、Support接口定义及实现

 

### 3.1、Support接口定义

 

```go

type Support interface {

    ProposeConfigUpdate(env *cb.Envelope) (*cb.ConfigEnvelope, error)

}

//代码在orderer/configupdate/configupdate.go

```

 

### 3.2、Support接口实现

 

Support接口实现,即configManager结构体及方法。

 

```go

type configManager struct {

    api.Resources

    callOnUpdate []func(api.Manager)

    initializer  api.Initializer

    current      *configSet

}

 

func (cm *configManager) processConfig(channelGroup *cb.ConfigGroup) (*configResult, error) //./config.go

func (cm *configManager) commitCallbacks() //./manager.go

func (cm *configManager) ProposeConfigUpdate(configtx *cb.Envelope) (*cb.ConfigEnvelope, error) //./manager.go

func (cm *configManager) proposeConfigUpdate(configtx *cb.Envelope) (*cb.ConfigEnvelope, error) //./manager.go

func (cm *configManager) prepareApply(configEnv *cb.ConfigEnvelope) (*configResult, error) //./manager.go

func (cm *configManager) Validate(configEnv *cb.ConfigEnvelope) error //./manager.go

func (cm *configManager) Apply(configEnv *cb.ConfigEnvelope) error //./manager.go

func (cm *configManager) ChainID() string //./manager.go

func (cm *configManager) Sequence() uint64 //./manager.go

func (cm *configManager) ConfigEnvelope() *cb.ConfigEnvelope //./manager.go

func (cm *configManager) verifyDeltaSet(deltaSet map[string]comparable, signedData []*cb.SignedData) error //./update.go

func (cm *configManager) authorizeUpdate(configUpdateEnv *cb.ConfigUpdateEnvelope) (map[string]comparable, error) //./update.go

func (cm *configManager) policyForItem(item comparable) (policies.Policy, bool) //./update.go

func (cm *configManager) computeUpdateResult(updatedConfig map[string]comparable) map[string]comparable //./update.go

//代码在common/configtx/manager.go

```

 

## 4、ConfigUpdateProcessor接口定义及实现

 

### 4.1、ConfigUpdateProcessor接口定义

 

```go

type ConfigUpdateProcessor interface {

    Process(envConfigUpdate *cb.Envelope) (*cb.Envelope, error)

}

//代码在orderer/common/broadcast/broadcast.go

```

 

### 4.2、ConfigUpdateProcessor接口实现

 

ConfigUpdateProcessor接口实现,即Processor结构体及方法。

 

```go

type Processor struct {

    signer               crypto.LocalSigner

    manager              SupportManager //即type configUpdateSupport struct,或者即multichain.multiLedger

    systemChannelID      string

    systemChannelSupport Support

}

 

//构造Processor

func New(systemChannelID string, supportManager SupportManager, signer crypto.LocalSigner) *Processor

//获取channelID

func channelID(env *cb.Envelope) (string, error)

//处理通道配置更新

func (p *Processor) Process(envConfigUpdate *cb.Envelope) (*cb.Envelope, error)

func (p *Processor) existingChannelConfig(envConfigUpdate *cb.Envelope, channelID string, support Support) (*cb.Envelope, error)

func (p *Processor) proposeNewChannelToSystemChannel(newChannelEnvConfig *cb.Envelope) (*cb.Envelope, error)

func (p *Processor) newChannelConfig(channelID string, envConfigUpdate *cb.Envelope) (*cb.Envelope, error)

//代码在orderer/configupdate/configupdate.go

```

 

#### 4.2.1、func New(systemChannelID string, supportManager SupportManager, signer crypto.LocalSigner) *Processor

 

```go

func New(systemChannelID string, supportManager SupportManager, signer crypto.LocalSigner) *Processor {

    support, ok := supportManager.GetChain(systemChannelID)

    return &Processor{

        systemChannelID:      systemChannelID,

        manager:              supportManager,

        signer:               signer,

        systemChannelSupport: support,

    }

}

//代码在orderer/configupdate/configupdate.go

```

 

#### 4.2.2、func (p *Processor) Process(envConfigUpdate *cb.Envelope) (*cb.Envelope, error)

 

```go

func (p *Processor) Process(envConfigUpdate *cb.Envelope) (*cb.Envelope, error) {

    channelID, err := channelID(envConfigUpdate)

    support, ok := p.manager.GetChain(channelID) //存在

    if ok {

        return p.existingChannelConfig(envConfigUpdate, channelID, support)

    }

    return p.newChannelConfig(channelID, envConfigUpdate) //不存在

}

//代码在orderer/configupdate/configupdate.go

```

 

#### 4.2.3、func (p *Processor) existingChannelConfig(envConfigUpdate *cb.Envelope, channelID string, support Support) (*cb.Envelope, error)

 

```go

func (p *Processor) existingChannelConfig(envConfigUpdate *cb.Envelope, channelID string, support Support) (*cb.Envelope, error) {

    configEnvelope, err := support.ProposeConfigUpdate(envConfigUpdate)

    return utils.CreateSignedEnvelope(cb.HeaderType_CONFIG, channelID, p.signer, configEnvelope, msgVersion, epoch)

}

//代码在orderer/configupdate/configupdate.go

```

 

#### 4.2.4、func (p *Processor) newChannelConfig(channelID string, envConfigUpdate *cb.Envelope) (*cb.Envelope, error)

 

```go

func (p *Processor) newChannelConfig(channelID string, envConfigUpdate *cb.Envelope) (*cb.Envelope, error) {

    ctxm, err := p.manager.NewChannelConfig(envConfigUpdate) //创建新的通道

    newChannelConfigEnv, err := ctxm.ProposeConfigUpdate(envConfigUpdate) //创建新的通道后处理通道配置

    newChannelEnvConfig, err := utils.CreateSignedEnvelope(cb.HeaderType_CONFIG, channelID, p.signer, newChannelConfigEnv, msgVersion, epoch)

    return p.proposeNewChannelToSystemChannel(newChannelEnvConfig)

}

//代码在orderer/configupdate/configupdate.go

```

 

## 5、详解configManager结构体

 

### 5.1、configManager结构体定义及方法

 

```go

type configManager struct {

    api.Resources

    callOnUpdate []func(api.Manager)

    initializer  api.Initializer

    current      *configSet

}

 

func validateConfigID(configID string) error

func validateChannelID(channelID string) error

func NewManagerImpl(envConfig *cb.Envelope, initializer api.Initializer, callOnUpdate []func(api.Manager)) (api.Manager, error)

func (cm *configManager) commitCallbacks()

func (cm *configManager) ProposeConfigUpdate(configtx *cb.Envelope) (*cb.ConfigEnvelope, error)

func (cm *configManager) proposeConfigUpdate(configtx *cb.Envelope) (*cb.ConfigEnvelope, error)

func (cm *configManager) prepareApply(configEnv *cb.ConfigEnvelope) (*configResult, error)

func (cm *configManager) Validate(configEnv *cb.ConfigEnvelope) error

func (cm *configManager) Apply(configEnv *cb.ConfigEnvelope) error

func (cm *configManager) ChainID() string

func (cm *configManager) Sequence() uint64

func (cm *configManager) ConfigEnvelope() *cb.ConfigEnvelope

 

func proposeGroup(result *configResult) error

func processConfig(channelGroup *cb.ConfigGroup, proposer api.Proposer) (*configResult, error)

func (cm *configManager) processConfig(channelGroup *cb.ConfigGroup) (*configResult, error)

 

func (c *configSet) verifyReadSet(readSet map[string]comparable) error

func ComputeDeltaSet(readSet, writeSet map[string]comparable) map[string]comparable

func validateModPolicy(modPolicy string) error

func (cm *configManager) verifyDeltaSet(deltaSet map[string]comparable, signedData []*cb.SignedData) error

func verifyFullProposedConfig(writeSet, fullProposedConfig map[string]comparable) error

//验证所有修改的配置都有相应的修改策略,返回修改过的配置的映射map[string]comparable

func (cm *configManager) authorizeUpdate(configUpdateEnv *cb.ConfigUpdateEnvelope) (map[string]comparable, error)

func (cm *configManager) policyForItem(item comparable) (policies.Policy, bool)

func (cm *configManager) computeUpdateResult(updatedConfig map[string]comparable) map[string]comparable

//Envelope转换为ConfigUpdateEnvelope

func envelopeToConfigUpdate(configtx *cb.Envelope) (*cb.ConfigUpdateEnvelope, error)

//代码在common/configtx/manager.go

```

 

### 5.2、func (cm *configManager) ProposeConfigUpdate(configtx *cb.Envelope) (*cb.ConfigEnvelope, error)

 

```go

func (cm *configManager) ProposeConfigUpdate(configtx *cb.Envelope) (*cb.ConfigEnvelope, error) {

    return cm.proposeConfigUpdate(configtx)

}

 

func (cm *configManager) proposeConfigUpdate(configtx *cb.Envelope) (*cb.ConfigEnvelope, error) {

    //Envelope转换为ConfigUpdateEnvelope

文中图片素材来源网络,如有侵权请联系删除

网上报名

热门信息

温馨提示