环境手动搭建步骤三
当前配置后的目录结构
.
├── a.yaml
├── chaincode
│ └── chaincode_example02.go
├── channel-artifacts
│ └── channel.tx
├── channel.tx
├── configtx.yaml
├── crypto-config
│ ├── ordererOrganizations
│ └── peerOrganizations
├── docker-compose-base.yaml
├── docker-compose-cli.yaml
├── genesis.block
├── peer-base.yaml
└── scripts
启动容器
启动容器:docker-compose -f docker-compose-cli.yaml up -d
检测所有的节点是否正常启动:docker-compose -f docker-compose-cli.yaml ps
容器启动之后做的事情:
- 创建通道,得到通道文件.只需要做一次
- peer节点加入到通道中,所有peer都需要加入到通道
- 给peer节点安装链码,所有的peer节点都需要安装链码
- 给链码初始化,在任意一个已经安装好链码的节点上做一次
- 测试:数据查询,数据写操作.
上述所有的操作都是通过客户端节点来完成的
客户端节点启动之后, 执行命令
- 命令被发送给peer或者orderer节点
进入容器
进入到客户端容器
$ docker exec -it cli bash
创建通道
创建通道只需要做1次
# 通道创建操作, 只需要操作一次
# 创建通道的操作执行一次就可以了, 执行完成之后, 会生成一个通道文件
$ peer channel create [flags], 常用参数为:
`-o, --orderer:
创建通道的时候需要orderer参与, 指定orderer节点的地址: orderer.zoo.com:7050
# configtxgen -profile Channel -outputCreateChannelTx channel.tx -channelID zoochannel
`-c, --channelID: 通道的名字, 在configtxgen的时候指定的 channelID
`-f, --file: 创建通道的时候, 加载的文件, 通过configtxgen命令生成的
`--tls: 执行这个命令通信的时候, 是不是需要加密, 如果指定了这个参数就是加密
`--cafile: tls加密的时候, 使用的证书, 这个证书是orderer节点的, 如何找?, 这个文件要使用绝对路径
ordererOrganizations/order组织目录/orderers/orderer节点的目录/msp/tlscacerts/tlsca.zoo.com-cert.pem
# 命令
cafile=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/zoo.com/orderers/orderer.zoo.com/msp/tlscacerts/tlsca.zoo.com-cert.pem
peer channel create -o orderer.zoo.com:7050 -c zoochannel -f ./channel-artifacts/channel.tx --tls --cafile $cafile
# 在客户端容器中ls
$ ls
channel-artifacts crypto `zoochannel.block -> 真正的通道文件
创建通道可能遇到的问题
# 错误1
Error: got unexpected status: BAD_REQUEST -- error authorizing update: error validating ReadSet: readset expected key [Group] /Channel/Application at version 0, but got version 1
# 原因: 通道已经创建出来了, 再次创建该通道
# 第一个启动了一个网络, 关闭(容器也销毁了), 再次启动网络, 创建通道
# 第一次启动网络生成的数据保存在了挂载是数据卷目录, 这些目录没有被删除
# 先关闭当前网络 -> 所有的容器都销毁了
# 删除 没有被删除的数据卷: docker volume prune -> 删除所有缓存的数据卷
# 错误2
error validating DeltaSet: policy for [Group] /Channel/Application not satisfied: Failed to reach implicit threshold of 1 sub-policies, required 1 remaining
# 原因
# 这个问题的原因是用configtxgen生成创始块的时候,配置文件configtx.yaml指定了错误的msp目录。 导致生成
# 的区块中包含的证书其它用户的证书。
# 重新生成证书和创始区块/通道文件
cryptogen generate --config xxx.yaml
configtxgen -profile ......
# 错误3
Error: failed to create deliver client: orderer client failed to connect to myorderer.itcast.com:7050: failed to create new connection: context deadline exceeded
# 原因: 连接 myorderer.itcast.com 失败, 是因为这个域名解析失败了
# 需要通过 extra_hosts声明该域名如何被解析
# extra_hosts:
# - "orderer.zoo.com:192.168.247.203"
会生成真正的通道文件zoochannel.block
,如果是多机器环境,将该文件拷到其他机器上。
加入通道
# 验证客户端操作的节点有没有加入到通道中
# 通过客户端将网络中节点 - peer 加入到通道中
# 当前网络中所有peer节点都需要加入到通道中, 都是通过客户端操作来完成的
$ peer channel join[flags], 常用参数为:
`-b, --blockpath: 指定通过peer channel create 命令生成的这个个xxx.block文件的路径
# 命令
$ peer channel join -b ./zoochannel.block
# 验证
$ peer channel list
2019-07-07 04:00:22.018 UTC [channe