hyperLedger Fabric 系列一

1. 前言

  当前在公司一直学习和研究区块链的相关知识,在大致了解了公链(bitcoin)之后,即将主要的精力投入到联盟链的学习和研究中。对于联盟链而言,我们是以hyperLedger作为主要的研究对象。本人作为一个区块链行业的小白级人物,将以此系列作为自己学习和调研经历的总结和整理,为后续区块链项目应用提供指导。
  本文档作为整个系列的第一部分,介绍的内容大致包括:

  • hyperLeder项目的介绍;
  • fabric项目的介绍:逻辑结构

2. hyperLedger 的简介

  区块链作为一个新兴的技术,其作为一个p2p分布式账本技术,以智能合约、安全加密等相关优势,能够彻底改变融资、供应链、以及其他交易网络,为其创新和发展带去新的机遇,同时还能减少运营成本,降低风险。区块链技术本身的发展,大家有目共睹,这里不在赘述。
  区块链作为一个刚开发的技术,当前还不能满足商业交易中各种复杂的需求。其扩展性还存在问题,也不能支持私下机密交易,这些限制都是其难以在众多以业务为主的应用程序的运行自如。为了应对各种各样的市场需求,hyperLedger的设计,在保有区块链当前的优势的基础上,以产业应用为重点,解决了现有的缺点,扩展业内先行者的功能。
  所谓的超级账本(hyperLedger)其实是一个用于支持企业自定义区块链业务的开发框架。作为一个开源的区块链项目组 ,超级账本还包括4个子项目:Sawtooth、Iroha、Fabric、Burrow。其中fabric最广为人知,也是我们后续主要的研究对象。
  在介绍hyperLedger的特点之前,我们先了解下企业级区块链产品的诉求,引出hyperLedger的相关特点,以此来判断超级账本是否能够满足企业级区块链产品的需求。

2.1 hyperLedger的设计初衷

2.1.1 企业级区块链要素

在这里插入图片描述

  • 智能合约 数字化合约,定义业务规范
  • 商业网络 包含时长参与者的对等架构,伙伴之间的一个共同协议
  • 共享账本 记录网络交易,分布式节点存储
  • 隐私和保护 记录通过哈希、加密、个人签名保护
  • 共识 确保每份副本的一致性,降低伪冒交易风险

2.1.2一个涵盖众多网络的世界

在这里插入图片描述
  如上图所示,hyperLedger希望能够构建一个这样的系统:这个系统中包括众多的区块链网络,使得每一个网络账本都能够执行不同的业务。同时,hyperLedger还有一个寻址系统,能够通过一个账本的交易,发现并利用另一个账本中的争当交易和智能合约。

2.2 hyperLedger 的特点

   hyperLedger架构的设计满足于各种使用场景下的网络:可以是公开运行,易于融入到移动应用;也可以完全私下运行,参与者需要进行身份验证和授权。hyperLedger能够允许网络之间互相访问,并对参与者进行授权和权限管理。
  hyperLedger能够保证区块链用户的业务逻辑和其他交易信息的机密性,做到除了合约涉及的利益相关方或者交易中的资产,没有人能够访问这些数据。

2.2.1 超级账本特色

  • 身份识别
  • hyperLedger协议针对每一个身份,都会生成一个密钥。供成员在网络上进行交易,并且不会透露交易方信息,保障信息安全;
  • 私下交易和保密合约
  • hyperLedger通过加密交易来保证内容的机密性,只有利益相关方才能对其进行解密并执行。此外,业务逻辑也进行了加密处理,并且只有在运行时才能加载、破解;
  • 共识模块
  • hyperLedger协议下的共识算法,支持可插入式的配置模式,由用户自己进行配置选择合适和共识算法;
  • 智能合约
  • hyperLedger当前支持go和java实现的智能合约。

2.2.2 行业案例

  • 商务合同
  • 资产存管
  • 供应链

2.3 hyperLedger 子项目介绍

  hyperLedger项目组中存在9个正式的子项目,这些子项目解决了区块链的核心的基础问题,比如分布式账本、区块链结构浏览器、不同区块链之间如何进行价值交换等,9个子项目分别为:

  • hyperLedger Fabric
      作为hyperLedger核心项目,本质上是一个分布式共享账本,目标是成为开发应用和解决方案的基础,结构上采用模块化架构,可以做到插入即用。
  • hyperLedger explorer
      是一个用来对区块链进行配置管理、区块和交易数据查询、节点管理的工具。可以使用其查看区块链内部的信息,对区块链进行管理。使用node.jsk开发,目前只支持fabric(其实简单的理解,就是一个UI界面工具)
  • hyperLedger Iroha
      使用c++开发,采用BFT算法,提供分布式账本支持。
  • hyperLedger burrow
      是hyperLedger第一个基于以太坊框架的项目,是一个经过许可的智能合同机。
  • hyperLedger indy
      专注于区块链生态系统的数字身份工具,提供基于区块链或者其他分布式账本的数字身份,从而让它们跨管理域、跨应用与其他应用程序进行交互操作。
  • hyperLedger sawtooth
      是一个模块化平台,用于创建、部署和运行分布式账本
  • hyperLedger composer
      是一个应用程序框架,可以简化fabric应用程序的创建、部署和使用
  • hyperLedger cell
      是一个fabric的集成管理工具,其目标是建立一种方式去创建、管理和终止区块链
  • hyperLedger quilt
      是一个支付协议,主要用于hyperLedger下不同区块链产品之间进行价值传递和转换。
  hyperLedger中比较重要的子项目如上图所示,我们当前可以主要研究fabric、explorer和cello

