区块链开源实现Hyperledge Fabric(一)

一、概述

1.1 介绍

Hyperledger Fabric是Linux基金会所主导的Hyperledger(超级账本)的项目之一。Hyperledger Fabric旨在作为开发模块化体系结构的区块链应用程序的基础,以便诸如共识和会员服务等组件可以即插即用。它使用容器技术来托管构成系统应用逻辑的智能合约(也称为链代码)。 简而言之,Hyperledger Fabric是为企业构建的领先的开源、通用区块链结构。

1.2 逻辑架构

在这里插入图片描述

  • 成员管理:会员注册、身份保护、交易审计、内部保密等;
  • 账本管理:存储交易记录、交易数据的管理等;
  • 交易管理:部署交易、调用交易等;
  • 智能合约:实现了业务逻辑的代码;

1.3 基本概念

1.3.1 组织

Fabric系统是通过组织来划分的。fabric中的组织在现实世界中可以是一个公司、一个企业,或者一个协会。在fabric中,组织是承担着数据信用责任的区块链系统参与方。

每一个Fabric组织都有自己的用户,以及进行数据处理的节点。

1.3.2 节点

按照功能划分,可以把节点划分为:client、peer、orderer节点。

  • client:客户端节点,可以进行交易的管理;
  • peer:工作节点,用于存储和同步账本数据的节点;
  • orderer:排序节点,用于排序和分发交易;

1.3.3 通道

通道(channel)是共识服务提供的一种通讯机制,将peer和orderer节点连接在一起,形成一个个具有保密性的通讯链路,实现了业务的隔离。在同一个通道中的所有peer节点都保存一份相同的数据。通道由成员(组织)、每个成员的锚节点、账本、链码应用程序和排序服务节点定义。网络上的每个交易都是在一个通道上执行的,在该通道上,每一方都必须经过身份验证和授权才能在该通道上进行交易。一个peer节点可以同时加入到不同的通道中。每加入到一个新的通道,储数据的区块链就需要添加一条。只要加入到通道中就可以拥有这个通道中的数据。

1.3.4 交易流程

在这里插入图片描述
要完成交易,首先要必须要有背书策略(EndorseTx)。上图中的Application/SDK充当了客户端的角色。当客户端发起一个提案给peer节点时,peer节点将交易进行预演,并得到一个结果。peer节点讲结果发送给客户端后,如果成功,则客户端将交易提交给排序节点。排序节点对交易进行打包后,将打包数据发送给peer节点,peer节点再将数据写入区块中。

要完成一笔交易, 这笔交易的完成过程称之为“背书”。

1.3.5 账本

区块链账本包含两部分:世界状态和区块链。首先是世界状态通常使用数据库(默认为Level DB)保存一组账本的当前状态值,这样就不用遍历所有的交易日志去计算当前的状态值,通常使用key-value键值对表示,状态值可被创建,更新和删除。而区块链记录所有的交易日志记录。交易的信息会收集起来追加到区块链,一旦写入,就不能修改了。

二、Fabric环境搭建

环境安装在ubutun系统上进行。

2.1 安装docker

1)安装基本软件:

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl git software-properties-common lrzsz -y

2)添加阿里的docker镜像仓库:

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-get update

3)安装docker:

# 安装docker
sudo apt-get install docker.io
# 查看docker版本信息
docker version

4)将用户添加到docker群组:

# 将用户加入到该群组中,然后退出并重新登录生效
sudo gpasswd -a ${USER} docker
# 重启docker服务
systemctl restart docker
# 将当前用户切换到docker群组
newgrp - docker

5)安装docker-compose:

# 安装依赖工具
sudo curl -L $ https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 安装编排工具
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version

2.2 安装go

# 1. 使用wget工具下载安装包
$ wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
# 2. 解压tar包到/usr/local
$ sudo tar zxvf go1.11.linux-amd64.tar.gz -C /usr/local
# 3. 创建Go目录
$ mkdir $HOME/go
# 4. 用vi打开~./bashrc,配置环境变量
$ vim ~/.bashrc
# 5. 增加下面的环境变量,保存退出
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# 6. 使环境变量立即生效, 一些命令二选一
$ source ~/.bashrc  
$ . ~/.bashrc
# 7. 检测go是否安装好
$ go version

2.3 安装nodejs

1)下载二进制源码包:

$ wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz

