天天看点

Fabric_超详细的fabric网络搭建04-Peer节点相关操作

4.Peer操作

容器启动之后,需要围绕peer节点进行以下操作:

  1. 创建通道(只需操作一次)
  2. 将所有组织的所有节点加入到通道中
  3. 给所有的peer节点安装链码
  4. 链码初始化(只需初始化一次,数据会自动同步到其它节点)
  5. 链码调用

先进入容器

  • docker exec -it cli bash

1.创建通道

peer channel create --help

-o, --orderer string: orderer节点的地址

-c, --channelID: 通道的名字,创建通道文件的时候通过configtxgen指定过

-f, --file string: 指定生成的通道所使用的文件

–tls: 和orderer通信时是否对数据加密,不写或false为不加密,true为加密

–cafile string: orderer的证书,orderer证书的节点目录为/msp/tlscacerts/xxxx.pem , 这个路径必须是绝对路径

在容器中不断地去找cafile的目录,大致过程如下:

Fabric_超详细的fabric网络搭建04-Peer节点相关操作
  • 创建通道
#使用一变量接收路径
tlsfile=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/github.com/msp/tlscacerts/tlsca.github.com-cert.pem
peer channel create -o orderer.github.com:7050 --tls true --cafile $tlsfile -c githubchannel -f ./channel-artifacts/channel.tx
           

orderer.github.com:7050 为orderer节点文件docker-compose-base.yaml中声明的变量

$tlsfile 接收变量的值

-c 通道ID ,之前生成通道文件时configtxgen指定的ID为githubchannel

这时文件夹中会多出来一个githubchannel.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目录。 导致生成的区块中包含的证书其它用户的证书。
# 比如修改了 crypto-config.yaml -> 生成了新的证书
# 解决: 
# 必须要重新生成:创始区块和通道文件 -> configtxgen
           
2.加入通道

peer channel --help

join: 加入通道

list: 查看当前节点加入的通道

peer channel join [flags]

-b, --blockpath string: 加入的通道,这里即githubchannel.block

peer channel join -b githubchannel.block #加入
peer channel list #查看
           
3.锚节点更新

在客户端文件docker-compose-cli.yaml中第89行,由于channel-artifacts文件夹被挂载到了容器内部的,所以在容器也可以看到相关文件,锚节点的更新文件就放在这里.

Fabric_超详细的fabric网络搭建04-Peer节点相关操作
Fabric_超详细的fabric网络搭建04-Peer节点相关操作
  • 更新go组织的peer节点为锚节点(更新cpp组织,需要让客户端连到cpp组织上某个peer节点)
peer channel update -o orderer.github.com:7050 --tls --cafile $tlsfile -c githubchannel -f ./channel-artifacts/goAnchor.tx
           
4.安装链码

peer chaincode install [flags]

-l, --lang string: 链码语言

-n, --name string: 链码的名字

-p, --path string: 链码路径 go链码:相对路径$GOPATH/src; node.js/java链码: 绝对路径

-v, --version string: 链码版本

  • 先将chaincode_example02.go 这个链码文件拷贝到testfabric/chaincode/目录中:
~/hyperledger-fabric/fabric-samples/chaincode/chaincode_example02/go$ cp chaincode_example02.go ~/testfabric/chaincode/
           

因为客户端文件docker-compose-cli.yaml中chaincode文件夹挂载在了容器中,在容器内部可以看到这个go文件

Fabric_超详细的fabric网络搭建04-Peer节点相关操作
Fabric_超详细的fabric网络搭建04-Peer节点相关操作
  • 安装链码:
peer chaincode install -n githubcc -v 1.0 -p github.com/chaincode
           
-p后的路径是gopath/src后的路径

如果得到下面<status:200 payload:“OK”>的结果,说明安装成功

2019-03-10 14:46:11.041 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-03-10 14:46:11.041 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2019-03-10 14:46:11.870 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" > 

           
  • 打包链码:
peer chaincode package -n githubcc -v 1.0 -p github.com/chaincode chaincode.out
           

得到chaincode.out打包文件,之后可以直接使用进行链码的安装

安装代码为:

peer chaincode install 文件名