3. hyperLedger Fabric的架构

  hyperLedger在0.6和1.0两个版本在架构上进行了很大的改动,本文档针对V1.0版本进行相关的介绍。

3.1 fabric的逻辑架构

在这里插入图片描述
  如上图所示,展示的是fabric的逻辑架构设计图

3.1.1 成员管理

  • Membership Services   成员服务
  • Registration   注册服务能够控制和管理hyperLedger参与者的权限
  • identity management   身份管理能够提供管理保障,根据参与者的身份和角色来授予信息披露权限
  • auditability   可审核能够帮助授权个体,将个人或者团体之间的交易连接起来,并且访问系统中某用户的活动情况,或者其本身的运行情况

3.1.2 区块服务

  • consensus Manager   共识管理器是一个抽象的概念,其定义了共识算法与其他hyperLedger组件之间的接口。共识管理器接收交易,根据算法来决定如何组织何时执行交易,交易成功之后会在账本上反映。
  • distributed Ledger   分布式账本用于管理区块链以及整体状态,主要有三个功能:1)高效计算每一区块完整数据集的加密散列;2)当一个对等节点脱离,并试图进行同步时,能够及时将这些最小数据变化传送到数据集中;3)减少每个对等节点的数据存储量。分布式账本采用RocksDB来进行数据持久化,大型文件(文档)存放在区块链之外的存储库中,而其散列值作为交易的一部分放在链上。
  • p2p protocol   p2p网络协议
  • ledger stroage   分类存储

3.1.3 链上代码

  • chaincode services  链上代码是一个去中心化的交易程序,在验证节点上执行。链上代码服务使用docker来存放链上代码,其执行环境安全便捷。
  • secure container   安全容器,用于存放链上代码
  • secure registry  安全注册能够使docker安全注册hyperLedger镜像,以及链上代码在内测自定义镜像库

3.2 区块链网络和运行时序

在这里插入图片描述
  将共识部分提取出来(orderer),同时每一个组织中可以存在多种peer节点,例如背书节点(E),提交节点(C),每一个组织在加上对应的排序节点,就组成了一个区块链网络

在这里插入图片描述
  整个架构将共识分布拆分为三个:endorser(背书)、committer(提交)、orderer(排序)。上述三个都是不同的节点,其中endorser和committer还保留在peer节点中,交易打包和交易排序已经被独立到orderer节点中。

3.3 支持多chain和支持多channel

  所谓的chain(链)实际上是包含Peer节点、账本、ordering通道的逻辑结构,它将参与者与数据(包含chaincode在)进行隔离,满足了不同业务场景下的”不同的人访问不同数据“的基本要求。同时,一个peer节点也可以参与到多个chain中(通过接入多个channel);如下图所示:
在这里插入图片描述
  通道是有共识服务(ordering)提供的一种通讯机制,类似于消息系统中的发布-订阅(PUB/SUB)中的topic;基于这种发布-订阅关系,将peer和orderer连接在一起,形成一个个具有保密性的通讯链路(虚拟),实现了业务隔离的要求;通道也与账本(ledger)-状态(worldstate)紧密相关;如下图所示:
在这里插入图片描述
  peer 1,2和N订阅红色通道,并共同维护红色账本; peer 1和N订阅蓝色通道并维护蓝色账本; 类似地,peer 2和peer N在黑色通道上并维护黑色账本。
  在这个例子中,peer N在订阅了所有通道,我们看到每个通道都有一个相关的账本。 一般来说,我们称不涉及所有peer的账本为子账本,另一种是系统账本,即全账本。
  通道和账本的组合是一个虚拟链,因此一个区块链网络可以具有1个共识服务的多个链。 系统通道和全账本构成系统链。 每个区块链网络只有1个系统链。如果交易是公开的,区块链网络可能永远不需要多个链; 所有的交易对所有Peers成员都可见。 然而,在成员间进行私密交易(例如双边合同),单独的链是隔离数据、提供保密的方式。

3.4 交易(数据)流程说明