2)解压并安装:

sudo tar xvf node-v8.11.4-linux-x64.tar.xz -C /opt

3)将node.js设置为全局可用:

# 编辑配置文件
$ sudo vim /etc/profile
# 添加如下配置项, 保存退出
export NODEJS_HOME=/opt/node-v8.11.4-linux-x64
export PATH=$PATH:$NODEJS_HOME/bin
# 重新加载配置文件
. /etc/profile

4)测试:

node -v

2.4 安装hyperledger fabric

1)下载软件:

# 创建fabric工作目录
mkdir ~/hyperledger-fabric
# 下载并执行脚本
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.2.0 1.2.0 0.4.10

下载完成后,将以下两个压缩包拷贝到 ~/hyperledger-fabric目录下,并解压缩。解压后的目录结构如下图所示:
在这里插入图片描述

2)设置全局访问:

# 进入到 ~/hyperledger-fabric/fabric-samples/bin 目录
cd ~/hyperledger-fabric/fabric-samples/bin
# 将这些二进制文件拷贝到 /usr/local/bin 目录下
sudo cp * /usr/local/bin

3)frist-network网络测试:

cd ~/hyperledger-fabric/fabric-samples/first-network/
./byfn.sh generate

4)启动网络:

/byfn.sh up

启动成功后,通过docker ps命令查看节点的启动情况,如下图所示:
在这里插入图片描述
如果要停止网络,可以执行./byfn.sh down命令。

三、Fabric核心模块

3.1 cryptogen

cryptogen模块主要用来生成组织结构和账号相关的文件。Fabric系统开发通常都是从cryptogen模块开始的。在Fabric项目中,当系统设计完成之后的第一项工作就是根据系统的设计来编写cryptogen的配置文件,然后通过这些配置文件生成相关的证书文件。

下面介绍cryptogen模块命令行选项及其使用方式。

  • cryptogen模块命令

cryptogen模块是通过命令行的方式运行的,一个cryptogen命令由命令行参数和配置文件两部分组成,通过执行命令cryptogen --help可以显示cryptogen模块的命令行选项,执行结果如下所示:
在这里插入图片描述
help:显示帮助信息;
generate:根据配置文件生成证书信息;
showtemplate:显示系统默认的cryptogen模块配置文件信息;
version:显示当前模块版本号;
extend:扩展现有网络;

  • cryptogen模块的配置文件

cryptogen模块的配置文件用来描述需要生成的证书文件的特性,比如:有多少个组织有多少个节点,需要多少个账号等,例如下面官方提供的示例文件crypto-config.yaml:

OrdererOrgs:					# 排序节点的组织定义
  - Name: Orderer				# orderer节点的名称
 	Domain: example.com			# orderer节点的根域名 
 	Specs:
	    - Hostname: orderer		# orderer节点的主机名
PeerOrgs:						# peer节点的组织定义
  - Name: Org1					# 组织1的名称	1	1
	Domain: org1.example.com	# 组织1的根域名
 	EnableNodeOUs: true			# 是否支持node.js
 	Template:					
	    Count: 2				# 组织1中的节点(peer)数目
	Users:
 	    Count: 1				# 组织1中的用户数目
  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Template:
        Count: 2
    Users:
        Count: 1

上述模板文件定义了一个orderer节点,这个orderer节点的名字为orderer,orderer节点的根域名为example.com,主机名为orderer。模板文件同时定义了两个组织,两个组织的名字分别为Org1 和 Org2,其中组织 Org1 包含了2个节点和1个用户,组织 Org2 包含2个点和1个用户。

除了Fabric源码中提供的例子以外,我们还可以通过命令cryptogen showtemplate获取默认的模板文件。

3.2 configtxgen

configtxgen 模块的功能主要包含两方面:1)生成 orderer 节点的初始化文件;2)生成 channel 的初始化文件。

  • configtxgen 模块命令:

configtxgen 模块是通过命令行的方式运行的,通过执行命令configtxgen --help可以显示 configtxgen 模块的命令行选项,执行结果如下所示:
在这里插入图片描述
-asOrg:指定所属的组织;
-channelID:指定创建的channel的名字, 默认的名字为mychannel;
-configPath:执行命令要加载的配置文件的路径, 不指定会在当前目录下查找;
-inspectBlock:打印指定区块文件中的配置内容,string:查看的区块文件的名字;
-inspectChannelCreateTx:打印创建通道的交易的配置文件;
-outputAnchorPeersUpdate:更新channel的配置信息;
-outputBlock:输出区块文件的路径;
-outputCreateChannelTx:标示输出创始区块文件;
-printOrg:将组织的定义打印为JSON;
-profile:指定配置文件中的节点;
-version:显示版本信息;

  • configtxgen模块配置文件

