【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 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 