在这里插入图片描述
在这里插入图片描述

  • 应用程序通过SDK发送请求道Peer节点(一个或多个)
  • peer节点分别执行交易(通过chaincode),但是并不将执行结果提交到本地的账本中(可以认为是模拟执行,交易处于挂起状态),参与背书的peer将执行结果返回给应用程序(其中包括自身对背书结果的签名)
  • 应用程序 收集背书结果并将结果提交给Ordering服务节点
  • Ordering服务节点执行共识过程并生成block,通过消息通道发布给Peer节点,由peer节点各自验证交易并提交到本地的ledger中(包括state状态的变化)。
    在这里插入图片描述
    在这里插入图片描述

3.5 账本设计

  总体流程如下图所示:在新的架构中,Peer节点负责维护区块链的账本(ledger)和状态(State),本地的账本称为PeerLedger,其结构如下:
在这里插入图片描述
  整个区块结构分为文件系统存储的Block结构和数据库维护的State状态,其中state的存储结构是可以替换的,可选的实现包括各种KV数据库(LEVELDB,CouchDB等);

3.5.1 整体账本设计详述

在这里插入图片描述

3.5.2 fabric交易的完整生命周期

在这里插入图片描述
在这里插入图片描述

4.智能合约

  智能合约是一个接口的代码实现,部署在Fabric区块链节点上。智能合约是和fabric区块链交互的唯一渠道,同时也是transaction(交易)的唯一来源。
  当前fabric的智能合约支持go和java语言进行开发,所使用的sdk是shim包,也就是使用shim包,用go语言进行智能合约的开发。

4.1 相关概念

  • transaction 一次chaincode函数的运行,transaction存储chaincode执行的相关信息,比如channelId,函数名称,参数等,并不包含操作的数据
  • world state fabric区块链系统中所有变量的值得集合。是transaction实际操作的数据,每个chaincode都有自己的操作数据。fabric使用rocksdb进行数据持久化,一个kv数据库。fabric将每一对key-value成为一个state,而所有chaincode的state的集合就是world state。
  • channel 通道(子链):同一个peer可以加入不同的channel,chaincode是针对channel执行的。同一个channel上的peer节点同步其上chaincode执行的结果。
  • endorser(背书):模拟执行chaincode,分离计算任务,减轻共识节点负担,增加吞吐量,支持背书策略,更加灵活
  • orderer(排序):对chaincode的结果进行共识,支持sole/kafka/sBFT不同的排序策略
  • commiter(提交):将chaincode的执行结果写入ledger

4.2 编写方式

4.2.1 shim接口函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2.2 智能合约的示例

func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
	fmt.Println("ex02 Init")
	_, args := stub.GetFunctionAndParameters()
	var A, B string    // Entities
	var Aval, Bval int // Asset holdings
	var err error
	if len(args) != 4 {
		return shim.Error("Incorrect number of arguments. Expecting 4")
	}
	// Initialize the chaincode
	A = args[0]
	Aval, err = strconv.Atoi(args[1])
	if err != nil {
		return shim.Error("Expecting integer value for asset holding")
	}
	B = args[2]
	Bval, err = strconv.Atoi(args[3])
	if err != nil {
		return shim.Error("Expecting integer value for asset holding")
	}
	fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)
	// Write the state to the ledger
	err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
	if err != nil {
		return shim.Error(err.Error())
	}
	err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
	if err != nil {
		return shim.Error(err.Error())
	}
	return shim.Success(nil)
}

  上述是一个智能合约初始化函数,我们注意到该函数在创建新的数据时,使用的是stub.PutState(A, []byte(strconv.Itoa(Aval)))。pushState()即使上述shim.ChaincodeStubInterface中用于进行key-value新增的接口。后续我们可以自行定义chaincode进行transaction的生成。

5. Fabric的演示

   以下,本人将真实展示fabirc框架的运行,以及智能合约的使用。关于fabric环境的部署比较麻烦,本人将在其他文档中进行详细的介绍。

  • 运行环境 centos7虚拟机
  • 依赖环境 GO Docker Fabric
  • 安装目录 在这里插入图片描述

具体的执行方式和结果如下:

  • 进入/opt/gopath/src/目录
  • 使用命令 git clone https://github.com/hyperledger/fabric-samples.git 获取release-1.3版本git,运行成功之后会在当前目录生成fabirc-samples目录。
  • cd /opt/gopath/src/fabric-samples/first-network
  • ./byfn.sh generate 生成crypto-config 和channel-artifacts文件夹
  • 启动网络 ./byfn.sh up –c myChannel –t 10 –d 3 –f docker-compose-cli.yaml –s goleveldb –l go –i latest
    上述步骤最终执行结果如下:
    在这里插入图片描述
    主要的命令为:
  • 进入cli容器
  • 装载智能合约,并且定义合约id为fdddcc,定义a和b的厨师数据
  • 实例化fdddcc
  • 查询a,查询b
  • a向b转账100
  • 查询a,查询b

猜你喜欢

转载自blog.csdn.net/wangyuezhilang/article/details/83544192