configtxgen 模块的配置文件包含Fabric系统初始块、Channel初始块文件等信息。

3.3 orderer模块

orderer 模块负责对交易进行排序, 并将排序好的交易打包成区块。orderer节点的配置信息通常放在环境变量或者配置文件中,在具体操作中,如果是通过docker镜像文件的方式启动orderer,推荐使用环境变量的方式,如果是采用命令的方式直接启动,推荐将所有的信息放到配置文件中。

3.4 peer模块

peer模块是Fabric中最重要的模块,也是在Fabric系统使用最多的模块。peer模块在Fabric中被称为主节点模块,主要负责存储区块链数据、运行维护链码、提供对外服务接口等作用。

3.4.1 命令行和常用参数

在这里插入图片描述
chaincode:与chaincode相关的命令,例如安装链码、实例化链码等;
channel:通道操作,如创建通道、加入通道等;
help:查看帮助信息;
logging:日志级别;
node:节点操作,如启动节点、查看节点状态等;
version:当前peer节点的版本信息;

3.4.2 peer channel子命令

peer channel的子命令可以通过 peer channel --help进行查看。
在这里插入图片描述

  • 参数:
    –cafile:当前orderer节点pem格式的tls证书文件,注意要使用绝对路径;.
    -o:orderer节点的地址;
    –tls:通信时是否使用tls加密;

  • 子命令:

1)create:创建通道;

# 创建通道
peer channel create -o ubuntu.test.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA

-c:要创建的通道的ID, 必须小写, 在250个字符以内;
-f: 由configtxgen 生成的通道文件, 用于提交给orderer;
-t: 创建通道的超时时长;

2)join:将peer加入到通道中;

peer channel join -b mychannel.block

-b:genesis创始块文件;

3)list:列出peer加入的通道;

peer channel list

4)update:更新;

 peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

-c:要创建的通道的ID, 必须小写, 在250个字符以内;
-f:由configtxgen 生成的组织锚节点文件, 用于提交给orderer;

3.4.3 peer chaincode 子命令

peer chaincode子命令一共有4个公共参数选项, 这些选项所有的子命令都可以使用, 他们分别是:

  • --cafile: PEM格式证书的位置
  • -o, --orderer: orderer服务器的访问地址
  • --tls: 使用orderer的TLS证书位置
  • --transient: JSON参数的编码映射

chaincode命令的运行需要一些参数,这些参数可以是配置文件也可以是环境变量,由于涉及的参数并不是很多,因此大多数时候都会采用环境变量的方式来设置参数。

1)install:负责安装chaincode;

peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/

-c: JSON格式的构造参数, 默认是`"{}"
-l:使用的编程语言,默认为golang;
-n:chaincode的名字;
-p:存储chaincode文件的路径,注意从github.com路径开始;
-v:当前操作的chaincode的版本;

2)instantiate:对已经执行过instanll命令的Chaincode进行实例化。instantiate命令执行完成之后会启动Chaincode运行的Docker镜像,同时instantiate命令还会对Chaincode进行初始化;

peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.member', 'Org2MSP.member')"

-C:当前命令运行的通道;
-c:JSON格式的构造参数,默认值是`“{}";
-E: 应用于当前Chaincode的系统背书Chaincode的名字;
-l:编写chaincode的编程语言,默认为golang;
-n:chaincode的名字;
-P:当前Chaincode的背书策略;
-v:当前操作的Chaincode的版本;
-V:当前Chaincode调用的验证系统Chaincode的名字;

3)invoke:调用chaincode;

$ peer chaincode invoke -o orderer.example.com:7050  -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'

