1、前提
1.1 、本机已安装docker,go
1.2 、已经拉取 Hyperledger Fabric 镜像
1.3 、Hyperledger Fabric 二进制已经在 $PATH中
2、脚本
testret(){
if [ $1 -ne 0 ]; then
exit 1;
fi
printf "\033[36m \t\t\t [OK] \033[0m\n"
}
unsetenv(){
unset FABRIC_CFG_PATH
unset CORE_PEER_LOCALMSPID
unset CORE_PEER_ADDRESS
unset CORE_PEER_MSPCONFIGPATH
}
TEST_HOME=$(cd $(dirname $0); pwd)
printf '%s%s\n' 'WORK DIR:' $TEST_HOME
PEER_PIDS=$(ps -ef|grep 'peer node start'|grep -v grep|awk '{print $2}')
if [ -n "$PEER_PIDS" ]; then
printf '%-50s' '停止PEER进程'
kill -9 $PEER_PIDS
testret $?
fi
sleep 2s
ORDER_PID=$(ps -ef|grep 'orderer start'|grep -v grep|awk '{print $2}')
if [ -n "$ORDER_PID" ]; then
printf '%-50s' '停止ORDERER进程'
kill -9 $ORDER_PID
testret $?
fi
sleep 2s
EXPLORE_PID=$(ps -ef|grep 'node main.js name - hyperledger-explorer'|grep -v grep|awk '{print $2}')
if [ -n "$EXPLORE_PID" ]; then
printf '%-46s' '停止 FABRIC EXPPLORER'
cd $TEST_HOME/blockchain-explorer
nohup ./stop.sh > /dev/null 2>&1 &
testret $?
fi
sleep 2s
printf '%-50s' '清理证书文件'
rm -fr $TEST_HOME/config/crypto-config/\*
testret $?
printf '%-50s' '清理数据文件'
rm -rf rm -fr $TEST_HOME/test/data/\*
testret $?
IMG_IDS=$(docker ps -a|grep -E 'dev-peer|devairwh-peer'|awk '{print $1}')
if [ -n "$IMG_IDS" ]; then
printf '%-50s' '停止链码容器'
docker stop $(docker ps -a|grep -E 'dev-peer|devairwh-peer'|awk '{print $1}') > /dev/null 2>&1
testret $?
fi
IMG_IDS=$(docker ps -a|grep -E 'dev-peer|devairwh-peer'|awk '{print $1}')
if [ -n "$IMG_IDS" ]; then
printf '%-50s' '删除链码容器'
docker rm $(docker ps -a|grep -E 'dev-peer|devairwh-peer'|awk '{print $1}') > /dev/null 2>&1
testret $?
fi
IMG_IDS=$(docker images -a|grep -E 'dev-peer|devairwh-peer'|awk '{print $3}')
if [ -n "$IMG_IDS" ]; then
printf '%-50s' '清除链码镜像'
docker rmi $(docker images -a|grep -E 'dev-peer|devairwh-peer'|awk '{print $3}') > /dev/null 2>&1
testret $?
fi
printf '%-50s' '生成证书文件'
cryptogen generate --config $TEST_HOME/config/crypto-config.yaml --output $TEST_HOME/config/crypto-config > /dev/null 2>&1
testret $?
sleep 2s
printf '%-50s' '1,创建系统创世快'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/config/order
configtxgen -profile SampleSingleMSPSolo -outputBlock $TEST_HOME/test/data/orderer.genesis.block -channelID sys-security > /dev/null 2>&1
testret $?
printf '%-50s' '2,创建通道创世快'
configtxgen -profile SampleSingleMSPSoloChannel -outputCreateChannelTx $TEST_HOME/test/data/securityCheck.channel.tx -channelID securitycheck > /dev/null 2>&1
testret $?
printf '%-50s' '3,生成锚点文件 njairport'
configtxgen -profile SampleSingleMSPSoloChannel -outputAnchorPeersUpdate $TEST_HOME/test/data/njairportMSPanchors.tx -channelID securitycheck -asOrg njairport > /dev/null 2>&1
testret $?
printf '%-50s' '4,生成锚点文件 airwh'
configtxgen -profile SampleSingleMSPSoloChannel -outputAnchorPeersUpdate $TEST_HOME/test/data/airwhMSPanchors.tx -channelID securitycheck -asOrg airwh > /dev/null 2>&1
testret $?
printf '%-46s' '5,启动orderer'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/order
nohup orderer start > ./logs/orderer.log 2>&1 &
testret $?
printf '%-46s' '6,启动 peer0 njairport'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer0/
nohup peer node start > $TEST_HOME/logs/njairport-peer0.log 2>&1 &
testret $?
printf '%-46s' '7,启动 peer1 njairport'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer1
nohup peer node start > $TEST_HOME/logs/njairport-peer1.log 2>&1 &
testret $?
printf '%-46s' '8,启动 peer0 airwh'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/airwh/peer0/
nohup peer node start > $TEST_HOME/logs/airwh-peer0.log 2>&1 &
testret $?
printf '%-46s' '9,启动 peer1 airwh'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/airwh/peer1
nohup peer node start > $TEST_HOME/logs/airwh-peer1.log 2>&1 &
testret $?
printf '%-46s\n\t%-42s' '10,创建通道' '等待orderer进程启动'
LISTENSTATUS=1
while [ $LISTENSTATUS -ne 0 ]
do
sleep 1s
netstat -an|grep 7050|grep LISTEN > /dev/null 2>&1
LISTENSTATUS=$?
done
unsetenv
export CORE_PEER_LOCALMSPID=airwh
export FABRIC_CFG_PATH=$TEST_HOME/test/config/airwh/peer0/
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/airwh.com/users/Admin@airwh.com/msp
peer channel create -o orderer.cares.sh.cn:7050 -c securitycheck -f $TEST_HOME/test/data/securityCheck.channel.tx --outputBlock $TEST_HOME/test/data/securitycheck.block > /dev/null 2>&1
testret $?
printf '%-50s' '11,airwh peer0 加入通道'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/airwh/peer0/
export CORE_PEER_LOCALMSPID=airwh
export CORE_PEER_ADDRESS=peer0.airwh.com:7053
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/airwh.com/users/Admin@airwh.com/msp/
peer channel join -b $TEST_HOME/test/data/securitycheck.block > /dev/null 2>&1
testret $?
printf '%-50s' '12,airwh peer1 加入通道'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/airwh/peer1
export CORE_PEER_LOCALMSPID=airwh
export CORE_PEER_ADDRESS=peer1.airwh.com:7056
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/airwh.com/users/Admin@airwh.com/msp/
peer channel join -b $TEST_HOME/test/data/securitycheck.block > /dev/null 2>&1
testret $?
printf '%-50s' '13,njairport peer0 加入通道'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer0
export CORE_PEER_LOCALMSPID=njairport
export CORE_PEER_ADDRESS=peer0.njairport.com:7051
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/
peer channel join -b $TEST_HOME/test/data/securitycheck.block > /dev/null 2>&1
testret $?
printf '%-50s' '14,njairport peer1 加入通道'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer1
export CORE_PEER_LOCALMSPID=njairport
export CORE_PEER_ADDRESS=peer1.njairport.com:8051
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/
peer channel join -b $TEST_HOME/test/data/securitycheck.block > /dev/null 2>&1
testret $?
printf '%-50s' '15,更新锚节点 njairport'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer0
export CORE_PEER_LOCALMSPID=njairport
export CORE_PEER_ADDRESS=peer0.njairport.com:7051
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/
peer channel update -o orderer.cares.sh.cn:7050 -c securitycheck -f $TEST_HOME/test/data/njairportMSPanchors.tx > /dev/null 2>&1
testret $?
printf '%-50s' '16,更新锚节点 airwh'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/airwh/peer0
export CORE_PEER_LOCALMSPID=airwh
export CORE_PEER_ADDRESS=peer0.airwh.com:7053
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/airwh.com/users/Admin@airwh.com/msp/
peer channel update -o orderer.cares.sh.cn:7050 -c securitycheck -f $TEST_HOME/test/data/airwhMSPanchors.tx > /dev/null 2>&1
testret $?
## java 链码部署需要下载依赖,编译较慢 这里用go链码快速演示 go链码依赖于 $GOPATH
printf '%-50s' '17,部署链码 peer0 njairport'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer0/
export CORE_PEER_LOCALMSPID=njairport
export CORE_PEER_ADDRESS=peer0.njairport.com:7051
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/
peer chaincode install -n test -v 1.0 -p chaincode_example02 -l golang > /dev/null 2>&1
testret $?
printf '%-50s' '18,部署链码 peer0 airwh'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/airwh/peer0/
export CORE_PEER_LOCALMSPID=airwh
export CORE_PEER_ADDRESS=peer0.airwh.com:7053
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/airwh.com/users/Admin@airwh.com/msp/
peer chaincode install -n test -v 1.0 -p chaincode_example02 -l golang > /dev/null 2>&1
testret $?
printf '%-50s' '19,实例化链码 peer0 njairport a=200,b=200'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer0/
export CORE_PEER_LOCALMSPID=njairport
export CORE_PEER_ADDRESS=peer0.njairport.com:7051
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/
peer chaincode instantiate -o orderer.cares.sh.cn:7050 -C securitycheck -n test -l golang -v 1.0 -c '{"Args":["init","a","200","b","200"]}' -P "OR ('airwh.member','njairport.member')" > /dev/null 2>&1
testret $?
printf '%-46s\n\t%-42s' '20, peer0 njairport 写入数据 a 转给 b 5' '等待链码容器部署'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer0/
export CORE_PEER_LOCALMSPID=njairport
export CORE_PEER_ADDRESS=peer0.njairport.com:7051
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/
IMGSTATUS=1
while [ $IMGSTATUS -ne 0 ]
do
ps -ef|grep 'chaincode -peer.address=peer0.njairport.com:7052'|grep -v grep > /dev/null 2>&1
IMGSTATUS=$?
done
sleep 10s
peer chaincode invoke -o orderer.cares.sh.cn:7050 -C securitycheck -n test -c '{"Args":["invoke","a","b","5"]}' > /dev/null 2>&1
testret $?
printf '%-50s' '21,peer0 njairport 查询数据 a 的值'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/njairport/peer0/
export CORE_PEER_LOCALMSPID=njairport
export CORE_PEER_ADDRESS=peer0.njairport.com:7051
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/
sleep 3s
peer chaincode query -C securitycheck -n test -c '{"Args":["query","a"]}'
printf '%-46s' ''
testret $?
printf '%-50s' '22,peer0 njairport 查询数据 b 的值'
peer chaincode query -C securitycheck -n test -c '{"Args":["query","b"]}'
printf '%-46s' ''
testret $?
printf '%-50s' '23,peer0 airwh 查询数据 a 的值'
unsetenv
export FABRIC_CFG_PATH=$TEST_HOME/test/config/airwh/peer0/
export CORE_PEER_LOCALMSPID=airwh
export CORE_PEER_ADDRESS=peer0.airwh.com:7053
export CORE_PEER_MSPCONFIGPATH=$TEST_HOME/config/crypto-config/peerOrganizations/airwh.com/users/Admin@airwh.com/msp/
peer chaincode query -C securitycheck -n test -c '{"Args":["query","a"]}'
printf '%-46s' ''
testret $?
printf '%-50s' '24,peer0 airwh 查询数据 b 的值'
peer chaincode query -C securitycheck -n test -c '{"Args":["query","b"]}'
printf '%-46s' ''
testret $?
docker ps|grep 'hyperledger/explorer-db' > /dev/null
if [ $? -eq 0 ]; then
docker exec -it -u postgres postgresql dropdb fabricexplorer > /dev/null
sleep 1s
docker exec -it -u postgres postgresql /opt/createdb.sh > /dev/null
sleep 1s
rm -fr $TEST_HOME/blockchain-explorer/wallet/\*
PRE_KEY=`cat $TEST_HOME/blockchain-explorer/app/platform/fabric/connection-profile/first-network.json |grep -e "$TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/keystore/"|awk -F / '{print $NF}'|awk -F \" '{print $1}'`
if [ -n "PRE_KEY" ]; then
CUR_KEY=`ls $TEST_HOME/config/crypto-config/peerOrganizations/njairport.com/users/Admin@njairport.com/msp/keystore/`
sed -i "s#$PRE_KEY#$CUR_KEY#g" $TEST_HOME/blockchain-explorer/app/platform/fabric/connection-profile/first-network.json
cd $TEST_HOME/blockchain-explorer
nohup ./start.sh > /dev/null 2>&1 &
fi
fi
printf '%-50s\n' 'Hyperledger Fabric 简易网络搭建成功'
3、执行
区块链 区块链 hyperledger fabric fabric 网络搭建
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!