区块链教程Fabric1.0源代码分析consenter#filter-兄弟连
区块链教程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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
区块链教程Fabric1.0源代码分析configtx#genesis-兄弟连
区块链教程Fabric1.0源代码分析configtx#genesis,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 Fabric 1.0源代码笔记 之 configtx(配置交易) #genesis(系统通道创世区块) 1、genesis概述 genesis,即创世区块,此处特指系统通道的创世区块。相关代码在common/genesis/genesis.go,即Factory接口及实现。 2、Factory接口定义 type Factory interface { Block(channelID string) (*cb.Block, error) } //代码在common/genesis/genesis.go 3、Factory接口实现 msgVersion = int32(1) epoch = 0 type factory struct { template configtx.Template } func NewFactoryImpl(tem...
- 下一篇
实战Jmeter压测Dubbo服务接口
一、前言 最近在做一些业务上云的项目,其中远程Rpc调用方式我们选择了Dubbo,为便于收集压测信息,我们选择了使用Jmeter来做压测工具,本文就来简单介绍如何使用Jmeter压测Dubbo服务接口,以及需要注意的事情。 二、Jmeter使用 2.1 下载Jmeter 在 https://jmeter.apache.org/download_jmeter.cgi 下载二进制包下载后解压缩后,目录如下: 2.2 界面模式启动 进入解压目录的bin目录,然后mac下执行 sh jmeter.sh ,如下图: 然后就会弹出界面: 2.3 项目中引入Jmeter依赖 <dependency> <groupId>org.apache.jmeter</groupId>
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块