HyperLedger Fabric 1.2多机部署文档

作者: 风 哥 分类: 区块链 发布时间: 2019-05-31 10:46

什么是Hyperledger

  • Hyperledger是Linux基金会于2015年12月发起的一个企业级的开源分布式账本框架。项目旨在共同建立一个开放的区块链技术开源标准,推进跨行业区块链技术。它是一个全球跨行业领导的合作项目,包括金融、银行、物联网、供应链、制造和技术领域。
  • 遵循Apache v2 License开源协议,对商业应用友好
HyperLedger Fabric目前最新版本是v2.0,本文是在2018年的时候基于HyperLedger Fabric 1.2的环境部署文档,由于作者之前忙于区块链的事情并没有把文档及时共享出来,
本文仅仅是记录当时的工作内容,如果你在部署过程中遇到任何问题可以在文章最下方留言。

部署前提

CentOS Linux release 7.5.1804 (Core)
内核版本:3.10.0-862.14.4.el7.x86_64
Docker version 18.06.1-ce
docker-compose version 1.20.0
git version 1.8.3
node version v8.11.1
npm version 5.6.0
go version go1.8.4

说明:当前实验环境4个kafka、3个zookeeper、1个order、4个peer、4个cli

主机规划

基础配置

Yum源更新

# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

执行yum makecache生成缓存,安装epel扩展源
# yum install -y wget
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

 

配置防火墙

关闭SeLinux,配置防火墙

# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

# setenforce 0

# systemctl stop firewalld.service

# systemctl disable firewalld.service

# yum install -y iptables-services && systemctl enable iptables

Git等基础软件准备

# yum install -y vim-enhanced openssh-clients ntpdate man lrzsz net-tools atop tcpdump gcc gcc-c++ telnet lsof unzip tree screen

时间同步任务

# echo "$((RANDOM%60)) $((RANDOM%24)) * * * /usr/sbin/ntpdate time1.aliyun.com" >> /var/spool/cron/root

配置主机名及hosts

修改所有机器的hosts对应记录及hostname主机名

# vim /etc/hostname

# hostname [主机名]

在所有机器中配置hosts

192.168.1.198 orderer.zatgo.net

192.168.1.218 peer0.org1.zatgo.net

192.168.1.200 peer1.org1.zatgo.net

192.168.1.201 peer0.org2.zatgo.net

192.168.1.202 peer1.org2.zatgo.net

192.168.1.203 couchdb-zatgo.net

192.168.1.210 zookeeper1

192.168.1.211 zookeeper2

192.168.1.213 zookeeper3

192.168.1.214 kafka1

192.168.1.215 kafka2

192.168.1.216 kafka3

192.168.1.217 kafka4

 

基础软件部署

1.  GO开发环境设置

从官方下载地址下载最新稳定版本:由于国内原因无法打开golang.org网站,需要自行翻墙

# wget https://dl.google.com/go/go1.11.1.linux-amd64.tar.gz 

# tar -xzf go1.11.1.linux-amd64.tar.gz -C /usr/local

配置环境变量,使用vim /etc/profile.d/go.sh 并添加下面的内容:

export GOPATH=/usr/local/go

export PATH=$PATH:$GOPATH/bin

添加之后使其生效

# source  /etc/profile.d/go.sh

2.  Docker安装

# yum install -y \
yum-utils \
device-mapper-persistent-data \
lvm2


# yum install -y python-pip
# pip install --upgrade pip


添加软件源信息
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum -y install docker-ce
# systemctl enable docker-ce

官方教程https://docs.docker.com/install/linux/docker-ce/centos/

3.  配置镜像加速器

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。

 

国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。

我们以 Docker 官方加速器 https://registry.docker-cn.com 为例进行介绍。

在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在则创建)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}
 # systemctl daemon-reload
# systemctl restart docker

之后重新启动服务

Docker-Compose从 官方 GitHub Release 处直接下载编译好的二进制文件即可https://docs.docker.com/compose/install/#prerequisites

# curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

4.  Node安装

目前不支持Node.js版本9.x.,如果利用Node.js的Hyperledger Fabric SDK开发Hyperledger Fabric的应用程序则需要安装node环境,如果是java语言开发或者其它语言则不需要安装node环境

官方下载地址:https://nodejs.org/en/download/

# wget https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz
# tar xvf node-v8.12.0-linux-x64.tar.xz

#设置环境变量
# vim /etc/profile.d/node.sh
export PATH=$PATH:/usr/local/node-v8-12.0/bin

# source /etc/profile.d/node.sh

# npm install npm@5.6.0 -g

