【2020初春】【区块链】Fabric 系统架构及简单实例

包含内容:fabric系统结构,网络拓扑结构,交易流程,first-network实例,fabcar实例

系统架构
整个图分为上下两部分,上面是应用程序,下面是底层架构

应用程序:
使用grpc结构开发,在API基础上,官方针对不同语言封装了SDK(go,node.js),fabric采 用异步模式进行开发,在链码定义事件,应用程序监听到事件被触发时就进行操作。

交互媒介:
身份(所有的请求都需要身份认证,通过了才能进行后续的操作,签名)依托于底层的成员服务。
账本(对区块查询,按区块高度/区块哈希/交易ID查询,根据通道名称获取整个账本信息)
账本主要是进行数据的查询,对数据的修改使用到的是交易(应用程序通过交易模块,将交易提交到背书节点,后排序,进行分发)
智能合约模块主要包括(智能合约的安装,初始化,升级)

交易是对智能合约的调用,在智能合约里完成逻辑的实现

底层架构:
1.成员服务(PKI体系,CA系统)
2.共识服务(CAP一致性,可用性,分区容忍性;弱化一致性,所以要用更好的共识算法来保证一致性。fabric共识机制分为了三个过程,后面也会介绍。排序节点与锚节点使用grpc 协议, 组织内部使用gossip协议;客户端将提案给背书节点,背书节点模拟执行后返回结果给客户端,客户端提交到排序节点,排序节点排序后生成区块广播,分发给各个记账节点,记账节点进行验证后同步,)
3.链码服务(安全隔离的交易环境,确保业务数据的隔离,目前使用docker)
4.安全及密码服务:默认实现密码服务

【2020初春】【区块链】Fabric 系统架构及简单实例
网络拓扑结构,主要分为以下四类
客户端节点:(应用程序/SDK/命令行工具)在应用程序与底层之间,是交互的媒介

peer:Anchor一个组织内只有一个,锚节点,主节点,与order通信; Endorser,背书节点,担保,绑定智能合约;

Committer,记账节点,所有的peer节点都是记账节点,验证从order接收到的区块,验证区块和交易的有效性,存入本地账本,更改区块链的状态数据。

order:排序节点,从客户端接受交易,按一定规则进行排序;将排序好的交易按一定规则打包成区块,分发给其他组织的锚节点。有solo和kafka模式,1.4后新增Raft

ca:证书颁发机构,证明区块链的身份是否有效合法

接下来是一个图例,可以更直观的展示他们之间的关系

客户端向CA表明自己的身份,获取证书
向两个组织的背书节点发起提案,每个组织内只有一个主节点,主节点与order获取信息,每个组织之间相互独立
排序节点从客户端接收交易,排好序后打包成区块,广播给其他组织的主节点
每个组织只需要把主节点放在公网上,可以保护隐私性
【2020初春】【区块链】Fabric 系统架构及简单实例
fabric交易流程

  1. 交易模拟(智能合约)
    客户端在本地构造好交易提案,选择背书节点提交,根据智能合约选择背书节点
    背书节点收到提案后进行验证检查,在智能合约模拟执行,返回一个执行结果,背书节点对结果进行签名(背书),返回给客户端
    客户端接受后进行验证,如果是查询,交易流程可以结束;如果是写操作,客户端收集足够多背书结果,将交易提案,背书结果,自己的签名打包成新交易,发送给排序节点,所有背书节点结果一致即可

  2. 交易排序(共识机制)
    收到交易后进行排序,打包成区块广播给各个主节点

  3. 同步记账(账本存储)
    主节点接受后进行保存,同步给其他peer节点

【2020初春】【区块链】Fabric 系统架构及简单实例
first-network实例,主要介绍fabric网络搭建起来的流程
各个文件作用
.env 环境变量
base docker-compose公共服务
byfn.sh 启动脚本
configtx.yaml;crypto-comfig.yaml;生成文件放入channel-artifacts;crypto-config文件夹中
docker-compose cli;couch;e2e-template;e2e;启动网络
scripts测试脚本;
generate命令:根据两个yaml文件,生成peer节点,order节点相关的(MSP)证书以及创世区块创建

