Fabric超级账本基本架构功能,账本结构、源码以及智能合约。
更多区块链技术与应用分类:
一.Fabric系统架构
架构图一张

二.网络拓扑
1.节点类型
客户端节点:媒介节点
Peer节点:(Anchor(锚节点)或Endorser(背书节点)或Committer(计算节点))
Orderer节点:排序(solo/kafka方式排序)都不支持拜占庭容错机制(作恶节点)
CA:(可选fabric提供的ca组件,也可选择第三方机构,如中国的CFCA)
2.拓扑图例

- ca在区块链网络以外(也可以在网络内)
- gossip协议用于区块在组织内扩散
- 排序节点将排好序的区块广播给每个组织的“主节点”
- 三个orderer节点直接与kafka集群管理,而之间没有通讯,组织可以任意选择orderer节点进行通信
企业级联盟链:可以采用将orderer节点暴露在公网中,每个企业主体只暴露一个主节点,即可。
3.交易流程

(1)客户端先去背书节点拿到模拟执行的结果以及背书节点的签名,然后去向排序节点提交交易(模拟执行结果+签名)
(2)主节点在接受到打包的区块后,回去计算验证某笔交易是否是有效的,若是无效的,依然会存储在区块账本中,但不会更新状态数据库(无效交易之后浪费磁盘空间,后续版本会过滤掉无效交易)
三.共识机制
1.整体过程
交易背书(模拟-Endorser)
交易排序(排序-Orderer)
交易验证(验证-Committer)
2.交易排序
目的:保证系统交易顺序的一致性(有限状态机)
3.多通道模型

4.Orderer部分源码

三.账本结构
1.Peer账本存储

Orderer节点的账本存储:只是临时存储不影响世界状态、历史状态,只是区块存储。
Peer节点的账本存储:
区块存储在文件系统,需要使用levelDB作为区块索引
状态数据库存储区块链上的最新数据,可以重现。(couchDB可以支持结构化数据存储,支持模糊查询)
历史状态索引,若没有状态数据库时,可使用恢复。只存储状态变动对应的交易ID而不存储状态结果,节省存储空间。
2.世界状态
交易执行后的所有键的最新值
显著提升链码的执行效率
世界状态是所有交易日志的快照、可随时重构
3.历史数据索引(可选)
记录改变动作,不记录具体改变
历史读取 --> 历史数据索引 + 区块读取
账本最大容量:64M * 100,0000
区块提交:
保存区块文件==> 更新世界状态==>更新历史状态(可选)
4. 源码解读(4个部分)
读写集
状态数据
历史世界
区块文件
core --> ledger-->
(1)交易模拟执行器代码位置(读写集实现):
core\ledger\kvledger\txmgmt\txmgr\lockbasedtxmgr\lockbased_tx_simulator.go
(2)读写集的验证:
core\ledger\kvledger\txmgmt\validator\statebasedval\state_based_validator.go
(3)状态数据库:
core\ledger\kvledger\txmgmt\statedb\stateleveldb\stateleveldb.go
// 3个问题
// 1. 如何关联智能合约键值对与底层存储的键值对 数据隔离
// 2. 如何持久化区块的状态信息
// 3. 如何标识最新存储的区块编号
(4)历史数据库
core\ledger\kvledger\history\historydb\historyleveldb\historyleveldb.go
(5)区块文件
common\ledger\blkstorage\fsblkstorage\fs_blockstore.go
四、智能合约(链码)
只有背书节点才能执行链码
1.链码生命周期:
打包
安装
实例化(只执行一次)
升级
交互
2.链码交互流程

ESCC系统链码,用来完成系统过程,运行在节点进程
3.系统链码
LSCC:管理链码生命周期(部分)
CSCC:配置管理链码
QSCC:查询账本存储
ESCC:交易背书链码
VSCC:用作交易验证
4.链码编程接口
Init()
Invoke()
原文链接:Fabric超级账本架构功能图示