Hyperledger Fabric多机搭建
多机搭建前准备
本教程使用的是Ubuntu操作系统,所需要的环境包括docker的安装golang的安装fabric的安装等。
1. 网络结构
我们要搭建一个多机多节点的网络,结构如下。网络中有两个组织分别为org1、org2,每个组织各有一个peer节点,同时还有一个orderer节点。
Orderer
172.17.0.10
orderer.example.com
orderer
Org1peer0
172.17.0.11
peer0.org1.example.com
org1
Org2peer0
172.17.0.12
peer0.org2.example.com
org2
2. 设置网络host
首先右键打开终端,然后使用以下命令,我们在三台虚拟机中分别查看当前虚拟机的IP,其中最后一行为本机IP。
ifconfig其中ens3一栏中的inet地址为本机IP地址。
配置所有服务器网络host,在三台虚拟机中都进行以下操作。
vi /etc/hosts在最后插入(IP与host任意指定,确定后不能更改)。
172.17.0.10 orderer.example.com
172.17.0.11 peer0.org1.example.com
172.17.0.12 peer0.org2.example.com3. ssh配置
在多机搭建的过程中我们会使用到scp命令。Linux scp 命令用于 Linux 之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 Linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
以下内容需要在三台虚拟机中都操作。
安装好ssh后输入以下命令切换到root账户。
输入以下命令设置root账户密码。
输入要修改的root用户密码,输出信息如下:
现在我们就可以使用scp命令来跨主机传输文件了。
生成Fabric证书
1. 创建项目目录
在三台虚拟机上使用以下命令创建相同的项目目录(三台虚拟机项目路径要相同)。
2. 编写证书文件
首先使用以下命令进入项目目录。
使用以下命令将模板文件复制到当前目录下。
将配置文件进行修改,修改如下。
3. 生成证书文件
使用以下命令生成证书文件。
使用ls命令查看生成的文件,可以看到生成了crypto-config文件,这里存放所有的证书文件。
使用scp命令将证书文件复制到其他两台虚拟机中(使用scp命令时会要求输入主机密码)。
复制后使用以下命令在其他两台虚拟机的multinodes目录下查看是否复制成功。
生成通道文件
1. 创世块文件的编写
首先回到orderer节点的虚拟机。
首先我们可以参考官方示例项目test-network中的configtx.yaml配置文件。
将configtx.yaml改为以下内容。
与单节点搭建的区别:
Organizations部分多了Org2的配置。
Profiles的部分创世块名称与通道名称不同。单节点搭建部分为soloOrgsOrdererGenesis和soloOrgsChannel,多节点搭建部分为TwoOrgsOrdererGenesis和TwoOrgsChannel。(创世块名称与通道名称自己任意取,但是后面使用命令生成文件时命令要与配置文件所定义的名称一致)
Profiles部分创世块配置与通道配置中都多加入了Org2。
2. 生成创世块文件和通道文件
使用以下命令生成创世区块。
使用以下命令生成通道文件。
使用以下命令为 Org1 定义锚节点。
使用以下命令为 Org2 定义锚节点。
使用以下命令将生成的文件拷贝到另两台主机(过程中会需要输入宿主机的密码)。
复制后使用以下命令在其他两台虚拟机的multinodes目录下查看是否复制成功。
docker-compose文件编写
在单节点中我们编写过一个docker-compose文件,在其中我们配置了orderer节点与peer节点。在多机部署的时候我们需要为每台虚拟机都编写一个docker-compose文件来配置相应的节点。多机部署与单机部署的配置文件内容大致相同,下面会介绍单机与多机的异同点。
1. orderer节点
使用以下命令在orderer节点的虚拟机的项目路径上创建一个docker-compose.yaml文件。
写入以下内容后,保存退出文件。
与单机搭建的不同:
没有了卷挂载目录
orderer.example.com:/var/hyperledger/production/orderer。单机搭建中的网络名
networks: - example改为extra_hosts:,因为我们是多机搭建有真实的IP,所以网络名称都改为真实的IP地址。
2. org1
Fabric中peer节点的世界状态数据库默认是Leveldb,在这个部分我们将使用Couchdb。
Fabric的状态存储支持可插拔的模式,兼容LevelDB、CouchDB等存储。Fabric使用CouchDB作为状态存储与其他数据库相比具有较多优势:
CouchDB是一种NoSQL解决方案。它是一个面向文档的数据库,其中文档字段存储为键值映射。字段可以是简单的键值对、列表或映射。除了支持类似LevelDB的键控/合成键/键范围查询之外,CouchDB还支持完整的数据富查询功能,比如针对整个区块链数据的非键查询,因为它的数据内容是以JSON格式存储的,并且是完全可查询的。因此,CouchDB可以满足LevelDB不支持的许多用例的链代码、审计和报告需求。
CouchDB还可以增强区块链中的遵从性和数据保护的安全性。因为它能够通过筛选和屏蔽事务中的各个属性来实现字段级别的安全性,并且只在需要时授权只读权限。
CouchDB属于CAP定理的ap类型(可用性和分区公差)。它使用具有最终一致性的主-主复制模型。更多信息可以在CouchDB文档的最终一致性页面上找到。然而,在每个fabric对等点下,没有数据库副本,对数据库的写操作保证一致和持久(而不是最终的一致性)。
CouchDB是Fabric的第一个外部可插入状态数据库,可以而且应该有其他外部数据库选项。例如,IBM为其区块链启用关系数据库。还可能需要cp类型(一致性和分区容忍度)的数据库,以便在不保证应用层的情况下实现数据一致性。
使用以下命令在org1节点的虚拟机的项目路径上创建一个docker-compose.yaml文件。
与单机搭建的不同:
多了couchdb的配置。
peer0节点环境变量多了
CORE_LEDGER_STATE_STATEDATABASE=CouchDB,表示peer0节点的状态数据库采用了couchdb。多了
depends_on: - couchdb0.org1.example.com,表示在couchdb启动后再启动peer0节点。单机搭建中的网络名
networks: - example改为extra_hosts:,因为我们是多机搭建有真实的IP,所以网络名称都改为真实的IP地址。
3. org2
组织二的配置文件与组织一基本相同,唯一不同点是把org1改为org2。
使用以下命令在org2节点的虚拟机的项目路径上创建一个docker-compose.yaml文件。
写入以下内容后,保存退出文件。
使用docker-compose启动服务(三台机器均需要)。
通道操作
本节主要介绍的peer channel命令,peer channel命令主要是用于创建通道以及节点加入通道。
1. 创建通道
使用docker exec命令进入客户端容器(在Org1主机上操作)。
使用以下命令在客户端容器中创建通道(在Org1容器上操作)。
-o,--orderer: orderer节点的地址。-c,--channelID: 要创建的通道的ID, 必须小写, 在250个字符以内。-f,-file: 由configtxgen生成的通道文件, 用于提交给orderer。-t,--timeout: 创建通道的超时时长, 默认为5s。--tls: 通信时是否使用tls加密。--cafile: 当前orderer节点pem格式的tls证书文件, 要使用绝对路径。orderer节点pem格式的tls证书文件路径为:
crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem。
使用ls命令查看生成的文件(在Org1容器上操作)。
使用以下命令将通道文件 mychannel.block 拷贝到宿主机(在Org1主机上操作)。
然后使用以下命令拷贝到其他服务器上用于其他节点加入通道(在Org1主机上操作)。
使用以下命令将通道文件拷贝到容器中(在Org2主机上操作)。
使用以下命令进入 cli容器(在Org2主机上操作)。
2. 加入通道
将每个组织的每个节点都加入到通道中需要客户端来完成,一个客户端同时只能连接一个peer节点, 如果想要该客户端连接其他节点, 那么就必须修改当前客户端中相关的环境变量。我们当前在docker-compose.yaml文件中所配置的cli连接的是Go组织的peer0节点。
使用以下命令让peer0节点加入通道(在Org1和Org2容器上操作)。
-b, --blockpath: block文件路径(通过 peer channel create 命令生成的通道文件)。
输出如下,此时组织的peer0已经加入通道。
3. 更新锚节点
使用以下命令来更新锚节点(在org1容器上操作)。
使用以下命令来更新锚节点(在org2容器上操作)
-o,--orderer:orderer节点的地址。-c,--channelID: 要创建的通道的ID, 必须小写, 在250个字符以内。-f,-file: 由cryptogen生成的锚节点文件。
安装调用智能合约
进入org1虚拟机。
首先我们使用以下命令在项目路径下创建一个文件夹名为chaincode。
然后使用以下命令将官方示例的智能合约复制到我们刚刚创建的chaincode文件夹中。
使用以下命令进入容器。
使用以下命令进入链码所在目录。
使用以下命令设置go语言依赖包。
使用以下命令回到peer目录下。
Fabric生命周期将链码打包在易于阅读的tar文件中,方便协调跨多个组织的安装,使用以下命令打包链码。
使用以下命令退出容器。
使用以下命令将打包好的链码复制到Org2虚拟机中。
在Org2的虚拟机中使用以下命令将打包好的链码复制到cli客户端中。
使用以下命令分别在两个组织的虚拟机上安装链码(Org1和Org2的虚拟机中都要进行以下操作)。
使用以下命令查询链码(Org1和Org2的虚拟机中都要进行以下操作)。
使用以下命令批准链码(Org1和Org2的虚拟机中都要进行以下操作,其中链码的ID要根据上面查询的结果替换到下面的命令中)。
使用以下命令查看链码是否就绪(Org1和Org2的虚拟机中都要进行以下操作)。
使用以下命令提交链码(在组织一或者组织二上)。
使用以下命令将链码初始化。
使用以下命令查询数据。
使用以下命令调用链码,新增数据。
使用以下命令查询数据。
Last updated