fabric-1.1多机多节点部署

目录
一、Fabric原理剖析 2
1.1 Fabric架构 2
1.2 fabric模块 3
1.3 Fabric交易流 3
安装环境: 7
二.单机部署 7
2.1.安装软件 7
2.1.1.安装基础软件 7
2.1.2.添加仓库 8
2.1.3.配置加速器,修改成docker官方的地址 8
2.1.4.安装docker 8
2.1.5.设置开机自启动、启动、停止 8
2.1.6. 安装docker-compose,并赋予执行权限 8
2.1.7.安装go语言 8
2.1.8.安装nodejs,更新yum源: 9
2.2.下载fabric源码 9
2.2.1.下载镜像 10
2.2.2.执行启动命令 11
2.2.3.测试 23
三.多机部署: 24
3.1.主机间网络配置 24
3.2.生成基础配置 25
3.3.复制组织和认证信息 25
3.4.修改配置 26
3.4.1 orderer节点配置 26
3.4.2 peer0.org1节点配置 27
3.4.3 peer.1org1配置 29
3.4.4 peer0.org2配置 29
3.4.5 peer1.org2配置 31
3.5.启动orderer排序节点 31
3.6.启动peer节点 32
3.7.初始化 32
4.测试 32

一、Fabric原理剖析
1.1 Fabric架构
Fabric核心组件,分成三大部分:成员、区块链和交易、链码(智能合约)
成员服务:
主要是针对用户的注册、身份认证管理及审计功能。
区块服务:
通过p2p协议管理分布式账本、点对点的网络和分类存储。
帐链代码:
fabric用Docker容器来运行chaincode服务,启动一个安全容器和安全注册中心。并通过gRPC与启动这个chaincode的Peer节点连接。
页面封装:
提供一个可以交互的客户端。
整体架构如图:

fabric架构图
1.2 fabric模块

1.3 Fabric交易流

典型交易流程图

Fabric交易的整个生命周期可以分为7个阶段,分别是:
黄色框表示只能合约;蓝色和红色矩形框表示子连或者叫通道
第一阶段:
客户端发送交易请求给背书节点,只能合约根据配置的背书策略确定有哪些背书节点进行签名。策略不允许的将不进行背书,如E4、E5

第二阶段:
背书节点使用MSP验证请求的签名是否属于合法用户,如是合法用户将获取请求的数据并与ChainCode的docker示例进行通讯,模拟执行数据的读写操作,并将结果返回给背书节点,并反会给客户端。

第三阶段:
客户端应用验证背书节点签名,然后继续发送背书请求给其他符合要求的背书节点,其交互过程同第二阶段

第四阶段:
客户端验证背书节点的处理结果和签名,检查是否满足背书策略。

第五阶段:
客户端将交易和响应信息封装成一个事务消息,然后广播到共识网络;共识网络根据接受到通道的交易信息按时间和通道处理交易,也就是生成一个区块(生成区块按照文件大小或者是时间来生成区块,并没有优先级)

第六阶段:
共识节点将打包的区块广播到同一个通道上面所有的peer。

第七阶段:
Peers接收到发来的区块后进行几个验证:
1.区块中的交易确保满足背书策略
2.检查区块数据是否正确
3.验证交易的数据是否与State Database的数据版本一致
验证通过后打上合法与非法的标签,并添加到对应的通道上,同时写入状态数据库State Database,并告知客户端交易是否合法。此时交易已经无法更改。

安装环境:
系统版本:CentOS 7.2
docker版本为:19.03.2
docker-compose版本: 1.23.2
Go版本:1.10.1

二.单机部署
2.1.安装软件
2.1.1.安装基础软件
安装依赖软件包
yum -y install ca-certificates curl wget git yum-utils lvm2 gcc gcc-c++
2.1.2.添加仓库
使用docker官方的docker仓库,版本会比较高:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
列出安装的版本:
yum list docker-ce --showduplicates | sort -r #要安装特定版本的Docker CE,请列出repo中的可用版本
2.1.3.配置加速器,修改成docker官方的地址
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://8ad7943c.m.daocloud.io
vi /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com"]}
2.1.4.安装docker
yum -y install docker-ce
2.1.5.设置开机自启动、启动、停止
systemctl enable docker
systemctl start docker
systemctl stop docker
systemctl restart docker
2.1.6. 安装docker-compose,并赋予执行权限
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2.1.7.安装go语言
mkdir -p /home/data/go/{src,pkg,bin}
wget https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz
设置环境变量:
vim ~/.bashrc
export GOROOT=/usr/local/go
export GOPATH=/home/data/code/go //go语言安装路径,按实际路径配置
export GOBIN=$GOROOT/bin
export PATH=$GOPATH/bin:$GOBIN:$PATH
使变量生效
source ~/.bashrc
检查go语言版本

go version

go version go1.10.1 linux/amd64
2.1.8.安装nodejs,更新yum源:
curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -

    yum -y install nodejs
    验证版本
    #Node –v
    v8.16.1
    #npm –v
    6.4.1

2.2.下载fabric源码
mkdir -p $GOPATH/src/github.com/hyperledger/
cd $GOPATH/src/github.com/hyperledger/
git clone https://github.com/hyperledger/fabric.git
cd fabric
git checkout release-1.1
2.2.1.下载镜像
进入目录/fabric/scripts,执行bootstrap.sh,下载docker镜像,下载完成后如:

