您现在的位置是:首页 > 文章详情

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

日期:2018-10-29点击:311

区块链教程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 int const (     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 //构造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(签名数据校验过滤器)

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(系统链过滤器)

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接口定义

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 //构造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工具函数

//为普通 (非系统) 链创建过滤器集 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://yq.aliyun.com/articles/659779
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章