# Fabric 1.0源代码笔记 之 policy(背书策略)
## 1、policy概述
policy代码分布在core/policy、core/policyprovider、common/policies目录下。目录结构如下:
* core/policy/policy.go,PolicyChecker接口定义及实现、PolicyCheckerFactory接口定义。
* core/policyprovider/provider.go,PolicyChecker工厂默认实现。
* common/policies目录
* policy.go,ChannelPolicyManagerGetter接口及实现。
* implicitmeta_util.go,通道策略工具函数。
## 2、PolicyChecker工厂
### 2.1、PolicyCheckerFactory接口定义
```go
type PolicyCheckerFactory interface {
NewPolicyChecker() PolicyChecker //构造PolicyChecker实例
}
var pcFactory PolicyCheckerFactory //全局变量定义及赋值函数
func RegisterPolicyCheckerFactory(f PolicyCheckerFactory) {
pcFactory = f
}
//代码在core/policy/policy.go
```
### 2.2、PolicyCheckerFactory接口默认实现
```go
type defaultFactory struct{}
//构造policy.PolicyChecker
func (f *defaultFactory) NewPolicyChecker() policy.PolicyChecker {
return policy.NewPolicyChecker(
peer.NewChannelPolicyManagerGetter(), //&channelPolicyManagerGetter{}
mgmt.GetLocalMSP(),
mgmt.NewLocalMSPPrincipalGetter(),
)
}
//获取policy.PolicyChecker,即调用policy.GetPolicyChecker()
func GetPolicyChecker() policy.PolicyChecker
func init() { //初始化全局变量pcFactory
policy.RegisterPolicyCheckerFactory(&defaultFactory{})
}
```
## 3、PolicyChecker接口定义及实现
### 3.1、PolicyChecker接口定义
```go
type PolicyChecker interface {
CheckPolicy(channelID, policyName string, signedProp *pb.SignedProposal) error
CheckPolicyBySignedData(channelID, policyName string, sd []*common.SignedData) error
CheckPolicyNoChannel(policyName string, signedProp *pb.SignedProposal) error
}
//代码在core/policy/policy.go
```
### 3.2、PolicyChecker接口实现
PolicyChecker接口实现,即policyChecker结构体及方法。
```go
type policyChecker struct {
channelPolicyManagerGetter policies.ChannelPolicyManagerGetter //通道策略管理器
localMSP msp.IdentityDeserializer //身份
principalGetter mgmt.MSPPrincipalGetter //委托人
}
//构造policyChecker
func NewPolicyChecker(channelPolicyManagerGetter policies.ChannelPolicyManagerGetter, localMSP msp.IdentityDeserializer, principalGetter mgmt.MSPPrincipalGetter) PolicyChecker
//检查签名提案是否符合通道策略
func (p *policyChecker) CheckPolicy(channelID, policyName string, signedProp *pb.SignedProposal) error
func (p *policyChecker) CheckPolicyNoChannel(policyName string, signedProp *pb.SignedProposal) error
//检查签名数据是否符合通道策略,获取策略并调取policy.Evaluate(sd)
func (p *policyChecker) CheckPolicyBySignedData(channelID, policyName string, sd []*common.SignedData) error
func GetPolicyChecker() PolicyChecker //pcFactory.NewPolicyChecker()
//代码在core/policy/policy.go
```
func (p *policyChecker) CheckPolicy(channelID, policyName string, signedProp *pb.SignedProposal) error代码如下:
```go
func (p *policyChecker) CheckPolicy(channelID, policyName string, signedProp *pb.SignedProposal) error {
if channelID == "" { //channelID为空,调取CheckPolicyNoChannel()
return p.CheckPolicyNoChannel(policyName, signedProp)
}
policyManager, _ := p.channelPolicyManagerGetter.Manager(channelID)
proposal, err := utils.GetProposal(signedProp.ProposalBytes) //获取proposal
header, err := utils.GetHeader(proposal.Header)
shdr, err := utils.GetSignatureHeader(header.SignatureHeader) //SignatureHeader
sd := []*common.SignedData{&common.SignedData{
Data: signedProp.ProposalBytes,
Identity: shdr.Creator,
Signature: signedProp.Signature,
}}
return p.CheckPolicyBySignedData(channelID, policyName, sd)
}
//代码在core/policy/policy.go
```
## 4、ChannelPolicyManagerGetter接口及实现
### 4.1、ChannelPolicyManagerGetter接口定义
```go
type ChannelPolicyManagerGetter interface {
Manager(channelID string) (Manager, bool)
}
//代码在common/policies/policy.go
```
### 4.2、ChannelPolicyManagerGetter接口实现
ChannelPolicyManagerGetter接口实现,即ManagerImpl结构体及方法。
```go
type ManagerImpl struct {
parent *ManagerImpl
basePath string
fqPrefix string
providers map[int32]Provider //type Provider interface
config *policyConfig //type policyConfig struct
pendingConfig map[interface{}]*policyConfig //type policyConfig struct
pendingLock sync.RWMutex
SuppressSanityLogMessages bool
}
type Provider interface {
NewPolicy(data []byte) (Policy, proto.Message, error)
}
type policyConfig struct {
policies map[string]Policy //type Policy interface
managers map[string]*ManagerImpl
imps []*implicitMetaPolicy
}
type Policy interface {
//对给定的签名数据,按规则检验确认是否符合约定的条件
Evaluate(signatureSet []*cb.SignedData) error
}
//构造ManagerImpl
func NewManagerImpl(basePath string, providers map[int32]Provider) *ManagerImpl
//获取pm.basePath
func (pm *ManagerImpl) BasePath() string
//获取pm.config.policies,即map[string]Policy中Key列表
func (pm *ManagerImpl) PolicyNames() []string
//获取指定路径的子管理器
func (pm *ManagerImpl) Manager(path []string) (Manager, bool)
//获取pm.config.policies[relpath]
//获取Policy
func (pm *ManagerImpl) GetPolicy(id string) (Policy, bool)
func (pm *ManagerImpl) BeginPolicyProposals(tx interface{}, groups []string) ([]Proposer, error)
func (pm *ManagerImpl) RollbackProposals(tx interface{})
func (pm *ManagerImpl) PreCommit(tx interface{}) error
func (pm *ManagerImpl) CommitProposals(tx interface{})
func (pm *ManagerImpl) ProposePolicy(tx interface{}, key string, configPolicy *cb.ConfigPolicy) (proto.Message, error)
//代码在common/policies/policy.go
```
```go
type implicitMetaPolicy struct {
conf *cb.ImplicitMetaPolicy
threshold int
subPolicies []Policy
}
//代码在common/policies/implicitmeta.go
```
## 5、通道策略工具函数
```go
type ImplicitMetaPolicy_Rule int32
const (
ImplicitMetaPolicy_ANY ImplicitMetaPolicy_Rule = 0 //任意
ImplicitMetaPolicy_ALL ImplicitMetaPolicy_Rule = 1 //所有
ImplicitMetaPolicy_MAJORITY ImplicitMetaPolicy_Rule = 2 //大多数
)
//代码在protos/common/policies.pb.go
```
```go
//构造cb.Policy
func ImplicitMetaPolicyWithSubPolicy(subPolicyName string, rule cb.ImplicitMetaPolicy_Rule) *cb.ConfigPolicy
func TemplateImplicitMetaPolicyWithSubPolicy(path []string, policyName string, subPolicyName string, rule cb.ImplicitMetaPolicy_Rule) *cb.ConfigGroup
//调取TemplateImplicitMetaPolicyWithSubPolicy(path, policyName, policyName, rule)
func TemplateImplicitMetaPolicy(path []string, policyName string, rule cb.ImplicitMetaPolicy_Rule) *cb.ConfigGroup
//任意,TemplateImplicitMetaPolicy(path, policyName, cb.ImplicitMetaPolicy_ANY)
func TemplateImplicitMetaAnyPolicy(path []string, policyName string) *cb.ConfigGroup
//所有,TemplateImplicitMetaPolicy(path, policyName, cb.ImplicitMetaPolicy_ALL)
func TemplateImplicitMetaAllPolicy(path []string, policyName string) *cb.ConfigGroup
//大多数,TemplateImplicitMetaPolicy(path, policyName, cb.ImplicitMetaPolicy_MAJORITY)
func TemplateImplicitMetaMajorityPolicy(path []string, policyName string) *cb.ConfigGroup
//代码在common/policies/implicitmeta_util.go
```

