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