在三台机器上分别下载安装,需要安装jdk相关的环境

5.  zookeeper部署

# wget http://www-us.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
# yum install -y java-1.8.0-openjdk
# tar -xzvf zookeeper-3.4.10.tar.gz
# cd zookeeper-3.4.10/conf
# cp zoo_sample.cfg zoo.cfg

# vim zoo.cfg
#修改内容如下,datadir最好不用放在tmp目录下
dataDir=/tmp/zookeeper
clientPort=2181


#添加节点,注:端口2888,3888不固定
server.0=zookeeper1:2888:3888
server.1=zookeeper2:2888:3888
server.2=zookeeper3:2888:3888

在dataDir目录下创建data目录和myid文件(内容为0)

# 在zookeeper1 master节点上
# mkdir /data/apps-data/zookeeper/data
# echo 0 > /data/apps-data/zookeeper/myid


注:zookeeper1的为0,zookeeper2 的 myid 文件内容为 1,zookeeper3 的 myid 文件内容为 2

6.  kafka部署

在kafka1节点上安装kafka(一个broker)
# wget http://apache.fayea.com/kafka/1.1.1/kafka_2.12-1.1.1.tgz
# tar xvf kafka_2.12-1.1.1.tgz
在kafka1节点上
# cd kafka_2.12-1.1.1/config
# vim server.properties


修改内容
# master为0
broker.id=0


连接zookeeper
zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
可删除topic
delete.topic.enable=true


注:修改每个节点对应的server.properties文件的broker.id, master为0,kafka2为1,kakfa3为2,kafka4内容为3

7.  启动集群和测试

在三台机器上放行防火墙端口

# iptables -I INPUT -p tcp --dport 2181 -j ACCEPT
# iptables -I INPUT -p tcp --dport 2888 -j ACCEPT
# iptables -I INPUT -p tcp --dport 3888 -j ACCEPT
# service iptables save

注:启动时,先启动zookeeper,后启动kafka,关闭时,先关闭Kafka,后关闭zookeeper

分别在每个节点上启动zookeeper

< 20  zookeeper1 - [root]: /usr/local/zookeeper-3.4.10/bin > # ./zkServer.sh start
< 20  zookeeper2 - [root]: /usr/local/zookeeper-3.4.10/bin > # ./zkServer.sh start
< 20  zookeeper3 - [root]: /usr/local/zookeeper-3.4.10/bin > # ./zkServer.sh start


验证zookeeper集群,显示结果为:有一个是 leader,剩下的都是 follower

< 43  zookeeper1 - [root]: /usr/local/zookeeper-3.4.10/bin > # ./zkServer.sh status

ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower


< 32  zookeeper2 - [root]: /usr/local/zookeeper-3.4.10/bin > # ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader   #领导者



< 19  zookeeper3 - [root]: /usr/local/zookeeper-3.4.10/bin > # ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

分别启动4台kafka集群

# iptables -I INPUT -p tcp --dport 9092 -j ACCEPT
# service iptables save
# cd /usr/local/kafka_2.12-1.1.1/bin
# ./kafka-server-start.sh ../config/server.properties &

测试,创建 topic 和 显示 topic 信息,在kafka master节点上执行

# ./kafka-topics.sh --create --zookeeper zookeeper1:2181,zookeeper2:2181,zookeeper3:2181 --replication-factor 3 --partitions 3 --topic test


在master节点上显示topic信息
# ./kafka-topics.sh  --describe  --zookeeper zookeeper1:2181,zookeeper2:2181,zookeeper3:2181 --topic test


Topic:test   PartitionCount:3 ReplicationFactor:3  Configs:
    Topic: test  Partition: 0 Leader: 3    Replicas: 3,1,2  Isr: 3,1,2
    Topic: test  Partition: 1 Leader: 0    Replicas: 0,2,3  Isr: 0,2,3
    Topic: test  Partition: 2 Leader: 1    Replicas: 1,3,0  Isr: 1,3,0


在master节点上列出topic

# ./kafka-topics.sh  --list  --zookeeper zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
test

8.  Overlay跨主机网络通信

  • 在orderer节点下载Cousul二进制包并启动
# wget https://releases.hashicorp.com/consul/0.9.2/consul_0.9.2_linux_amd64.zip
# unzip consul_0.9.2_linux_amd64.zip
# mkdir -p /data/apps/consul/{logs,data}
# mv consul /data/apps/consul
# vim /etc/profile.d/consul.sh

export PATH=$PATH:/data/apps/consul

# source !$

# nohup consul agent -server -bootstrap -ui -data-dir /data/apps/consul/data/ -client=192.168.1.198 -bind=192.168.1.198 & >/data/apps/consul/consul.log &

 

  • 启动后查看consul日志是否有报错
