客户端将交易预提案(Transaction Proposal)通过 gRPC 发送给支持 Endorser 角色的 Peer 进行背书。

这些交易提案可能包括链码的安装、实例化、升级、调用、查询;以及 Peer 节点加入和列出通道操作。

Peer 接收到请求后,会调用 core/endorser/endorser.go 中 Endorser 结构体 的ProcessProposal(ctx context.Context, signedProp *pb.SignedProposal) (*pb.ProposalResponse, error) 方法,进行具体的背书处理。

背书过程主要完成如下操作:

  • 检查提案消息的合法性,以及相关的权限;
  • 模拟执行提案:启动链码容器,对世界状态的最新版本进行临时快照,基于它执行链码,将结果记录在读写集中;
  • 对提案内容和读写集合进行签名,并返回提案响应消息。

整体过程

主要过程如下图所示。

  • 检查提案合法性;

    • 调用 ValidateProposalMessage() 方法对签名的提案进行格式检查,主要包括:

      • Channel 头部格式:是否合法头部类型,由 validateChannelHeader() 完成;
      • 签名头格式:是否包括了 nonce 和creators 数据,由 validateSignatureHeader() 完成;
      • 签名域:creator 证书 MSP 检查是否合法,签名是否正确,由 checkSignatureFromCreator() 完成。
    • 如果是系统链码调用(SCC),检查是否是允许从外部调用的三种 SCC 之一:cscc、lscc、qscc 或 rscc;
    • 如果 chainID 不为空,获取对应 chain 的账本结构,并检查 TxID 唯一性,确保同一交易未曾提交到账本结构中;
    • 对于用户链码调用,需要检查 ACL:资源为 PROPOSE,默认策略是签名提案者在通道上拥有写权限(CHANNELWRITERS)。
  • 模拟执行提案
    • 如果 chainID 不为空,获取对应账本的交易模拟器(TxSimulator)和历史查询器(HistoryQueryExecutor),这两个结构将在后续执行链码时被使用。
    • 如果 chainID 不为空,调用 simulateProposal() 方法获取模拟执行的结果,检查返回的响应 response 的状态,若不小于错误 500 则创建并返回一个失败的 ProposalResponse。
  • 对提案内容和读写集合进行签名
    • chainID 非空情况下,调用 endorseProposal() 方法利用 ESCC,对之前得到的模拟执行的结果进行背书。返回 ProposalResponse,检查 simulateProposal 返回的response 的状态,若不小于错误阈值 400(被背书节点反对),返回 ProposalResponse 及链码错误 chaincodeError(endorseProposal 里有检查链码执行结果的状态,而 simulateProposal 没有检查)。
    • 将 response.Payload 赋给 ProposalResponse.Response.Payload(因为 simulateProposal 返回的 response 里面包含链码调用的结果)。
    • 返回响应消息 ProposalResponse。

simulateProposal 方法

simulateProposal 方法会通过执行链码逻辑来获取对状态的修改结果,并存放到读写集合中,主要过程如下:

  • 从提案结构的载荷中提取 ChaincodeInvocationSpec 结构,其中包含了所调用链码(包括系统链码和用户链码)的路径、名称和版本,以及调用时传入的参数列表;
  • 检查 ESCC 和 VSCC(尚未实现);
  • 对用户链码,检查提案中的实例化策略跟账本上记录的该链码的实例化策略(安装链码时指定)是否一致。防止有人修改权限在其它通道非法实例化。
  • 调用 callChaincode() 方法执行 Proposal,返回 Response 和 ChaincodeEvent。
    • 调用 core.endorser 包中 SupportImpl.Execute() 方法,该方法主要调用 core.chaincode 包中的 ExecuteChaincode() 方法,进一步调用包内的 Execute() 方法。调用过程中会把交易模拟器和历史查询器通过上下文结构体传入后续子方法。
    • Execute() 方法会调用 ChaincodeSupport.Launch() 方法创建并启动链码容器。启动成功后创建链码 gRPC 消息,通过 ChaincodeSupport.Execute() 方法发送消息给 CC 容器,执行相关的合约,并返回执行响应(ChaincodeMessage 结构)。此过程中会将读写集记录到交易模拟器结构体中。
  • 对于非空 chainID(大部分跟账本相关的操作),执行 GetTxSimulationResults() 拿到执行结果 TxSimulationResults结构,从中可以解析出读写集数据。
  • 最终返回链码标准数据结构 ChaincodeDefinition、响应消息 ChaincodeMessage、交易读写集 PubSimulationResults、链码事件 ChaincodeEvent。

endorseProposal 方法

主要过程如下:

  • 获取被调用的链码指定的背书链码的名字。
  • 通过 callChaincode() 实现对背书链码的调用,返回响应 response(对 ESCC 的调用同样也会产生 simulation results,但 ESCC 不能背书自己产生的simulation results,需要背书最初被调用的链码产生的 simulation results)。
  • 检查 response.Status,是否大于等于 400(错误阈值),若是则把 response 赋给 proposalResponse.Response 并返回 proposalResponse。
  • 将 response.Payload解码后(ProposalResponse类型)返回。

callChaincode 方法

