fabric peer 本地運(yùn)行
配置單 peer穆咐, 單 order, 單cli 測試環(huán)境字旭,方便調(diào)試 peer
1. 修改配置
1.1 修改配置文件
- configtx.yaml 刪除所有 關(guān)于 Org2 的選項(xiàng)
- 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
兩個(gè)容器的配置
- cli 的配置添加extra_host, 到時(shí)候?qū)⒂蛎赶蛩拗鳈C(jī)
extra_hosts:
- "peer0.org1.example.com:192.168.1.xxx"
1.3 修改 byfn.sh
啟動(dòng)容器后对湃,先不執(zhí)行script.sh
注釋
1.4 修改 script.sh 腳本
- joinChannel 方法替換如下
joinChannel () {
joinChannelWithRetry 0 1
sleep $DELAY
}
- script.sh 中 install or instantiate 都改為對(duì) 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
函數(shù)中 共識(shí)策略改成 "OR ('Org1MSP.peer')"
2 啟動(dòng)
2.1 啟動(dòng)容器(order, cli)
兩個(gè)容器啟動(dòng)無誤后
2.2 debug 模式啟動(dòng) peer
peer 啟動(dòng)會(huì)讀取一系列環(huán)境變量, 從系統(tǒng)讀入遗淳,或者從 core.yml 文件拍柒,為了方便,我們 debug 時(shí)就把用到變量設(shè)置到core.yaml
從 docker-compose
文件中可以看到屈暗,peer 啟動(dòng)需要的一些環(huán)境變量
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 程序中會(huì)將 CORE_PEER_ID
轉(zhuǎn)化成 peer.id
, CORE_PEER_CHAINCODEADDRESS
轉(zhuǎn)化為 peer.chaincodeaddress
等,如下
peer:
id: peer0.org1.example.com
address: peer0.org1.example.com:7051
localMspId: Org1MSP
tls:
cert:
file: ./tls/server.crt
....
這里注意 幾個(gè) 文件的位置斤儿,
tls
的目錄對(duì)應(yīng)到 crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls
這個(gè)目錄。
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
目錄復(fù)制到 sampleconfig2
目錄下往果。修改 core.yaml
的配置如上 2.2 .
peer 啟動(dòng)默認(rèn)用到 /var/hyperledger 目錄存儲(chǔ)。需要提前創(chuàng)建并改權(quán)限
sudo mkdir /var/hyperledger/ && sudo chown tanhui /var/hyperledger
2.4 本機(jī)添加hosts
peer 會(huì)找 orderer 節(jié)點(diǎn)一铅,為本機(jī)添加host
127.0.0.1 orderer.example.com
127.0.0.1 peer0.org1.example.com
最后啟動(dòng) peer
peer node start
2.5 執(zhí)行 script.sh
進(jìn)入 cli 容器
執(zhí)行
./scripts/script.sh mychannel 3 golang 10
如果沒有報(bào)錯(cuò)陕贮, peer
的 debug
環(huán)境就搭好了!
如果 createChannel
的時(shí)候報(bào)錯(cuò)如下
Principal deserialization failure (the supplied identity is not valid: x509: certificate signed by unknown authority) for identity 0
可能是因?yàn)橹?code>docker 容器殘留的數(shù)據(jù)導(dǎo)致潘飘,所以導(dǎo)致證書認(rèn)證失敗肮之。
解決方案:執(zhí)行如下命令刪除卷
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