1.系统架构
上层为应用程序层,下层为区块链底层,中间为应用程序层与底层交互的媒介。
1)应用程序层
API 表示fabric 为应用程序提供的标准 gRPC 接口,SDK表示fabric为不同语言封装了不同的SDK,事件表示fabric用异步通信的模式进行
开发,我们可以在链码里面定义某些事件,然后通过应用程序去监听,当某个事件被触发时,我们就可以调用预先定义的合约函数。
2)媒介层
身份管理:任何服务请求必须通过身份认证才能进行,身份服务依托于底层的成员服务。提供准入控制,具体来说是能与区块链进行交互的身份管理。
账本管理:提供区块的查询,如根据区块高度或者区块hash进行查询,根据交易id查询区块。账本还可以根据通道的名称获取整个账本的信息,账本通过通道进行隔离。
交易管理:应用程序通过交易管理将交易提交到交易背书节点,获得交易背书后交交易提供给交易排序节点进行排序,排完序的节点会被打包成区块进行分发,将交易扩散到整个网络。
智能合约:主要做智能合约的安装,初始化以及升级操作。智能合约是函数声明,而交易是函数调用
3)区块链底层
成员服务:提供身份认证
共识服务:CAP原理,指在一个分布式系统里面不能同时满足
一致性,可用性以及分区容忍性。分区容忍性需要很多备份,导致写入需要
更多时间,可用性下降,因为需要保证写入的数据一致,如果对一致性要求不那么严格,就可以弱化一致性。也就是区块链采取的方式。
链码服务:提供安全隔离的交易执行环境,确保用户数据的隔离,fabric使用的是docker。
安全及密码服务:提供加密服务
我们主要学习 共识服务 以及 链码服务
2.网络拓扑:四种节点
客户端节点:介于应用程序与底层之间的节点,是两者之间交互的媒介节点,无法独立存在,需要与 Peer或者Order 节点连接才能发挥作用。
Peer节点:包括(Anchor/Endorser/Committer)其中 Anchor节点为主节点或者翻译成锚节点,是组织中唯一与orderer节点进行通信的节点,可以在网络初始化的时候用最初的配置指定。Endorser为背书节点或者叫做担保节点,主要为交易做担保,Commiter为记账节点,
所有的Peer节点都是记账节点,主要作用是验证从orderer节点接收到的区块,验证区块的有效性以及交易的有效性,验证完成后记录到本地的账本中。三种节点互不排斥,一个节点可以同时担任一种或多种节点。
Order节点:排序节点,主要有两个功能,一是从全网的客户端中接收交易,然后将交易按照一定的规则进行排序, 二是将排序好的交易按照固定的时间间隔打包成区块, 然后分发给其他组织的主节点。官方目前有两种order排序方式,一种是solo,整个组织中只有一个排序节点,容易出现单点故障,只适合于开发测试时使用,另一种是kafka,将整个排序过程转交给kafka集群, 每一个order同时是kafka的生产者以及消费者。
CA节点:证书颁发机构
3.网络拓扑图
客户端节点代表区块链上的应用程序,与其他组件关联。
注册登记是指客户端节点向CA机构表明自己的身份,获取相应的CA证书,用于获取操作。CA可以使用第三方CA也可以使用官方提供的CA。
交易提案是指客户端向两个组织的背书节点发起交易提案请求,组织可以认为是peer节点,在现实生活中可以认为是两个商业主体。其中组织1有4个peer节点,而组织2有3个peer节点。两者都只有一个主节点用于从orderer节点中接收区块,然后通过gossip协议在组织内部进行区块扩散,两个组织是独立的,不会进行彼此通信,他们共同的数据来源是排序节点。排序节点主要有两个功能,第一个功能是从客户端接收交易,然后在排序节点内部排好序后打包成区块广播给其他组织的主节点。3个order节点都和kafka直接关联,他们之间并没有直接通信,每个主节点可以选择自己的orderer节点进行通信。
fabric的网络集群更像是一个树状结构,最上层是kafka集群,然后是orderer节点,然后是每个组织的主节点,最后才是记账节点。这样设计的目的是可以让每个组织只暴露一个主节点,内网的其他节点完全可以不对外公开。不用做大的改进,企业就可以使用区块链。
4.交易流程
主要流程:
1.提交交易提案:客户端节点(应用程序)做好交易提案后,选择背书节点进行提交,背书节点的选择与智能合约相关,智能合约安装的时候,必须指定背书节点,如果智能合约要求必须两个背书节点进行背书,那么应用程序必须将提案提交给至少两个背书节点。
2.模拟执行交易提案并签名:背书节点收到交易提案后,首先做一些验证检查方面的工作,如果一切验证通过,如果一切验证都通过后,背书节点将交易发送给智能合约进行隔离执行,执行完之后会返回一个执行结果,背书节点对这个结果进行签名,也就是背书。
3.返回模拟执行结果:模拟执行完之后,背书节点将结果放回给客户端。
4.提交交易(模拟执行结果+签名):如果交易是一个查询交易,该交易的流程到这里就结束了,如果交易是一个写交易,客户端节点必须收到足够多的背书结果,然后将交易提案背书结果再加上自己的签名合起来成为一个交易,然后将该交易发送给排序节点进行排序,这里需要确保背书节点的背书都一致,因为如果背书结果不一致,排序节点并不会发现。
5.交易排序并结块:排序节点不会检查交易的内容,指挥根据规定好的排序逻辑进行排序,然后将排好序交易打包。
6.广播区块:将打包好的交易广播给其他组织的主节点。
7.保存区块,更新世界状态:主节点收到区块后,在记账过程中会去验证该笔交易是否是有效的如果无效会被标记成无效交易,该交易也会被存储在账本里面,但是不会更新状态数据库。
8.同步区块:在组织内部进行区块同步。
9.保存区块,更新世界状态:与第7步相同,只是这是在记账节点进行的。