【fabric源码分析-orderer】 Deliver区块分发服务
2021-07-21 08:55:00   0  举报             
     
         
 基于fabric2.1源码 orderer向peer分发区块
    作者其他创作
 大纲/内容
 搜索最旧的区块, stopNum = number
  解析区块数据并返回deserializeBlock(nextBlockBytes)
  SeekPosition_Newest
  监听协程里传递的信号,case错误消息
  调用fl.blockStore.RetrieveBlocks创建指定区块存储对象上的区块迭代器(blocksItrl类型)
    调用itr.initStream()初始化指定区块号的区块数据文件流 (blockStream类型)
  否
  将结束区块号stopNum 设置为seekinfo指定结束高度
  Next()
  检查获取区块的区块号是否达到结束区块号达到结束循环
  获取迭代器和开始区块
  SeekPosition_Specified
  将起始区块号startingBlockNumber设置为seekInfo指定起始高度
  解析seekInfo.Start的类型,获得不同的开始区块号
  sf.Apply() 1.从chain里获得orderer配置2.从env里会的签名数据signedData3.根据当前共识状态,确定是选择正常模式/维护模式对应的策略policy4.调用policy.EvaluateSignedData(signedData)完成策略检查5.返回err或nil
  8
  解析seekInfo.Stop的类型,获得不同的结束区块号
  status != cb.Status_SUCCESS
  根据chain和配置策略,初始化一个SigFilter结构体   创建消息过滤器sf
  调用srv.SendBlockResponse将取得的区块发送给客户端
  创建一个Deliver服务器,将policyChecker和srv(deliver监听服务)封装进去
  获取结束区块号
  调用sf.Apply(env) 进行消息检查返回err或nil
  等待区块创建成功,返回该区块号
  搜索最新的区块stopNum = chain.Reader.Height-1
  根据通道名称,获得对应的chain (ChainSupport类型)
  9.循环读取和发送获得的区块,直到到达结束区块 
  SeekPosition_Oldest
  调用itr.waitForBlock()主动阻塞程序直到Orderer节点提交指定的区块数据才继续执行
  请求的区块号>本地账本最大区块号
  如果该区块号小于请求的区块号blockNum且迭代器未关闭,则说明指定请求的区块还没有被创建
  9
  Handle()
  orderer/common/server/server.go
  搜索最新的区块,将起始区块号startingBlockNumber设置为当前账本高度-1
  定义了策略检查器方法policyChecker
  itr.stream.nextBlockBytes()获取下一个区块的字节数组
  搜索最旧的区块,将起始区块号startingBlockNumber设置为0
  deliverBlocks() 1.获得客户端地址addr2.解析信封数据payload并检测有效性3.根据通道名称,或者对应的通道管理器4.从payload读取数据,构建区块搜索信息seekInfo5.根据policyChecker,创建一个ACL6.检查策略和证书有效性7.检查seek参数有效性8.根据seekInfo获取区块迭代器和开始、结束区块号9.循环读取和发送获得的区块,直到到达结束区块10.返回结果码Status_SUCCESS和error内容 nil
  调用itr.mgr.cpInfoCond.Wait()阻塞等待区块文件管理器mgr上的同步条件变量cpInfoCond,直到有新区块提交到账本,重新唤醒该变量通知本方法
  再次检查权限获得签名数据
  生活不易,请支持一下
  Deliver(srv)
  itr.blockNumToRetrieve++ //指定获取的区块号增1
  number++  //区块计数增1
  是
   
 
 
 
 
  0 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 