美文网首页区块链教程
兄弟连区块链教程Fabric1.0源代码分析consenter

兄弟连区块链教程Fabric1.0源代码分析consenter

作者: ab6973df9221 | 来源:发表于2018-10-30 17:16 被阅读1次

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

# Fabric 1.0源代码笔记 之 consenter(共识插件) #filter(过滤器)

## 1、filter概述

filter代码分布在orderer/common/filter、orderer/common/configtxfilter、orderer/common/sizefilter、orderer/common/sigfilter、orderer/multichain目录下。

orderer/common/filter/filter.go,Rule接口定义及emptyRejectRule和acceptRule实现,Committer接口定义及noopCommitter实现,RuleSet结构体及方法。

orderer/common/configtxfilter目录,configFilter结构体(实现Rule接口)及configCommitter结构体(实现Committer接口)。

orderer/common/sizefilter目录,maxBytesRule结构体(实现Rule接口)。

orderer/multichain/chainsupport.go,filter工具函数。

orderer/multichain/systemchain.go,systemChainFilter结构体(实现Rule接口)及systemChainCommitter结构体(实现Committer接口)。

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

### 2.1、Rule接口定义

```go

type Action int

const (

    Accept = iota

    Reject

    Forward

)

type Rule interface { //定义一个过滤器函数, 它接受、拒绝或转发 (到下一条规则) 一个信封

    Apply(message *ab.Envelope) (Action, Committer)

}

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

```

### 2.2、emptyRejectRule(校验是否为空过滤器)

```go

type emptyRejectRule struct{}

var EmptyRejectRule = Rule(emptyRejectRule{})

func (a emptyRejectRule) Apply(message *ab.Envelope) (Action, Committer) {

    if message.Payload == nil {

        return Reject, nil

    }

    return Forward, nil

}

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

```

### 2.3、acceptRule(接受过滤器)

```go

type acceptRule struct{}

var AcceptRule = Rule(acceptRule{})

func (a acceptRule) Apply(message *ab.Envelope) (Action, Committer) {

    return Accept, NoopCommitter

}

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

```

### 2.4、configFilter(配置交易合法性过滤器)

```go

type configFilter struct {

    configManager api.Manager

}

func NewFilter(manager api.Manager) filter.Rule //构造configFilter

//配置交易过滤器

func (cf *configFilter) Apply(message *cb.Envelope) (filter.Action, filter.Committer) {

    msgData, err := utils.UnmarshalPayload(message.Payload) //获取Payload

    chdr, err := utils.UnmarshalChannelHeader(msgData.Header.ChannelHeader) //获取ChannelHeader

    if chdr.Type != int32(cb.HeaderType_CONFIG) { //配置交易

        return filter.Forward, nil

    }

    configEnvelope, err := configtx.UnmarshalConfigEnvelope(msgData.Data) //获取configEnvelope

    err = cf.configManager.Validate(configEnvelope) //校验configEnvelope

    return filter.Accept, &configCommitter{

        manager:        cf.configManager,

        configEnvelope: configEnvelope,

    }

}

//代码在orderer/common/configtxfilter/filter.go

```

### 2.5、sizefilter(交易大小过滤器)

```go

type maxBytesRule struct {

    support Support

}

func MaxBytesRule(support Support) filter.Rule //构造maxBytesRule

func (r *maxBytesRule) Apply(message *cb.Envelope) (filter.Action, filter.Committer) {

    maxBytes := r.support.BatchSize().AbsoluteMaxBytes

    if size := messageByteSize(message); size > maxBytes {

        return filter.Reject, nil

    }

    return filter.Forward, nil

}

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

```

### 2.6、sigFilter(签名数据校验过滤器)

```go

type sigFilter struct {

    policySource  string

    policyManager policies.Manager

}

func New(policySource string, policyManager policies.Manager) filter.Rule //构造sigFilter

func (sf *sigFilter) Apply(message *cb.Envelope) (filter.Action, filter.Committer) {

    signedData, err := message.AsSignedData() //构造SignedData

    policy, ok := sf.policyManager.GetPolicy(sf.policySource) //获取策略

    err = policy.Evaluate(signedData) //校验策略

    if err == nil {

        return filter.Forward, nil

    }

    return filter.Reject, nil

}

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

```

### 2.7、systemChainFilter(系统链过滤器)