-C:当前命令运行的通道;
-c:JSON格式的构造参数,默认值是`“{}";
-n:chaincode的名字;

4)list:查询已经安装的Chaincode;

peer chaincode list --installed

-C:当前命令运行的通道;
–installed:获取当前Peer节点已经被安装的chaincode;
–instantiated:获取当前channel中已经被实例化的chaincode;

5)package:将Chaincode打包;

peer chaincode package —P github.com/hyperledger/fabric/examples/chaincode/go/example  —n mycc —v 1.0 -s —S -i "OR ('Org1MSP.member','Org2MSP.member')" mycc.1.0.out 

-s:对打包后的Chaincode进行签名;
-c:JSON格式的构造参数,默认值是`“{}";
-i:Chaincode的权限;
-l:编写chaincode的编程语言,默认为golang;
-n:Chaincode的名字;
-p:Chaincode源代码的路径;
-S:对打包的文件用本地的MSP进行签名;
-v:当前操作的Chaincode的版本;

6)query:执行chaincode代码中的query方法;

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

-C:当前命令运行的通道;
-c:JSON格式的构造参数,默认值是`“{}";
-x:是否对输出的内容进行编码处理;
-n:Chaincode的名字;
-r:是否输出二进制内容;
-t:指定当前查询的编号;

7)signpackage:对打包好的chaincode进行签名;

peer chaincode signpackage mycc.1.0.out sign_mycc.1.0.out

8)upgrade:更新已经存在的chaincode;

peer chaincode upgrade -o orderer.example.com:7050 -n mycc -v 1.1 -C mychannel -c '{"Args":["init","a","100","b","200"]}'

-C:当前命令运行的通道;
-c:JSON格式的构造参数,默认值是`“{}";
-E:应用于当前Chaincode的系统背书Chaincode的名字;
-l:编写chaincode的编程语言,默认为golang;
-n:Chaincode的名字;
-p:chaincode源代码的名字
-P:当前Chaincode的背书策略;
-v:当前操作的Chaincode的版本;
-V:当前Chaincode调用的验证系统Chaincode的名字;

3.4.4 peer环境变量

配置文件和环境变量是设置peer启动参数的重要手段。

参数名称 参数描述
CORE_VM_ENDPOINT docker服务器的Deamon地址, 默认取端口的套接字 ,比如:CORE_VM_ENDPOINT=unix:///var/run/docker.sock
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE chaincode容器的网络命名模式
CORE_PEER_PROFILE_ENABLED 使用peer内置的 profile server
CORE_LOGGING_LEVEL log日志的级别,它的值可以是:critical | error | warning | notice | info | debug
CORE_PEER_ID peer节点的编号
CORE_PEER_GOSSIP_USELEADERELECTION 是否自动选举leader节点,true代表自动选举,false代表需要手动指定leader节点
CORE_PEER_GOSSIP_ORGLEADER 当前节点是否为leader节点,true代表是,false代表不是
CORE_PEER_ADDRESS 当前peer节点的访问地址
CORE_PEER_CHAINCODELISTENADDRESS chaincode的监听地址
CORE_PEER_GOSSIP_EXTERNALENDPOINT 节点被组织外节点感知时的地址
CORE_PEER_GOSSIP_BOOTSTRAP 启动节点后向哪些节点发起gossip连接, 以加入网络
CORE_PEER_LOCALMSPID peer节点所属的组织的编号
CORE_CHAINCODE_MODE chaincode的运行模式,它的值可以有两个: net: 网络模式,dev: 开发模式
CORE_PEER_MSPCONFIGPATH 当前节点的msp文件路径
CORE_PEER_TLS_ENABLED 是否激活tls
CORE_PEER_TLS_CERT_FILE 服务器身份验证证书,例如:CORE_PEER_TLS_CERT_FILE=crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/server.crt
CORE_PEER_TLS_KEY_FILE 服务器的私钥文件,例如:CORE_PEER_TLS_KEY_FILE=crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/server.key
CORE_PEER_TLS_ROOTCERT_FILE 根服务器证书,例如:CORE_PEER_TLS_ROOTCERT_FILE =crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/ca.crt

3.4.5 peer默认监听的端口

下面是hyperledge fabric默认使用的端口:

  • 7050: REST 服务端口
  • 7051:peer gRPC 服务监听端口
  • 7052:peer CLI 端口
  • 7053:peer 事件服务端口
  • 7054:eCAP
  • 7055:eCAA
  • 7056:tCAP
  • 7057:tCAA
  • 7058:tlsCAP
  • 7059:tlsCAA
发布了111 篇原创文章 · 获赞 41 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/zhongliwen1981/article/details/104273977