# tailf /data/apps/consul/nohup.out

  • master节点配置Docker守护进程连接Consul
# vim /lib/systemd/system/docker.service

[Service] ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://192.168.1.198:8500 --cluster-advertise 192.168.1.198:2375
  • 保存后重启Docker服务
# systemctl daemon-reload
# systemctl restart docker
# iptables -I INPUT -p tcp --dport 8300,8500,8600 -j ACCEPT
# iptables -I INPUT -p tcp --dport 2375 -j ACCEPT
# service iptables save
  • 在其他节点主机上同样配置Docker守护进程连接Consul
# vim /lib/systemd/system/docker.service

[Service] ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://192.168.1.198:8500 --cluster-advertise 192.168.1.X:2375

//192.168.1.198:8500为Master主机的IP, 而advertise地址的ip地址必须是客户端,否则会导致无法注册到consul中。

  • 运行网络管理工具容器,查看网络状态并测试
# docker run -it busybox

  • 在master上创建overlay网络,zatgo.net服务器
# docker network create -d overlay HZ-VPC
b9e32b338f99b1e22153d0f62ef81db10abec8421338fc4e985542161ac7644d

我们在Master节点上创建overlay网络后会自动同步到所有的docker 节点上面

  • 接下来用Ping测试两台主机之间网络是否通信,在Order节点上测试。
# docker run -it --net=HZ-VPC busybox

部署Fabric 1.2

二进制下载

Fabric可以使用源码或者使用二进制安装,首先需要创建存放的目录,使用git克隆完整的源码

# mkdir -p $GOPATH/src/github.com/hyperledger
# cd $GOPATH/src/github.com/hyperledger
# git clone https://github.com/hyperledger/fabric-samples.git
# git branch
* release-1.3

# git checkout release-1.2
# cd go/src/github.com/hyperledger/ fabric-samples

执行脚本下载镜像

安装fabric-sample,执行bootstrap.sh脚本

# cd $GOPATH/src/github.com/hyperledger/fabric-samples
# sh ./scripts/bootstrap.sh

# ==> List out hyperledger docker images

多机网络部署

单机部署没问题后,我们按照文档最开始的部署规划来进行各节点的部署,关于多机部署里面的坑还是非常的之多。

总结:这里要保证宿主机和docker的端口映射要一致,可以避免很多坑。

整个网络部署的思路如下:

 

  • 单机部署成功后把环境清理干净(务必清理干净,否则会影响下一步的操作。)
  • 在其中的一台节点先根据examples拷贝一份examples_back,接下来所有的操作变更都会在examples文件夹中进行
  • 利用release/linux-amd64/bin/ 生成组件和节点证书、密钥、通道配置等相关的初始配置信息。

  • 把修改的examples分发的其他的节点机器
  • 再启动orderer、sp0-sp3节点
  • 再进入cli容器内部,执行通道的创建、节点加入、链码安装、初始化、交易、查询等操作,验证网络是否构建成功。

修改配置文件内容

多机部署和单机部署不同之处就是主要是修改配置文件,进行拆分部署。

  1. 替换域名com为zatgo.net
  2. 替换对应端口
  3. 由于docker多主机之间默认是无法通信的,上面使用了docker overlay+consul实现跨主机通信,方便下一步更快捷部署。
# vim fabric/examples/e2e_cli/configtx.yaml

:1,$s#example.com#zatgo.net#g

该配置文件包含一个Orderer节点以及证书生成的数量,每个组织生成两个peer和一个users用户

配置Orderer节点创世区块

-通过配置文件 configtx.yaml 配置ordere 节点启动需要的创始区块信息,以及新建应用通道的交易信息。配置文件内容如下:

替换域名example.com为zatgo.net,Fabric1.2版本中将原来默认的solo已经改为kafka共识

需要修改base目录下面的peer-base.yaml,将网络改为上面我们创建的overlay网络

需要修改base目录下面的docker-compose-base.yaml 将里面的域名example.com更改为zatgo.net,将端口改成一致的。同时注释掉zookeeper、kafka相关的代码

docker-compose-orderer.yaml文件,红色的框内需要修改,域名需要修改。

docker-compose-pee0.yaml文件, 下面的配置文件域名example.com替换成zatgo.net

docker-compose-pee1.yaml文件,这里需要连接到peer0服务,因为是同一个org1

docker-compose-pee2.yaml文件

docker-compose-pee3.yaml配置文件,需要连接到org2

配置couchdb状态数据库

