【fabric源码--peer】交易验证器--VSCC验证交易
2021-07-20 14:04:32 0 举报
基于fabric2.1源码 关于vscc验证的相关流程
作者其他创作
大纲/内容
判断len(lsccrwset.Writes) == 1否则报错
否
判断是否包含隐私数据
vscc.extractValidationArtifacts构建验证工件va
10
判断链码已经存在并检查版本是否匹配
dep.signalDepInserted() 关闭depInserted 表示我们已经为这个事务引入了所有的依赖项
v.txWritesToNamespace(ns)检查是否存在写集合KVWrite列表
是
!IsSysCC(ccID)
case lscc.DEPLOY:
循环结束
return nil
VSCCValidateTx
1.vCtx := m.validationCtx.forBlock(blockNum)获取上下文2.dep := vCtx.getOrCreateDependencyByTxnum(txNum)获取该交易对应的依赖3.rwset.FromProtoBytes(rwsetBytes)解析出交易读写集(集合)
vCtx.getOrCreateDependencyByTxnum(txNum)获取对应依赖dep
验证结束return nil
VSCCValidateTxForCC-->v.pluginValidator.ValidateWithPlugin(ctx)1.pv.getOrCreatePlugin(ctx)获得对应的插件,即默认的VSCCPlugin2.调用plugin.Validate()3.return err
vscc.stateBasedValidator.PreValidate更新依赖
1
4
1.如果不存在,添加对应ccID的NameSpace到wrNamespace2.如果ns.NameSpace == \"lscc\
1.chainID := v.channelID设置通道id2.获取消息头部扩展项hdrExt3.解析获取通道头部数据chdr4.设置lscc系统链码写数据标志位为默认false5.设置不可被调用的系统链码写数据标志位为false6.调用GetActionFromEnvelope(envBytes)获得respPayload7.txRWSet.FromProtoBytes()获取交易结果读写集列表 (解析获得转换后的模拟执行结果读写集txRWSet.NsRwSets)8.检查ChaincodeId合法性(不为0)9.获取调用链码的名称和版本10.检查消息头部中链码名称合法性(不为0)11.检查消息头部扩展项中与链码提案消息负载中的链码名称是否匹配12.检查链码提案消息负载中链码版本的合法性(不为0)13.创建namespaces字典
调用m.validationCtx.forBlock(blockNum)获得vCtx
遍历读写集得到单个交易对应读写集rws1.遍历rws里的写元数据得到mw调用vCtx.addDependency,记录这个mw.key有一个依赖在我们的交易里2.遍历 range rws.CollHashedRwSets 获得cw2.1遍历cw.HashedRwSet.MetadataWrites获得mw2.2调用vCtx.addDependency 记录私有数据key有一个依赖在我们的交易里
这里后续流程与标记1处相同,不再描述
判断链码未实例化过
如果不可从外部调用的系统链码标志位为true返回报错TxValidationCode_ILLEGAL_WRITESET类型
switch lsccFunc
1.调用pp.NewPolicy(policyBytes)获取对应背书策略policy2.调用 policy.EvaluateSignedData(signatureSet)并返回结果
vscc.validateRWSetAndCollection对隐私数据进行额外的验证
vscc.stateBasedValidator.Validate开始验证
1.遍历读写集中的所有写操作,遍历出属于目标ns的读写集2.判断是否存在键级背书策略及是公共数据还是私有数据,生成不同的参数。调用p.checkSBAndCCEP对目标数据进行写数据验证
循环读取wrNamespace获得获得ns 根据链码背书策略验证写集合
1.将背书节点绑定对应的提案响应prp及背书签名,构建签名集合signatureSet2.policyEvaluator := klv.pef.Evaluator(ccEP)构建策略检查器对象3.rwset.FromProtoBytes(rwsetBytes)解析读写集4.policyEvaluator.Evaluate开始验证并将结果作为返回值返回
core\\handlers\\validation\\builtin\\v13\\validation_logic.go
core\\committer\\txvalidator\\v14\\vscc_validator.go
1调用policies.SignatureSetToValidIdentities验证签名对消息有效,并返回对应的msp身份2.p.EvaluateIdentities(ids)检查签名身份是否满足策略2.1 执行p.evaluator,调用NewPolicy设置的回调函数,来检查是否满足策略
如果lscc系统链码写数据标志位或不可被调用的系统链码写数据标志位为true返回报错TxValidationCode_ILLEGAL_WRITESET类型
cdRWSet.InstantiationPolicy解析出写集里包含的背书策略pol
checkInstantiationPolicy解析出写集里包含的背书策略pol
case lscc.UPGRADE
与更新依赖时解析的项目相同,将其作为参数构建为validationArtifacts结构体并返回
2
vscc.checkInstantiationPolicy检查是否满足初始化背书策略
d.validationResultMap[ns] = err记录ns验证结果
7
vscc.ValidateLSCCInvocation执行一些特定于lscc的额外验证
标记1
vscc.stateBasedValidator.PostValidate传递验证结果
遍历交易并执行extractDependenciesForTx提取交易的依赖
遍历交易结果读写集列表
0 条评论
回复 删除
下一页