日志分析
创建通道
【2020初春】【区块链】Fabric 系统架构及简单实例
peer加入通道
4个
【2020初春】【区块链】Fabric 系统架构及简单实例
【2020初春】【区块链】Fabric 系统架构及简单实例
【2020初春】【区块链】Fabric 系统架构及简单实例
【2020初春】【区块链】Fabric 系统架构及简单实例
更新两个组织锚节点信息(peer0)
【2020初春】【区块链】Fabric 系统架构及简单实例
【2020初春】【区块链】Fabric 系统架构及简单实例
安装chaincode(org1 org2 peer0)
【2020初春】【区块链】Fabric 系统架构及简单实例
【2020初春】【区块链】Fabric 系统架构及简单实例
初始化智能合约后查询,交互
【2020初春】【区块链】Fabric 系统架构及简单实例
【2020初春】【区块链】Fabric 系统架构及简单实例
【2020初春】【区块链】Fabric 系统架构及简单实例

生成的三个链码镜像
【2020初春】【区块链】Fabric 系统架构及简单实例
主要源码
安装链码 script.sh文件中
【2020初春】【区块链】Fabric 系统架构及简单实例
查看链码源代码 chaincode_example02.go
main函数
【2020初春】【区块链】Fabric 系统架构及简单实例
初始化Init方法
【2020初春】【区块链】Fabric 系统架构及简单实例
交互invoke方法
【2020初春】【区块链】Fabric 系统架构及简单实例
包含invoke delete query 三个方法

初始化文件script.sh与链码相关内容
安装链码
【2020初春】【区块链】Fabric 系统架构及简单实例
初始化链码
【2020初春】【区块链】Fabric 系统架构及简单实例
初始化四个值,a=100 b=200
peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -v 1.0 -c ‘{“Args”:[“init”,“a”,“100”,“b”,“200”]}’ -P “OR (‘Org1MSP.member’,‘Org2MSP.member’)” >&log.txt

query查询
【2020初春】【区块链】Fabric 系统架构及简单实例

peer chaincode query -C $CHANNEL_NAME -n mycc -c ‘{“Args”:[“query”,“a”]}’ >&log.txt
查询a的值,返回100

invoke交互
【2020初春】【区块链】Fabric 系统架构及简单实例

peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -c ‘{“Args”:[“invoke”,“a”,“b”,“10”]}’ >&log.txt

a给b 10
【2020初春】【区块链】Fabric 系统架构及简单实例
【2020初春】【区块链】Fabric 系统架构及简单实例
第二个例子是Fabcar,汽车管理,前面的例子主要演示整个fabric网络的搭建过程,这个样例主要是展示如何通过智能合约和区块链网络进行交互来查询和更新账本

注册CA

enrollAdmin.js
为管理员注册生成证书。使用注册ID和**将管理员用户注册到Fabric CA,注册后得到**对和证书。然后将**对和证书(存储在wallet / admin /中)

(从fabric-ca-client和fabric-network加载所需的模块。检索有关基础网络部署的详细信息。它用于获取Fabric CA的接入点(第20-21行)。检查“admin”是否已经在wallet目录中。如果存在,则不需要采取其他操作。)

registerUser.js

使用registerUser.js注册user1和收录user1。这是使用我们在上面创建的管理员来执行此注册。用户注册之后可以执行查询和调用。注册的结果是user1得到**对和证书,然后将**和证书都存储在wallet / user1 /中(新版)。

shim层是节点与链码交互的中间层。当链码的代码逻辑需要读写账本时,链码会通过shim层发送相应操作类型的ChaincodeMessage给节点,节点本地操作账本后返回响应消息。
chaincode SDK
Init()
【2020初春】【区块链】Fabric 系统架构及简单实例

Invoke()
【2020初春】【区块链】Fabric 系统架构及简单实例

queryCar()
【2020初春】【区块链】Fabric 系统架构及简单实例

initLedger()
【2020初春】【区块链】Fabric 系统架构及简单实例

query.js
【2020初春】【区块链】Fabric 系统架构及简单实例

invoke.js
检查user1是否已注册。 如果没有需要registerUser.js,不进一步的操作。
【2020初春】【区块链】Fabric 系统架构及简单实例

也许应该算盛夏了,初春已经过去了