fabric peer 本地运行
配置单 peer, 单 order, 单cli 测试环境,方便调试 peer
1. 修改配置
1.1 修改配置文件
- configtx.yaml 删除所有 关于 Org2 的选项
- crypto-config.ymal PeerOrgs.Template.Count 改为 1
1.2 修改 docker-compose-cli.yml
删除 peer1.org1.example.com, peer1.org2.example.com, peer0.org2.example.com
等容器(以及依赖)
只留 orderer.example.com
, cli
两个容器的配置
- cli 的配置添加extra_host, 到时候将域名指向宿主机
extra_hosts:
- "peer0.org1.example.com:192.168.1.xxx"
1.3 修改 byfn.sh
启动容器后,先不执行script.sh
注释
1.4 修改 script.sh 脚本
- joinChannel 方法替换如下
joinChannel () {
joinChannelWithRetry 0 1
sleep $DELAY
}
- script.sh 中 install or instantiate 都改为对 peer0.org1 的操作, 如下
if [ "${NO_CHAINCODE}" != "true" ]; then
## Install chaincode on peer0.org1 and peer0.org2
echo "Installing chaincode on peer0.org1..."
installChaincode 0 1
# Instantiate chaincode on peer0.org1
echo "Instantiating chaincode on peer0.org1..."
instantiateChaincode 0 1
# Query chaincode on peer0.org1
echo "Querying chaincode on peer0.org1..."
chaincodeQuery 0 1 100
# Invoke chaincode on peer0.org1 and peer0.org1
echo "Sending invoke transaction on peer0.org1 peer0.org1..."
chaincodeInvoke 0 1
# Query on chaincode on peer1.org1, check if the result is 90
echo "Querying chaincode on peer1.org1..."
chaincodeQuery 0 1 90
fi
utils.sh
(被 script.sh
引用) , instantiateChaincode
函数中 共识策略改成 "OR ('Org1MSP.peer')"
2 启动
2.1 启动容器(order, cli)
两个容器启动无误后
2.2 debug 模式启动 peer
peer 启动会读取一系列环境变量, 从系统读入,或者从 core.yml 文件,为了方便,我们 debug 时就把用到变量设置到core.yaml
从 docker-compose
文件中可以看到,peer 启动需要的一些环境变量
CORE_PEER_ID=peer0.org1.example.com
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LISTENADDRESS=0.0.0.0:7051
CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051
CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID=Org1MSP
CORE_PEER_TLS_ENABLED=true
CORE_PEER_GOSSIP_USELEADERELECTION=true
CORE_PEER_GOSSIP_ORGLEADER=false
CORE_PEER_PROFILE_ENABLED=true
CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
peer 程序中会将 CORE_PEER_ID
转化成 peer.id
, CORE_PEER_CHAINCODEADDRESS
转化为 peer.chaincodeaddress
等,如下
peer:
id: peer0.org1.example.com
address: peer0.org1.example.com:7051
localMspId: Org1MSP
tls:
cert:
file: ./tls/server.crt
....
这里注意 几个 文件的位置,
tls
的目录对应到 crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls
这个目录。
2.3 Goland 下的配置
新建 build config
这里的 working directory
指向的是 sampleconfig2
(sampleconfig 目录拷贝而来), 将 crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls
和 crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp
目录复制到 sampleconfig2
目录下。修改 core.yaml
的配置如上 2.2 .
peer 启动默认用到 /var/hyperledger 目录存储。需要提前创建并改权限
sudo mkdir /var/hyperledger/ && sudo chown tanhui /var/hyperledger
2.4 本机添加hosts
peer 会找 orderer 节点,为本机添加host
127.0.0.1 orderer.example.com
127.0.0.1 peer0.org1.example.com
最后启动 peer
peer node start
2.5 执行 script.sh
进入 cli 容器
执行
./scripts/script.sh mychannel 3 golang 10
如果没有报错, peer
的 debug
环境就搭好了!
如果 createChannel
的时候报错如下
Principal deserialization failure (the supplied identity is not valid: x509: certificate signed by unknown authority) for identity 0
可能是因为之前docker
容器残留的数据导致,所以导致证书认证失败。
解决方案:执行如下命令删除卷
docker-compose -f docker-compose-cli.yaml down --volumes --remove-orphans
sudo docker rm -f $(docker ps -a | grep "hyperledger/*" | awk "{print \$1}")
sudo docker volume prune
我用的材料: first-network.zip