网址:http://www.qukuailianxueyuan.io/

欲领取造币技术与全套虚拟机资料

区块链技术交流QQ群:756146052  备注:CSDN

尹成学院微信:备注:CSDN

网址:http://www.qukuailianxueyuan.io/

欲领取造币技术与全套虚拟机资料

区块链技术交流QQ群:756146052  备注:CSDN

尹成学院微信:备注:CSDN

Fabric 1.0源代码分析(39) policy(背书策略)相关推荐

  1. Fabric 1.0源代码分析(34) Peer #peer chaincode命令及子命令实现

    # Fabric 1.0源代码笔记 之 Peer #peer chaincode命令及子命令实现 ## 1.peer chaincode install子命令实现(安装链码) ### 1.0.peer ...

  2. Fabric 1.0源代码分析(31) Peer

    # Fabric 1.0源代码笔记 之 Peer ## 1.Peer概述 在Fabric中,Peer(节点)是指在网络中负责接收交易请求.维护一致账本的各个fabric-peer实例.节点之间彼此通过 ...

  3. Fabric 1.0源代码分析(25) Orderer

    # Fabric 1.0源代码笔记 之 Orderer ## 1.Orderer概述 Orderer,为排序节点,对所有发往网络中的交易进行排序,将排序后的交易安排配置中的约定整理为块,之后提交给Co ...

  4. Fabric 1.0源代码分析(43) Tx(Transaction 交易)

    # Fabric 1.0源代码笔记 之 Tx(Transaction 交易) ## 1.Tx概述 Tx,即Transaction,交易或事务. Tx代码分布目录结构如下: * protos/commo ...

  5. Fabric 1.0源代码分析(41)putils(protos/utils工具包)

    # Fabric 1.0源代码笔记 之 putils(protos/utils工具包) ## 1.putils概述 putils,即protos/utils工具包,代码分布在:protos/utils ...

  6. Fabric 1.0源代码分析(42)scc(系统链码) #cscc(通道相关)

    # Fabric 1.0源代码笔记 之 scc(系统链码) #cscc(通道相关) ## 1.cscc概述 cscc代码在core/scc/cscc/configure.go. ## 2.PeerCo ...

  7. Fabric 1.0源代码分析(15)gossip(流言算法)

    # Fabric 1.0源代码笔记 之 gossip(流言算法) ## 1.gossip概述 gossip,翻译为流言蜚语,即为一种可最终达到一致的算法.最终一致的另外的含义就是,不保证同时达到一致. ...

  8. Fabric 1.0源代码分析(45)gRPC(Fabric中注册的gRPC Service)

    # Fabric 1.0源代码笔记 之 -gRPC(Fabric中注册的gRPC Service) Peer节点中注册的gRPC Service,包括: * Events Service(事件服务): ...

  9. Fabric 1.0源代码分析(32)Peer #peer根命令入口及加载子命令

    # Fabric 1.0源代码笔记 之 Peer #peer根命令入口及加载子命令 ## 1.加载环境变量配置和配置文件 Fabric支持通过环境变量对部分配置进行更新,如:CORE_LOGGING_ ...

  10. Fabric 1.0源代码分析(7)configtx(配置交易) #configtxgen(生成通道配置)

    # Fabric 1.0源代码笔记 之 configtx(配置交易) #configtxgen(生成通道配置) ## 1.configtxgen概述 configtxgen,用于生成通道配置,具体有如 ...

