区块链教程 Fabric1.0 源代码分析 policy(背书策略),2018 年下半年, 区块链行业正逐渐褪去发展之初的浮躁, 回归理性, 表面上看相关人才需求与身价似乎正在回落. 但事实上, 正是初期泡沫的渐退, 让人们更多的关注点放在了区块链真正的技术之上.
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 接口定义
- type PolicyCheckerFactory interface {
- ????NewPolicyChecker() PolicyChecker // 构造 PolicyChecker 实例
- }
- var pcFactory PolicyCheckerFactory // 全局变量定义及赋值函数
- func RegisterPolicyCheckerFactory(f PolicyCheckerFactory) {
- ????pcFactory = f
- }
- // 代码在 core/policy/policy.go
2.2,PolicyCheckerFactory 接口默认实现
- 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 接口定义
- 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 结构体及方法.
- 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, signedProppb.SignedProposal) error 代码如下:
- 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 接口定义
- type ChannelPolicyManagerGetter interface {
- ????Manager(channelID string) (Manager, bool)
- }
- // 代码在 common/policies/policy.go
4.2,ChannelPolicyManagerGetter 接口实现
ChannelPolicyManagerGetter 接口实现, 即 ManagerImpl 结构体及方法.
- 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
- type implicitMetaPolicy struct {
- ????conf *cb.ImplicitMetaPolicy
- ????threshold int
- ????subPolicies []Policy
- }
- // 代码在 common/policies/implicitmeta.go
5, 通道策略工具函数
- 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
- // 构造 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.bubuko.com/infodetail-2838377.html