docker-compose-couch.yaml 配置文件内容如下,volumes配置数据持久化保存

在couchdb-zatgo.net机器启动couchdb

# docker-compose -f docker-compose-couch.yaml up -d

# docker ps -a

couchDBSddress需要配置为指向由peer使用的couchdb,如果配置了用户名和密码,也必须指定管理员用户和密码

启动后我们打开浏览器,访问IP + 5984端口的URL,比如我的Linux是192.168.1.203,那么URL是:http://192.168.1.203:5984/_utils这个时候我们就可以看到CouchDB的Web管理界面了。输入用户名admin密码password即可进入。

在peer0-peer3四个配置文件中增加以下变量,并将端口一一对应

peer0 – 5984

peer1 – 6984

peer2 – 7984

peer3 – 8984

docker-compose-cli.yaml配置文件主要也是修改域名example.com替换成zatgo.net,加入networks : HZ-VPC  overlay网络

生成公私钥、证书、创世区块

公私钥和证书是用于 Server 和 Server 之间的安全通信,另外要创建 Channel 并让其他节点加入 Channel 就需要创世区块,这些必备文件都可以一个命令生成,官方已经给出了脚本:

  • 生成公私钥和证书
# 确保你当前的目录在examples/e2e_cli

# ./../../release/$os_arch/bin/cryptogen generate --config=./crypto-config.yaml

  • 生成创世区块
# 确保你当前的目录在examples/e2e_cli

# ./../../release/$os_arch/bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

a)  生成通道配置区块

# ../../release/linux-amd64/bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel

注:通道名可以自定义,一旦自定义后续加入通道这个操作就不能使用其它通道名。

在通道上为Org1定义锚点对等点:

# ./../../release/linux-amd64/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP

在通道上为Org2定义锚点对等点:

# ./../../release/linux-amd64/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

在通道上为Org3定义锚点对等点:

# ./../../release/linux-amd64/bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org3MSPanchors.tx -channelID mychannel -asOrg Org3MSP

运行这个命令后,将会创建两个目录 channel-artifacts 和crypto-config,里面包含了 mychannel 这个通道相关的文件, crypto-config 文件夹里面包含了各个节点的公私钥和证书和config.tx的信息。

注:停止网络会停止所有的服务,并删除相关生成的节点或组织证书/密钥等。

分发配置文件

# cd ~/go/src/github.com/hyperledger/fabric

# tar cvf examples.tar.gz  examples

# salt '*' cp.get_file salt://examples.tar.gz /usr/local/

启动环境

启动orderer节点

# cd /usr/local/examples/e2e_cli/

# docker-compose -f docker-compose-orderer.yaml up -d
  • 启动完毕可查看启动日志,无报错则启动正常。
# docker logs -f orderer.zatgo.net

启动sp0/sp3/cli等四个节点

< 1  peer0.org1.zatgo.net - [root]: ~ > #

# cd /usr/local/examples/e2e-cli/

# docker-compose -f docker-compose-peer0.yaml up -d

 

< 1  peer1.org1.zatgo.net - [root]: ~ > #

# cd /usr/local/examples/e2e-cli/

# docker-compose -f docker-compose-peer1.yaml up -d

 

< 1  peer0.org2.zatgo.net - [root]: ~ > #

# cd /usr/local/examples/e2e-cli/

# docker-compose -f docker-compose-peer2.yaml up -d

 

< 1  peer1.org2.zatgo.net - [root]: ~ > #

# cd /usr/local/examples/e2e-cli/

# docker-compose -f docker-compose-peer3.yaml up -d

启动完毕可查看启动日志,无报错则正常。可通过docker ps -a 看到两个正在运行的容器。

关闭集群

关闭后所有的数据将会丢失,为了避免数据丢失因此需要配置数据的持久化保存。

# cd /usr/local/examples/e2e-cli/

# docker-compose -f docker-compose-*****.yaml down

创建Channel通道

# docker exec -it cli bash

# ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/zatgo.net/orderers/orderer.zatgo.net/msp/tlscacerts/tlsca.zatgo.net-cert.pem



peer channel create -o orderer.zatgo.net:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --tls --cafile $ORDERER_CA

执行后会生成一个创世区块mychannel.block并保存到当前目录。

下面将对4个peer分别执行joinChannel命令,通过初始区块mychannel.block加入channel

Peer节点加入Channel通道

# peer channel join -b mychannel.block

 

 

couchdb数据库中已经创建了名为mychannel的数据库,接下来保存mychannel.block文件并把该文件分发到其它peer节点

#root@e6b17fa75fb9:/opt/gopath/src/github.com/hyperledger/fabric/peer# exit