最新文章

  1. android 多个占位符,Android多语言支持:由于占位符计数不同导致的字符串格式问题...
  2. 技术系列课|AI驱动的超分辨技术应用现状
  3. spring boot项目Intellij 打包
  4. 人跟人的格局真的是不一样的
  5. 关于rnn神经网络的loss函数的一些思考
  6. 免费配音软件有哪些?分享三款好用的软件,帮你完成短视频配音
  7. 用hb编辑一个html,HBuilder:一个不错的web前端IDE(代码编辑器)
  8. 域中计算机改名,找不到网络路径,电脑加域失败提示”找不到网络路径”的解决办法...
  9. 2016年上半年系统集成中项4月6日作业
  10. 小目标检测--SNIP
  11. PTF渗透测试框架使用
  12. C语言中“=,^=,|=”分别表示什么意
  13. jQuery学习笔记总结
  14. NLP神经语言学的12条假设(不是自然语言处理哪个NLP哈)
  15. 【算法•日更•第十二期】信息奥赛一本通1585:【例 1】Amount of Degrees题解
  16. 代购系统、代购源码、代购程序、电商API、淘宝API开发
  17. Transform 被废弃,ASM 如何适配?
  18. sas模拟试验构建线性模型_在sas上构建一个有角度的Web应用程序
  19. 阿里云域名新办理证件实名认证无法通过注册局审核
  20. unity多人联机插件_Unity3D多人协作开发环境搭建

热门文章

  1. 爬虫爬取到百度首页html,python爬虫实战之爬取百度首页的方法
  2. 各行各业求职-招聘QQ群欢迎加入
  3. 原创教程:下载和安装Python3.9
  4. iOS 开发实践之Auto Layout(From Vincent Sit)
  5. 2019年最新个人所得税计算器(源码/网页版/已发布)
  6. 《UnityAPI.Color颜色》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Color+Lerp+RGBToHSV+gamma+linear+立钻哥哥++OK++)
  7. java面试常见知识点
  8. 网口压线顺序_网线水晶头接法顺序_网线水晶头接法口诀
  9. tibco rv java实例_java – 我不允许使用Tibco Rendezvous确认消息的任何原因?
  10. 通过lsyncd 设置两个linux(centOS7)服务器之间的目录文件互相实时同步