Hyperledger Fabric学习(六)交易流程详解

        在Hyperledger Fabric学习(一)初识 中,简单的介绍了以下一次提案的提交流程,下面我们从源码来分析一些详细的流程:
图片
图片

  • 发送签名提案消息到Endorser背书节点请求处理:Client构造签名提案信息(SignedProposal类型),通过调用Endorser背书服务客户端的ProcessProposal()接口,提交消息到Endorser背书节点,请求模拟执行交易提案并签名背书;
  • Endorser背书节点模拟执行交易提案并签名背书:
    • 检查签名提案消息的格式合法性与签名有效性,包括通道头部、签名头部、签名域、交易ID、消息扩展域的ChaincodeId属性与PayloadVisibility可见性模式等;
    • 检查提案消息的创建者是否满足指定通道上的通道访问权限,即/Channel/Application/Writers写权限;
    • 检查并启动链码容器以模拟执行交易提案,并将模拟执行结果暂时保存在交易模拟器中,等待排序共识与交易验证,而不是直接更新到账本中。其中,交易模拟执行结果采用状态数据读写集(读数据的键和版本、写数据的键值)记录交易造成的状态变更结果;
    • 调用ESCC系统链码对该提案信息的模拟执行结果读写集等进行签名背书;
  • Endorser背书节点向客户端发送提案响应消息,并分发隐私数据明文。Endorser背书节点基于背书信息、模拟执行结果等构造提案响应消息(ProposalResponse类型),并回复给客户端。目前,模拟执行结果读写集包含公有数据(包括公共数据与隐私数据哈希值)与私有数据(或隐私数据)。其中,公有数据交由Orderer节点进行排序出块,再提交到账本区块数据文件,并广播到该通道上的所有节点。如果模拟执行结果中还存在有效的隐私数据明文,则Endorser背书节点通过Gossip消息协议将隐私数据明文发送给通道内授权的其他节点(由隐私数据集合配置的签名策略决定),交由transient隐私数据存储对象暂时保存到本地的transient隐私数据库(LevelDB),并在提交账本时存储到隐私数据库(LevelDB),同时清理transient隐私数据库中的过期数据;
  • 处理提案响应消息:Client解析Endorser背书节点回复的提案响应消息,获取背书结果并检查提案响应消息状态的合法性,以判断是否收集到了足够多的符合要求的背书签名信息;
  • 发送交易数据给Orderer服务节点请求排序:Client收集到足够多的符合要求的Endorser背书签名之后,基于模拟执行结果、背书签名等构造合法的签名交易信息(Envelope类型),通过Broadcast()服务接口将信息提交给Orderer节点,请求交易排序处理。其中,配置交易信息是不需要经过Endorser背书节点处理的;
  • Orderer服务节点对交易进行排序并构造新区块:Orderer排序节点提供Solo类型、Kafka类型等共识组件,对符合通道处理要求的合法交易信息(包括普通交易信息、配置交易信息等)进行排序并达成一致观点,对一段时间内接收到的一批交易信息按照打包交易的出块规则(出块周期时长、区块字节数限制、配置交易单独出块等)构造新区块,创建应用通道或更新通道配置,同时提交账本;
  • Leader节点请求Orderer服务节点发送通道账本区块:Leader主节点通过Deliver()服务接口代表组织从Orderer节点请求通道账本上所有的区块数据,并通过Gossip消息协议分发到组织内的其他Peer节点。如果请求的区块数据不存在,则Orderer节点默认阻塞等待,直到指定区块创建完成并提交账本,再将该区块发送给Leader主节点;
  • Committer记账节点验证交易并提交账本
    • 检查交易消息格式的正确性、签名合法性、交易内容是否篡改、消息头部的合法性等;
    • 调用VSCC系统链码,验证收集的签名背书结果是否符合指定的背书策略;
    • 对模拟结果中公有数据(含有公共数据与隐私数据哈希值等的区块数据)的读写集执行MVCC检查,针对单个键查询、键范围查询、隐私数据哈希值三种情况,检查读数据版本与交易时的账本是否一致,即是否存在读写冲突,并将存在冲突的交易标记为无效交易;
    • 验证模拟结果中隐私数据的正确性,遍历区块中有效交易的隐私数据读写集哈希值,取出对应交易的原始隐私数据读写集明文,重新计算其哈希值并对两者进行比较。如果完全相同,则说明该交易的隐私数据是真实有效的;
    • 数据写入
      • 保存所有的区块数据(公共数据部分)到区块数据文件中;
      • 保存所有的私有数据(transient隐私数据库部分)读写集到隐私数据库中;
      • 建立区块索引信息到区块索引数据库;
      • 将最新的有效交易数据(包含公共数据读写集、隐私数据读写集、隐私数据读写集哈希值)更新到状态数据库;
      • 将区块中经过Endorser背书的有效交易数据同步到历史数据库;
    • 清理transient隐私数据库中的过期数据;
  • Leader主节点分发数据与状态同步:Leader主节点基于Gossip消息协议将区块数据分发到组织内的其他节点上。同时,节点之间通过反熵算法等机制主动拉取缺失的数据(区块数据与隐私数据)、节点身份信息等,以确保组织内所有节点上的账本数据等信息保持同步;
  • 其他Committer记账节点(除了Leader主节点)验证交易并提交账本(同上);
发布了622 篇原创文章 · 获赞 150 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/feizaoSYUACM/article/details/104975204