【fabric源码--peer】交易提交器
2021-07-20 13:59:57 0 举报
基于fabric2.1源码 描述了fabric里的交易提交到各个不同的数据库(本地、历史、状态)前的处理。
作者其他创作
大纲/内容
F
更txsFilter为新的索引
开启一个for循环遍历block里的每个交易tx
GetPvtDataByBlockNum经此查询方法获得
从block里获取交易验证码列表txsFilter
根据kvwrite.IsDelete标志位,分别调用pvtUpdateBatch.Put或pvtUpdateBatch.Delete将隐私数据更新到pvtUpdateBatch中
遍历所有交易,更新对应的验证码到txsFilter中
账本提交器--提交数据到本地账本 流程图
return nil
调用 blockStore.CommitWithPvtData()//负责执行具体的账本提交工作 提交区块和隐私数据到账本中
调用 txtmgmt.ValidateAndPrepare()//验证和预解析pvtdataAndBlock区块和隐私数据对象
账本提交器--提交数据状态数据库 流程图
是
1.根据区块号从区块中获得私有数据txPvtData2.数组转map,txPvtData转为PvtData3.将pvtdataAndBlock.PvtData更新为PvtData
否
1.从block里获取交易验证码列表txsFilter2.过滤掉无效交易,更新每笔交易对应的验证码到txsStatInfo上3.构建UpdateBatch对象(包含pvtUpdates)并和txsStatInfo一起返回
1
CommitLegacy(pvtdataAndBlock)
rwsetutil.TxPvtRwSetFromProtoMsg(txPvtdata.WriteSet)解析隐私数据写集合为pvtRWSet
1.验证交易验证码,跳过无效交易2.tx.ContainsPvtWrites()查看交易写集,跳过没有隐私数据写集的交易3.从pvtdata数组获取指定交易的隐私数据txPvtdata4.跳过跳过隐私数据为nil的交易
T
循环结束
core/ledger/kvledger/kv_ledger.go
addPvtRWSetToPvtUpdateBatch()添加到隐私数据更新批量操作
txmgr.invokeNamespaceListeners()//请求执行名字空间监听器
循环遍历区块里的每一个集合名称collKey
是否要从本地存储里获取私有数据
preprocessProtoBlock()区块对象(common.Block类型)转换为内部区块结构internalBlock(valinternal.Block类型//预处理构造内部区块)并获得交易信息集合txStatInfo
调用l.txtmgmt.Commit()//更新有效交易到状态数据库
1.pvtdataAndBlock.Block 获取区块对象block2.pvtdataAndBlock.Block.Header.Number获取区块号blockNo
遍历隐私数据txPvtdata包含的隐私数据读写集collPvtdata.Rwset1. util.ComputeHash(collPvtdata.Rwset) 计算hash值collPvtdataHash2.从交易里获取hash并与collPvtdataHash进行对比,不一致则报错3.return nil
账本提交器--提交数据到历史数据库 流程图
调用l.historyDB.Commit()//更新区块交易到历史数据库
调用DeterministicBytesForPubAndHashUpdates(batch)获得updateBytes
l.updateBlockStats()更新区块状态return nil
0 条评论
下一页