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、执行

upload successful

upload successful



区块链      区块链 hyperledger fabric fabric 网络搭建

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!