本文共 6720 字,大约阅读时间需要 22 分钟。
区块链教程Fabric1.0源代码分析policy(背书策略),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。
policy代码分布在core/policy、core/policyprovider、common/policies目录下。目录结构如下:
type PolicyCheckerFactory interface { NewPolicyChecker() PolicyChecker //构造PolicyChecker实例}var pcFactory PolicyCheckerFactory //全局变量定义及赋值函数func RegisterPolicyCheckerFactory(f PolicyCheckerFactory) { pcFactory = f}//代码在core/policy/policy.go
type defaultFactory struct{}//构造policy.PolicyCheckerfunc (f *defaultFactory) NewPolicyChecker() policy.PolicyChecker { return policy.NewPolicyChecker( peer.NewChannelPolicyManagerGetter(), //&channelPolicyManagerGetter{} mgmt.GetLocalMSP(), mgmt.NewLocalMSPPrincipalGetter(), )}//获取policy.PolicyChecker,即调用policy.GetPolicyChecker()func GetPolicyChecker() policy.PolicyCheckerfunc init() { //初始化全局变量pcFactory policy.RegisterPolicyCheckerFactory(&defaultFactory{})}
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
PolicyChecker接口实现,即policyChecker结构体及方法。
type policyChecker struct { channelPolicyManagerGetter policies.ChannelPolicyManagerGetter //通道策略管理器 localMSP msp.IdentityDeserializer //身份 principalGetter mgmt.MSPPrincipalGetter //委托人}//构造policyCheckerfunc NewPolicyChecker(channelPolicyManagerGetter policies.ChannelPolicyManagerGetter, localMSP msp.IdentityDeserializer, principalGetter mgmt.MSPPrincipalGetter) PolicyChecker//检查签名提案是否符合通道策略func (p *policyChecker) CheckPolicy(channelID, policyName string, signedProp *pb.SignedProposal) errorfunc (p *policyChecker) CheckPolicyNoChannel(policyName string, signedProp *pb.SignedProposal) error//检查签名数据是否符合通道策略,获取策略并调取policy.Evaluate(sd)func (p *policyChecker) CheckPolicyBySignedData(channelID, policyName string, sd []*common.SignedData) errorfunc GetPolicyChecker() PolicyChecker //pcFactory.NewPolicyChecker()//代码在core/policy/policy.go
func (p policyChecker) CheckPolicy(channelID, policyName string, signedProp pb.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
type ChannelPolicyManagerGetter interface { Manager(channelID string) (Manager, bool)}//代码在common/policies/policy.go
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}//构造ManagerImplfunc NewManagerImpl(basePath string, providers map[int32]Provider) *ManagerImpl//获取pm.basePathfunc (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]//获取Policyfunc (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{}) errorfunc (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
type ImplicitMetaPolicy_Rule int32const ( ImplicitMetaPolicy_ANY ImplicitMetaPolicy_Rule = 0 //任意 ImplicitMetaPolicy_ALL ImplicitMetaPolicy_Rule = 1 //所有 ImplicitMetaPolicy_MAJORITY ImplicitMetaPolicy_Rule = 2 //大多数)//代码在protos/common/policies.pb.go
//构造cb.Policyfunc ImplicitMetaPolicyWithSubPolicy(subPolicyName string, rule cb.ImplicitMetaPolicy_Rule) *cb.ConfigPolicyfunc 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
转载于:https://blog.51cto.com/14041296/2313968