培训首页  >  web前端新闻  >  兄弟连区块链教程policy(背书策略)

兄弟连区块链教程policy(背书策略)

[2018-11-07 17:08:03] 浏览量:209 来源:

北京兄弟连IT

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

 

```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

```

感谢关注兄弟连区块链教程分享!

 

文中图片素材来源网络,如有侵权请联系删除

网上报名

热门信息

温馨提示