主要过程如下:

  • 判断交易模拟器,不为空则把它加入到Context的K-V存储中。
  • 判断被call的cc是不是系统链码,创建CCContext(包含通道名、链码名、版本号、交易ID、是否 SCC、签名 Prop、Prop)
  • 调用 core/chaincode/chaincodeexec.go 下的 ExecuteChaincode(),返回响应 response 和 事件ccevent。
  • 返回 response和ccevent。

来源:https://github.com/yeasy/hyperledger_code_fabric/blob/master/process/chaincode_start.md

转载于:https://www.cnblogs.com/huahuayu/p/8438602.html

Hyperledger Fabric Transaction Proposal过程相关推荐

  1. Hyperledger Fabric从源码分析背书提案过程

    在之前的文章中 Hyperledger Fabric从源码分析链码安装过程 Hyperledger Fabric从源码分析链码实例化过程 Hyperledger Fabric从源码分析链码查询与调用 ...

  2. HyperLedger Fabric 1.0的Transaction处理流程

    如果把区块链比作一个只能读写,不能删改的分布式数据库的话,那么事务和查询就是对这个数据库进行的最重要的操作.以比特币来说,我们通过钱包或者Blockchain.info进行区块链的查询操作,而转账行为 ...

  3. Hyperledger Fabric的test-network启动过程Bash源码详解

    前言 在基于Debian搭建Hyperledger Fabric 2.4开发环境及运行简单案例中,我们已经完成了Fabric 2.4的环境搭建及fabric-samples/test-network官 ...

  4. Hands-On Hyperledger Fabric——Byzantine-fault tolerant(BFT)过程详解

    文章目录 拜占庭问题描述 分布式架构遭遇的问题 Practical Byzantine Fault Tolerance(PBFT) PBFT过程详解 拜占庭问题描述 拜占庭将军问题是分布式计算中的一个 ...

  5. Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(一)

    前言 本文主要目的是用于整理Hyperledger  Fabric中关于chaincode 管理和操作的内容,作者以release-1.2为范本进行讲解. 主要参考链接: https://hyperl ...

  6. Hyperledger Fabric 词汇表

    Anchor Peer 在channel中每一个组织都有一个AnchorPeer,用于在不同的组织之间通过Gossip协议进行数据分发和同步. Block(块) 与channel上的前一个块加密链接的 ...

  7. Hyperledger Fabric 1.0 实战开发系列 第三课 chaincode开发

    chaincode是由go语言写的,实现了定义的接口.其他语言例如JAVA也是支持的.通过application体积的transaction,chaincode可以初始化并管理Ledger状态. 一个 ...

  8. Hyperledger Fabric on SAP Cloud Platform(SAP云平台上的超级账本简介)

    今天的文章来自Wen Aviva, 坐Jerry面对面的程序媛. Jerry在之前的公众号文章<在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图>已经介绍过Aviva ...

  9. Hyperledger fabric学习笔记(一)

    原文链接:https://blog.csdn.net/zhanglingge/article/details/106012703 fabric分为底层的网络层.权限管理模块.区块链应用模块,通过SDK ...

  10. 区块链开源实现hyperledger fabric架构详解

    hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM.Intel.各大银行等贡献,目前v1.1版的kafka共识方式可达到1000/s次的吞吐量.本文中我们依次讨论:区块链 ...

最新文章

  1. otf和ctf的意义_光学信息技术原理及应用 OTF与CTF的比较与计算.ppt
  2. 数据结构源码笔记(C语言):二分查找
  3. configurablebeanfactory
  4. pc 图片预览放大 端vue_企业为什么需要建设PC+手机微信三合一全网营销的网站呢...
  5. python倒排索引实现_倒排索引原理和实现 - uncle_LLD的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. C++学习之路 | PTA乙级—— 1014 福尔摩斯的约会 (20分)(精简)
  7. math for programmers(转载)
  8. C++语言(11)——C++类成员函数调用分析
  9. MySQL数据丢失情况分析
  10. VBA新手教程:抽卡模拟实战(3)
  11. 分享:Tuts4you社区,脱壳教程全集.1.5G
  12. 设置Win10防火墙规则,使得局域网能访问此电脑的Tomcat服务器
  13. Android动态更改通知图标,修改通知标志  |  Android 开发者  |  Android Developers
  14. mysql数据导入报错1265
  15. randon变换(拉东变换)
  16. win10 3D查看器glb和3mf格式模型
  17. 【JAVA 求差集】
  18. Java小白的数据库爱情(四)Oracle DDL、DML使用
  19. 新人想要做好视频号;一下几点一定要明白。
  20. 华擎主板简直在开玩笑

热门文章

  1. 咱用AppDesigner开发复现了一款我国古老的桌游 —【升官图】
  2. C - One-dimensional Japanese Crossword CodeForces - 721A
  3. 记忆碎片之python爬虫APP数据爬取fiddler抓包及多线程爬取流程分析(四)
  4. Haproxy服务监控
  5. Ubuntu 18.04 究极美化教程
  6. 计算机换色带技巧,安装与更换针式打印机的色带的详细方法(图文教程)
  7. 圆排列公式推导_数学广角早在公元三世纪,我国数学家刘徽为推导圆的面积公式而发明了 爱问知识人...
  8. SGX Enable
  9. 博图——HMI中的中英文切换功能
  10. 如何查看手机上已连接 WIFI 的密码