解析bootstrap.sh执行过程:
脚本内容:分别调用了dockerFabricPull 、dockerCaPull 、dockerThirdPartyImagesPull 三个函数去拉取相应的docker镜像并打标签,最后还通过docker images | grep hyperledger*检查下载的镜像。

下载软件包:通过脚本自动下载,也可以使用浏览器单独下载,但需注意版本要与当前系统一致。
1).curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz | tar xz
2).curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/linux-amd64-1.1.0/hyperledger-fabric-ca-linux-amd64-1.1.0.tar.gz | t ar xz

2.2.2.执行启动命令
镜像下载完后,将该目录下生成的bin目录拷贝到../examples目录下再进入到../examples/e2e_cli目录运行e2e_cli实例,执行命令./network_setup.sh up
1).Bin目录下可执行命令的作用:

2).cd /home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli

执行过程中有报错:Error: Error endorsing chaincode: rpc error: code = Unknown desc = error starting container: API error (404): {"message":"network e2ecli_default not found"}

问题原因:
e2e_cli目录是固定的,启动后会创建一个docker network以此为名字,这里是e2e_cli。如果修改该目录,要修改/home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/base目录下的peer-base.yaml
vi /home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/base/peer-base.yaml

  修改完成后在启动:

中间图省略

完成以后启动的容器:

Fabric执行过程分析,即执行network_setup.sh脚本:

从这个脚本文件可以看出,主要步骤为:
1.执行generateArtifacts.sh

  1. Docker-composeup 目录下的docker-compose-cli.yaml文件

generateCerts:使用cryptogen工具生成秘钥和证书
replacePrivateKey:
根据/home/data/code/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/ca/*_sk修改docker-compose-e2e.yaml文件
generateChannelArtifacts:生成排序创世区块、通道配置文件、生成 组织锚节点配置

docker-compose-e2e.yaml文件,通过service定义了一条规则

如需停止进程,执行
./network_setup.sh down

2.2.3.测试
查询a账户的余额
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

把a账户的余额再转20元给b账户
peer chaincode invoke -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 -c '{"Args":["invoke","a","b","20"]}'

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

三.多机部署:
分布结构:
192.168.59.136 orderer.example.com + cli
192.168.59.137 peer0.org1.example.com +cli
192.168.59.138 peer0.org2.example.com +cli
192.168.59.139 peer1.org1.example.com +cli
192.168.59.140 peer1.org2.example.com +cli

3.1.主机间网络配置
基础网络准备设置主机之间的网络,推荐使用dns服务,hosts文件也可,各台机器内容一致。

3.2.生成基础配置
推荐在一台主机上下载好fabric以后复制到其他机器上,以保证版本一致。所谓的拆分就是将不同的orderer和peer节点分别部署到其他的物理机器上面,实际上就是修改docker-compose-cli.yaml和其相关联的文件,首先生成组织,创世区块和认证信息:sh generateArtifacts.sh mychannel

3.3.复制组织和认证信息
执行完以后会生成crypto-config和channel-artifacts目录内容如下:将这俩个目录分别复制到其他机器

3.4.修改配置
3.4.1 orderer节点配置
生成orderer节点配置文件,复制docker-compose-cli.yaml.bak 改名成docker-compose-orderer.yaml
Orderer部分:

Cli部分:注释掉command部分,后面的初始化用手动方式执行

base/docker-compose-base.yaml修改部分,并且所有的peer节点的端口都改成对应的端口,应为peer分布在不同的机器

base/peer-base.yaml文件修改

3.4.2 peer0.org1节点配置
peer0.org1.example.com节点,复制docker-compose-cli.yaml.bak 改名成docker-compose-cli.yaml

Cli部分

base/docker-compose-base.yaml

base/peer-base.yaml

3.4.3 peer.1org1配置
peer1.org1.example.com节点的修改一样,修改的配置文件也一样。只不过需要注意修改名称和图中框里面的内容

3.4.4 peer0.org2配置
peer0.org2.example.com节点复制docker-compose-cli.yaml.bak 改名成docker-compose-cli.yaml修改docker-compose-cli.yaml

Cli部分

base/docker-compose-base.yaml

base/peer-base.yaml

3.4.5 peer1.org2配置
peer1.org2.example.com配置修改,值得注意的地方就是

3.5.启动orderer排序节点
docker-compose -f docker-compose-orderer.yaml up –d

3.6.启动peer节点
启动其他机器上面的peer,未执行初始化之前只有框里面的容器启动,每个peer节点应该能看到peer和cli容器。
docker-compose -f docker-compose-cli.yaml up –d

3.7.初始化
登录orderer节点的cli容器中,执行初始化执行script.sh脚本,其中定义了创建通道、节点加入通道、下载安装chaincode
初始化chaincode、更新锚点、查询等操作。
docker exec -it cli /bin/bash
./scripts/script.sh mychannel
执行过程与单节点过程一样

4.测试
列出通道peer channel list

获取通道信息peer channel getinfo -c mychannel

链码:peer chaincode list --installed

查询原账户金额
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

转账5元
peer chaincode invoke -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 -c '{"Args":["invoke","a","b","5"]}'

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

上一篇:Fabric1.4:运行 first-network 网络


下一篇:Eureka的一些设计理念介绍