# docker cp e6b17fa75fb9:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block /usr/local/e2e_cli/

更新锚节点

# peer channel update -o orderer.zatgo.net:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA

 

这里需要注意的是如果$CORE_PEER_TLS_ENABLED=false或者为空,则不需要加上$CORE_PEER_TLS_ENABLED参数

安装链码,智能合约

# docker exec -it cli bash

# peer chaincode install -n feiba05 -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/example05

日志信息返回OK则表示链码安装成功, couchdb也会创建一个数据库

2018-11-06 08:25:20.092 UTC [chaincodeCmd] install -> INFO 051 Installed remotely response:<status:200 payload:”OK” >

实例化链码, 智能合约

在任意一个peer节点执行一次就行。

# ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations

/zatgo.net/orderers/orderer.zatgo.net/msp/tlscacerts/tlsca.zatgo.net-cert.pem



peer chaincode instantiate -o orderer.zatgo.net:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C mychannel -n feiba05 -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR    ('Org1MSP.member','Org2MSP.member')"

交易查询

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

查询a成功结果如下图所示:

交易转账

数据持久化配置

# peer chaincode invoke --tls --cafile $ORDERER_CA -C mychannel -n feiba02 -c '{"Args":["invoke","a","b","10"]}'

 

1.   遇到的坑

./generateArtifacts.sh mychannel

执行上面的命令可能会报错,复制# cp -av scripts/fabric-samples/bin/* release/linux-amd64/bin/ 在执行即可

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。如果修改该目录,要修改/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/base目录下的peer-base.yaml
将网络名改成如下名称即可
– CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2e_cli_default

 

在初始化链码的时候提示找不到目录

如果提示以下错误信息,检查容器目录中是否有对应文件,chaincode指向上一级目录即可,非指定文件。

Error getting chaincode code chaincode: path to chaincode does not exist

解决方法 在dokcer-compose-peer0.yaml里面定义正确的目录

– ../chaincode/chaincode_example02/go/:/opt/gopath/src/github.com/chaincode/chaincode_example02/go

启动网络的时候找不到主机,检查容器之间是否通信,telnet是否正常,iptables是否开启

connect to orderer.example.com:7050: failed to create new connection: context deadline exceeded

错误:  Error while dialing dial tcp 192.168.1.3:7051: getsockopt: no route to host”; Reconnecting to {peer0.org1.example.com:7051 <nil>}

 

同时也要在/etc/hosts 添加对应映射关系,在docker-compose-peer0.yaml  volumes挂载 – /etc/hosts:/etc/hosts

参考文档

https://jira.hyperledger.org/browse/FAB-8731?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel

此情况已经存在链码  docker stop $(docker ps -aq)

Docker rm $(docker ps -aq)

error starting container: API error (404): {“message”:”network e2ecli_default not found”}

解决方法:修改成自定义的网络,用于多主机之间相互通信.

错误1:连接orderer0:7050 grpc超时的错误。

解决方法:

要正常运行,其实还要改docker-compose.yaml文件里的把凡是有CORE_PEER_COMMITTER_LEDGER_ORDERER的这行注释去掉,并且写上orderer0容器的ip地址。例如:

CORE_PEER_COMMITTER_LEDGER_ORDERER=172.18.0.2:7050

并且不能去掉cli里#-CORE_PEER_TLS_SERVERHOSTOVERRIDE=peer0这一行的注释,去掉之后也会出现连接orderer0:7050超时的错误。

彻底解决方法:把vmvare的网络模式由nat模式改成桥接模式可以解决。

 

 

错误:部署chaincode时报错Illegal file modedetected for file

017-03-2213:29:48.699 UTC [msp] Sign -> DEBU 00a Sign: digest:C79CB7C198790F862134F9037DA1B64F1A95E534A745D393B64C214A3F1730C7

Error:Error endorsing chaincode: rpc error: code = 2 desc = Illegal file modedetected for filesrc/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02.go:100766

 

 

解决方法:

因为源码里对chaincode的文件权限有严格控制,必须要求全部都是666,也就是rw权限,没有x的执行权限。(也对,不然太高权限是不安全的)源码里有说明

所以要在examples的chaincode目录下执行:

chmod–R 666 go 把所有的智能合约文件权限改为666

 

错误:找不到镜像

解决方法:

下载docker pull  hyperledger/fabric-baseos:x86_64-0.3.0镜像

下载docker pull hyperledger/fabric-ccenv:x86_64-1.0.0-alpha 镜像,并tag为latest

Docker logs cli

成功运行的结果截图

发表评论

电子邮件地址不会被公开。 必填项已用*标注