```go

type systemChainFilter struct {

    cc      chainCreator

    support limitedSupport

}

func newSystemChainFilter(ls limitedSupport, cc chainCreator) filter.Rule //构造systemChainFilter

func (scf *systemChainFilter) Apply(env *cb.Envelope) (filter.Action, filter.Committer) {

    msgData := &cb.Payload{}

    err := proto.Unmarshal(env.Payload, msgData) //获取Payload

    chdr, err := utils.UnmarshalChannelHeader(msgData.Header.ChannelHeader)

    if chdr.Type != int32(cb.HeaderType_ORDERER_TRANSACTION) { //ORDERER_TRANSACTION

        return filter.Forward, nil

    }

    maxChannels := scf.support.SharedConfig().MaxChannelsCount()

    if maxChannels > 0 {

        if uint64(scf.cc.channelsCount()) > maxChannels {

            return filter.Reject, nil

        }

    }

    configTx := &cb.Envelope{}

    err = proto.Unmarshal(msgData.Data, configTx)

    err = scf.authorizeAndInspect(configTx)

    return filter.Accept, &systemChainCommitter{

        filter:   scf,

        configTx: configTx,

    }

}

//代码在orderer/multichain/systemchain.go

```

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

### 3.1、Committer接口定义

```go

type Committer interface {

    Commit() //提交

    Isolated() bool //判断交易是孤立的块,或与其他交易混合的块

}

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

```

### 3.2、noopCommitter

```go

type noopCommitter struct{}

var NoopCommitter = Committer(noopCommitter{})

func (nc noopCommitter) Commit()        {}

func (nc noopCommitter) Isolated() bool { return false }

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

```

### 3.3、configCommitter

```go

type configCommitter struct {

    manager        api.Manager

    configEnvelope *cb.ConfigEnvelope

}

func (cc *configCommitter) Commit() {

    err := cc.manager.Apply(cc.configEnvelope)

}

func (cc *configCommitter) Isolated() bool {

    return true

}

//代码在orderer/common/configtxfilter/filter.go

```

### 3.4、systemChainCommitter

```go

type systemChainCommitter struct {

    filter   *systemChainFilter

    configTx *cb.Envelope

}

func (scc *systemChainCommitter) Isolated() bool {

    return true

}

func (scc *systemChainCommitter) Commit() {

    scc.filter.cc.newChain(scc.configTx)

}

//代码在orderer/multichain/systemchain.go

```

### 4、RuleSet结构体及方法

```go

type RuleSet struct {

    rules []Rule

}

func NewRuleSet(rules []Rule) *RuleSet //构造RuleSet

func (rs *RuleSet) Apply(message *ab.Envelope) (Committer, error) {

    for _, rule := range rs.rules {

        action, committer := rule.Apply(message)

        switch action {

        case Accept: //接受

            return committer, nil

        case Reject: //拒绝

            return nil, fmt.Errorf("Rejected by rule: %T", rule)

        default:

        }

    }

    return nil, fmt.Errorf("No matching filter found")

}

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

```

### 5、filter工具函数

```go

//为普通 (非系统) 链创建过滤器集

func createStandardFilters(ledgerResources *ledgerResources) *filter.RuleSet {

    return filter.NewRuleSet([]filter.Rule{

        filter.EmptyRejectRule, //EmptyRejectRule

        sizefilter.MaxBytesRule(ledgerResources.SharedConfig()), //sizefilter

        sigfilter.New(policies.ChannelWriters, ledgerResources.PolicyManager()), //sigfilter

        configtxfilter.NewFilter(ledgerResources), //configtxfilter

        filter.AcceptRule, //AcceptRule

    })

}

//为系统链创建过滤器集

func createSystemChainFilters(ml *multiLedger, ledgerResources *ledgerResources) *filter.RuleSet {

    return filter.NewRuleSet([]filter.Rule{

        filter.EmptyRejectRule, //EmptyRejectRule

        sizefilter.MaxBytesRule(ledgerResources.SharedConfig()), //sizefilter

        sigfilter.New(policies.ChannelWriters, ledgerResources.PolicyManager()), //sigfilter

        newSystemChainFilter(ledgerResources, ml),

        configtxfilter.NewFilter(ledgerResources), //configtxfilter

        filter.AcceptRule, //AcceptRule

    })

}

//代码在orderer/multichain/chainsupport.go

```

相关文章

网友评论

    本文标题:兄弟连区块链教程Fabric1.0源代码分析consenter

    本文链接:https://www.haomeiwen.com/subject/svagtqtx.html