博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
区块链教程Fabric1.0源代码分析consenter#filter
阅读量:7193 次
发布时间:2019-06-29

本文共 7060 字,大约阅读时间需要 23 分钟。

  区块链教程之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接口定义

type Action intconst (    Accept = iota    Reject    Forward)type Rule interface { //定义一个过滤器函数, 它接受、拒绝或转发 (到下一条规则) 一个信封    Apply(message *ab.Envelope) (Action, Committer)}//代码在orderer/common/filter/filter.go

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

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(接受过滤器)

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(配置交易合法性过滤器)

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(交易大小过滤器)

type maxBytesRule struct {    support Support}func MaxBytesRule(support Support) filter.Rule //构造maxBytesRulefunc (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(签名数据校验过滤器)

type sigFilter struct {    policySource  string    policyManager policies.Manager}func New(policySource string, policyManager policies.Manager) filter.Rule //构造sigFilterfunc (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(系统链过滤器)

type systemChainFilter struct {    cc      chainCreator    support limitedSupport}func newSystemChainFilter(ls limitedSupport, cc chainCreator) filter.Rule //构造systemChainFilterfunc (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接口定义

type Committer interface {    Commit() //提交    Isolated() bool //判断交易是孤立的块,或与其他交易混合的块}//代码在orderer/common/filter/filter.go

3.2、noopCommitter

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

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

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结构体及方法

type RuleSet struct {    rules []Rule}func NewRuleSet(rules []Rule) *RuleSet //构造RuleSetfunc (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工具函数

//为普通 (非系统) 链创建过滤器集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

转载于:https://blog.51cto.com/14041296/2310752

你可能感兴趣的文章
PHP语言 -- 会话
查看>>
HDU1151Air Raid(二分图的最大匹配)
查看>>
Spring|注解
查看>>
HMC5883 3轴磁阻测方位角
查看>>
自定义控件,开关左右滑动
查看>>
angular表单验证
查看>>
jQuery-图片放大镜
查看>>
开始写笔记,学习win8开发,争取做一个独立软件开发者
查看>>
《深入浅出WPF》笔记——绘画与动画
查看>>
Ubuntu开启ssh服务2
查看>>
oracle-复杂sql模板
查看>>
FRM-41839:在临时记录缓冲区文件/tmp/26alya. tmp中磁盘的输入/输入错误
查看>>
在PowerDesigner中设计物理模型2——约束
查看>>
【WP7】关于Build Action
查看>>
【SQL语法】系列12:BETWEEN 操作符
查看>>
java uuid 例子
查看>>
Snort 2.9.4.0 发布,入侵检测系统
查看>>
6.包含多个段的程序
查看>>
初中三年(1995-1998,笑傲江湖)
查看>>
php mysql与mysqli 区别
查看>>