fabric简介
Fabric架构的核心包括三部分:
- Identity - 身份管理
- Smart Contact - 智能合约
- Ledger及Transactions - 账本和交易
1.身份管理
- 用户身份
- order节点
- 对交易排序,打包
- peer节点
- 存储账本
- 需要安装链代码,处理客户端请求,管理账本数据
- 客户端
- 对账本数据进行读写操作
- order节点
fabric网络中的每一类用户,可以有一个或多个,每个节点都有属于自己的证书(秘钥对),不同角色的节点有不同权限
2.账本管理
- 对于程序员来说对账本的操作就是调用对应API
- 对于fabric来说需要对账本进行管理
- 账本组成
- 区块链
- 所有的交易的集合,交易的历史记录
- 世界状态
- 用户的最新状态
- 存储在账本的默认数据库中
- 账本在peer节点上,这个节点上有默认的数据库,levelDB
- 数据存储格式:键值对
- key:value
- key:字符串
- value:字符串
- key:value
- 数据存储格式:键值对
- 账本在peer节点上,这个节点上有默认的数据库,levelDB
- 区块链
- 账本组成
3.交易管理
- 部署交易
- 根据实际的业务需求来发链代码
- 把链代码安装到peer节点上
- 调用交易
- 客户端节点发起的,将请求发送给peer节点
- peer节点收到请求后,通过智能合约的逻辑处理,最终实现账本数据的读写操作
4.智能合约(链代码)
智能合约不仅是封装信息并使整个网络保持简单的关键机制,还可以通过编写它们以允许参与者某些方面的交易自动执行。
例如,可以编写智能合约来规定运输物品的成本,其中运费根据物品到达的速度而变化。根据双方同意并写入分类账的条款,当收到物品时,适当的资金会自动转手。
智能合约支持的语言:
- Java(最早支持,后来不支持,1.4又支持)
- node.js
- go
基础概念
节点
- peer节点
- 存储账本
- 安装智能合约
- 接收并处理客户端请求
- 运行在docker容器中,
- 镜像:hyperledger/fabric-peer
- 分为四个角色(后面详细介绍)
- 客户端节点
- 连接peer节点、order节点
- 发送请求给peer节点
- 镜像:hyperledger/fabric-tools
- orderer节点
- 对交易排序
- 为什么要排序
- 解决双花问题
- 使用排序算法
- solo==>>用于测试环境(队列模型,先进先出,后进后出)
- kafka==>>工作环境中使用(分布式的消息处理系统)
- 为什么要排序
- 对交易打包
- 得到了区块
- 频率==>>在搭建fabric网络时候,手动设置的
- 得到了区块
- 镜像:hyperledger/fabric-orderer
- 对交易排序
Peer、Ledger和 ChainCode
- N-区块链网络
- P1-P3:3个peer节点,共同处于一个网络中
- S1:智能合约(链码)
- L1:账本,每个peer节点上都有账本
账本和智能合约:
- 在peer上
- 账本是先天存在的
- 智能合约是后天的,程序员安装上去的
- 每个peer节点上都有智能合约,对账本进行管理
- 一个peer节点上可以有多个账本(加入到了不同的通道中)
- 一个peer上可以安装多个智能合约
- 账本1–合约1
- 账本2–合约1、2
- 智能合约业务逻辑处理,项目中有多个模块,模块之间关联性不大,可以将每个模块的逻辑单独封装,每个模块对应一个链码,举例:装修公司
- 改水电
- 刷墙
- 贴地砖
- 吊顶
通道==>>channel
用来隔离数据的, 用户在不同的通道中, 使用的数据是不同的, 而且数据不共享, 理解为群
通道是由共识服务(ordering)提供的一种通讯机制,将peer和orderer连接在一起,形成一个个具有保密性的通讯链路(虚拟),实现了业务隔离的要求
- N:区块链网络
- C:通道,区块链网络中通道,可以一到多个,至少一个
- P1,P2:peer节点,加入到同一个通道中
- P1,P2节点上的账本数据是相同的
- L1:账本
- S1:智能合约(链码)
- A:客户端,访问属于通道C中的peer节点
- 结论
- peer节点如果要共享数据,必须要加入到同一个通道
- 加入到同一个通道的节点上的账本数据是相同的
- P1和P2上的智能合约可以不同(比如卖家和买家就不同)
- 对peer节点上账本数据的操作,是通过客户端完成的
- 发送查询请求
- 交易请求
组织
fabric中的组织是通过职能划分的, 每个组织中可以有很多用户
- N: 区块链网络
- C: 通道
- P1-P8: peer节点
- 加入到了同一个通道
- 节点上的账本数据是相同的
- 对其中某一节点的账本数据修改, 数据会自动同步到其他节点的账本上
- Org1-Org4: 组织
- A1-A4: 客户端
- 不同的组织的客户端不同, 不同组织处理的业务逻辑不同
交易流程
- 客户端发送请求到peer节点
- peer节点收到请求, 通过安装的智能合约对请求进行处理
- peer将处理 的结果发送给客户端 -> 客户端拿到了请求的结果
- 以上三步只是进行交易的模拟, 账本数据并没有被修改
- 客户端收集到了所有参与交易的节点的回复
- 有一部分同意
- 有一部分不同意
- 客户端将交易请求和模拟交易的结果发送给orderer节点
- orderer将得到的数据进行排序打包
- orderer将打包的数据发送给peer节点
- 得到区块的peer对其中的交易进行校验
- 因为有一部分模拟结果失败了, 因此交易失败
- 失败: 账本数据数据是不会被修改的
- 校验没问题
- 修改账本数据
- peer将校验的结果发送给客户端
账本
账本分两部分:
- 世界状态
- 最后一个交易完成之后的状态
- 通过key:value结构存储数据
- 区块链
- 所有交易的历史记录
- 世界状态的变更是通过读区块链数据来完成的
区块链中的数据:
第一个区块:创始(世)区块
- 不存储数据
- 存储通道节点信息
- 第一个节点以后存储的是交易信息
H1 - Hn: 区块头
- 上一个区块的哈希
- 当前区块的哈希
D1 - Dn: 数据块
T1 - Tn: 交易
img-Cgc7WLLG-1562243617497)]
区块链中的数据:
第一个区块:创始(世)区块
- 不存储数据
- 存储通道节点信息
- 第一个节点以后存储的是交易信息
H1 - Hn: 区块头
- 上一个区块的哈希
- 当前区块的哈希
D1 - Dn: 数据块
T1 - Tn: 交易