内容简介:部署多机之前,请先下载docker-ce、docker-compose、golang、fabric,并完成基本的配置工作。我的环境配置如下:VM1(10.10.12.30):zookeeper0、kafka0、orderer0、peer0org1、cli
部署多机之前,请先下载docker-ce、docker-compose、golang、fabric,并完成基本的配置工作。
我的环境配置如下:
VM1(10.10.12.30):zookeeper0、kafka0、orderer0、peer0org1、cli
VM2(10.10.12.31):zookeeper1、kafka1、orderer1、peer1org1、cli
VM3(10.10.12.32):zookeeper2、kafka2、orderer2、peer0org2、cli
VM4(10.10.12.33):peer1org2、cli
1.修改configtx.yaml
- 将OrdererType修改成kafka
- 修改Addresses,这里我是设置了三个orderer:orderer0、orderer1、orderer2
- 修改Kafka的Brokers,这里我使用三台虚拟机运行kafka
################################################################################ # # SECTION: Orderer # # - This section defines the values to encode into a config transaction or # genesis block for orderer related parameters # ################################################################################ Orderer: &OrdererDefaults # Orderer Type: The orderer implementation to start # Available types are "solo" and "kafka" OrdererType: kafka Addresses: - orderer0.example.com:7050 - orderer1.example.com:7050 - orderer2.example.com:7050 # Batch Timeout: The amount of time to wait before creating a batch BatchTimeout: 2s # Batch Size: Controls the number of messages batched into a block BatchSize: # Max Message Count: The maximum number of messages to permit in a batch MaxMessageCount: 10 # Absolute Max Bytes: The absolute maximum number of bytes allowed for # the serialized messages in a batch. AbsoluteMaxBytes: 98 MB # Preferred Max Bytes: The preferred maximum number of bytes allowed for # the serialized messages in a batch. A message larger than the preferred # max bytes will result in a batch larger than preferred max bytes. PreferredMaxBytes: 512 KB Kafka: # Brokers: A list of Kafka brokers to which the orderer connects. Edit # this list to identify the brokers of the ordering service. # NOTE: Use IP:port notation. Brokers: - 10.10.12.30:9092 - 10.10.12.31:9092 - 10.10.12.32:9092 # Organizations is the list of orgs which are defined as participants on # the orderer side of the network Organizations:
2.修改crypto-config.yaml
修改 Specs
,设置三个orderer:orderer0、orderer1、orderer2
# --------------------------------------------------------------------------- # "OrdererOrgs" - Definition of organizations managing orderer nodes # --------------------------------------------------------------------------- OrdererOrgs: # --------------------------------------------------------------------------- # Orderer # --------------------------------------------------------------------------- - Name: Orderer Domain: example.com CA: Country: US Province: California Locality: San Francisco # --------------------------------------------------------------------------- # "Specs" - See PeerOrgs below for complete description # --------------------------------------------------------------------------- Specs: - Hostname: orderer0 - Hostname: orderer1 - Hostname: orderer2 # --------------------------------------------------------------------------- # "PeerOrgs" - Definition of organizations managing peer nodes # ---------------------------------------------------------------------------
3.生成channe-artifacts和crypto-config文件
在e2e_cli目录下,打开命令终端,执行如下命令:
./generateArtifacts.sh
执行完毕后,会在e2e_cli目录下生成channel-artifacts和crypto-config两个文件夹。内容分别如下:
channel-artifacts:
channel-artifacts.png
crypto-config/ordererOrgnizations/example.com/orderers目录如下:
orderers.png
生成的channel-artifacts和crypto-config文件夹要拷贝到其他节点,确保不同org使用同一套文件
4.配置zookeeper.yaml
- 创建zookeeper.yaml(我创建了三个zookeeper节点zookeeper0、zookeeper1、zookeeper2,所以也创建了三个配置文件:zookeeper0.yaml、zookeeper1.yaml、zookeeper2.yaml),我们以 zookeeper0.yaml为例说明
- 修改
service
名称为zookeeper0
- 修改
container_name
为zookeeper0
- 修改
-ZOO_MY_ID
等于1
(此ID是zookeeper节点在集群中的唯一标识,不可重复,我定义的是1 、 2 、3) - 修改
extra_hosts
中的zookeeper0
映射的ip为0.0.0.0
(同理zookeeper1/2.yaml文件中zookeeper1/2映射的ip为0.0.0.0
)
# Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # # ZooKeeper的基本运转流程: # 1、选举Leader。 # 2、同步数据。 # 3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。 # 4、Leader要具有最高的执行ID,类似root权限。 # 5、集群中大多数的机器得到响应并follow选出的Leader。 version: '2' services: zookeeper0: #1. 三个配置文件中此处分别为zookeeper0、zookeeper1、zookeeper2 container_name: zookeeper0 #2. 三个配置文件的container_name分别为zookeeper0、zookeeper1、zookeeper2 image: hyperledger/fabric-zookeeper restart: always environment: - ZOO_MY_ID=1 #3. ZOO_MY_ID是zookeeper节点在集群中的唯一标识,不可重复,我分别定义成1 、 2 、3 - ZOO_SERVERS=server.1=zookeeper0:2888:3888 server.2=zookeeper1:2888:3888 server.3=zookeeper2:2888:3888 ports: - "2181:2181" - "2888:2888" - "3888:3888" extra_hosts: - "zookeeper0:0.0.0.0" #zookeeper0.yaml文件中zookeeper0映射的ip改成0.0.0.0, - "zookeeper1:10.10.12.31" - "zookeeper2:10.10.12.32" - "kafka0:10.10.12.30" - "kafka1:10.10.12.31" - "kafka2:10.10.12.32"
5.修改kafka.yaml
- 创建kafka.yaml文件(我创建了3个kafka节点kafka0、kafka1、kafka2,所以也创建了三个配置文件kafka0.yaml、kafka1.yaml、kafka2.yaml), 以kafka0.yaml为例进行说明
-
service
名称修改成kafka0
-
container_name
名称修改成kafka0
- 添加
hostname
,并将名称改为kafka0
- 修改
KAFKA_BROKER_ID=0
(此ID为kafka节点在集群中的唯一标识,不可重复,我定义的是0\1\2)
# Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: kafka0: container_name: kafka0 hostname: kafka0 image: hyperledger/fabric-kafka restart: always environment: - KAFKA_BROKER_ID=0 - KAFKA_MIN_INSYNC_REPLICAS=2 - KAFKA_DEFAULT_REPLICATION_FACTOR=3 - KAFKA_ZOOKEEPER_CONNECT=10.10.12.30:2181,10.10.12.31:2181,10.10.12.32:2181 - KAFKA_MESSAGE_MAX_BYTES=103809024 # 99 * 1024 * 1024 B - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024 # 99 * 1024 * 1024 B - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false ports: - "9092:9092" extra_hosts: - "zookeeper0:10.10.12.30" - "zookeeper1:10.10.12.31" - "zookeeper2:10.10.12.32" - "kafka0:10.10.12.30" - "kafka1:10.10.12.31" - "kafka2:10.10.12.32"
6.修改orderer.yaml
- 创建orderer.yaml(我创建了三个orderer节点:orderer0、orderer1、orderer2,所以也创建了三个orderer配置文件:orderer0.yaml、orderer1.yaml、orderer2.yaml)。 这里以orderer0.yaml为例进行说明
-
service
名称改为orderer0.example.com
-
container_name
名称改为orderer0.example.com
-
ORDERER_KAFKA_BROKERS
集合改成[10.10.12.30:9092,10.10.12.31:9092,10.10.12.32:9092]
(此处为三个kafka节点的地址)
# Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: orderer0.example.com: container_name: orderer0.example.com image: hyperledger/fabric-orderer environment: - ORDERER_GENERAL_LOGLEVEL=debug - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 - ORDERER_GENERAL_GENESISMETHOD=file - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block - ORDERER_GENERAL_LOCALMSPID=OrdererMSP - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp # enabled TLS - ORDERER_GENERAL_TLS_ENABLED=true - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] - ORDERER_KAFKA_RETRY_SHORTINTERVAL=1s - ORDERER_KAFKA_RETRY_SHORTTOTAL=30s - ORDERER_KAFKA_VERBOSE=true - ORDERER_KAFKA_BROKERS=[10.10.12.30:9092,10.10.12.31:9092,10.10.12.32:9092] working_dir: /opt/gopath/src/github.com/hyperledger/fabric command: orderer volumes: - ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block - ../crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp:/var/hyperledger/orderer/msp - ../crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/:/var/hyperledger/orderer/tls ports: - 7050:7050 extra_hosts: - "kafka0:10.10.12.30" - "kafka1:10.10.12.31" - "kafka2:10.10.12.32"
7.修改peer.yaml
- 创建peer.yaml(我创建了2个org,每个org有两个peer,所以相应地创建了四个peer.yaml文件:docker-compose-peer0org1.yaml、docker-compose-peer1org1.yaml、docker-compose-peer0org2.yaml、docker-compose-peer0org2.yaml)。 这里以docker-compose-peer0org1.yaml为例进行说明
- 需要特别说明的是,environment中的路径每个节点未必相同(peer0、peer1、org1、org2)
# Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: peer0.org1.example.com: container_name: peer0.org1.example.com extends: file: base/docker-compose-base.yaml service: peer0.org1.example.com extra_hosts: - "orderer0.example.com:10.10.12.30" - "orderer1.example.com:10.10.12.31" - "orderer2.example.com:10.10.12.32" cli: container_name: cli image: hyperledger/fabric-tools tty: true environment: - GOPATH=/opt/gopath - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_ID=cli - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_LOCALMSPTYPE=bccsp - CORE_PEER_TLS_ENABLED=true - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer # command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT' volumes: - /var/run/:/host/var/run/ - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts depends_on: - peer0.org1.example.com extra_hosts: - "orderer0.example.com:10.10.12.30" - "orderer1.example.com:10.10.12.31" - "orderer2.example.com:10.10.12.32" - "peer0.org1.example.com:10.10.12.30" - "peer1.org1.example.com:10.10.12.31" - "peer0.org2.example.com:10.10.12.32" - "peer1.org2.example.com:10.10.12.33"
8.修改docker-compose-base.yaml
- 将每个节点的端口号改成
- 7051:7051 - 7052:7052 - 7053:7053
# Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: zookeeper: image: hyperledger/fabric-zookeeper restart: always ports: - '2181' - '2888' - '3888' kafka: image: hyperledger/fabric-kafka restart: always environment: - KAFKA_MESSAGE_MAX_BYTES=103809024 # 99 * 1024 * 1024 B - KAFKA_REPLICA_FETCH_MAX_BYTES=103809024 # 99 * 1024 * 1024 B - KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE=false ports: - '9092' orderer.example.com: container_name: orderer.example.com image: hyperledger/fabric-orderer environment: - ORDERER_GENERAL_LOGLEVEL=debug - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 - ORDERER_GENERAL_GENESISMETHOD=file - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block - ORDERER_GENERAL_LOCALMSPID=OrdererMSP - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp # enabled TLS - ORDERER_GENERAL_TLS_ENABLED=true - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] - ORDERER_KAFKA_RETRY_SHORTINTERVAL=1s - ORDERER_KAFKA_RETRY_SHORTTOTAL=30s - ORDERER_KAFKA_VERBOSE=true working_dir: /opt/gopath/src/github.com/hyperledger/fabric command: orderer volumes: - ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls ports: - 7050:7050 peer0.org1.example.com: container_name: peer0.org1.example.com extends: file: peer-base.yaml service: peer-base environment: - CORE_PEER_ID=peer0.org1.example.com - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052 - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP volumes: - /var/run/:/host/var/run/ - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls ports: - 7051:7051 - 7052:7052 - 7053:7053 peer1.org1.example.com: container_name: peer1.org1.example.com extends: file: peer-base.yaml service: peer-base environment: - CORE_PEER_ID=peer1.org1.example.com - CORE_PEER_ADDRESS=peer1.org1.example.com:7051 - CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:7052 - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051 - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP volumes: - /var/run/:/host/var/run/ - ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp - ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls ports: - 7051:7051 - 7052:7052 - 7053:7053 peer0.org2.example.com: container_name: peer0.org2.example.com extends: file: peer-base.yaml service: peer-base environment: - CORE_PEER_ID=peer0.org2.example.com - CORE_PEER_ADDRESS=peer0.org2.example.com:7051 - CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:7052 - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051 - CORE_PEER_LOCALMSPID=Org2MSP volumes: - /var/run/:/host/var/run/ - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp - ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls ports: - 7051:7051 - 7052:7052 - 7053:7053 peer1.org2.example.com: container_name: peer1.org2.example.com extends: file: peer-base.yaml service: peer-base environment: - CORE_PEER_ID=peer1.org2.example.com - CORE_PEER_ADDRESS=peer1.org2.example.com:7051 - CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:7052 - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051 - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051 - CORE_PEER_LOCALMSPID=Org2MSP volumes: - /var/run/:/host/var/run/ - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp - ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls ports: - 7051:7051 - 7052:7052 - 7053:7053
9.按照顺序(zookeeper>kafka>orderer>peer/cli)依次启动相应容器
docker-compose -f zookeeper0.yaml up -d docker-compose -f zookeeper1.yaml up -d docker-compose -f zookeeper2.yaml up -d docker-compose -f kafka0.yaml up -d docker-compose -f kafka1.yaml up -d docker-compose -f kafka1.yaml up -d docker-compose -f orderer0.yaml up -d docker-compose -f orderer1.yaml up -d docker-compose -f orderer2.yaml up -d docker-compose -f docker-compose-peer0org1.yaml up -d docker-compose -f docker-compose-peer1org1.yaml up -d docker-compose -f docker-compose-peer0org2.yaml up -d docker-compose -f docker-compose-peer1org2.yaml up -d
10.修改org1的/scripts/script.sh文件
- 将文件中所有orderer.example.com修改成orderer0.example.com
#!/bin/bash # Copyright London Stock Exchange Group All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # echo echo " ____ _____ _ ____ _____ _____ ____ _____ " echo "/ ___| |_ _| / \ | _ \ |_ _| | ____| |___ \ | ____|" echo "\___ \ | | / _ \ | |_) | | | _____ | _| __) | | _| " echo " ___) | | | / ___ \ | _ < | | |_____| | |___ / __/ | |___ " echo "|____/ |_| /_/ \_\ |_| \_\ |_| |_____| |_____| |_____|" echo CHANNEL_NAME="$1" : ${CHANNEL_NAME:="mychannel"} : ${TIMEOUT:="60"} COUNTER=1 MAX_RETRY=5 ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem PEER0_ORG1_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt PEER0_ORG2_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt ORDERER_SYSCHAN_ID=e2e-orderer-syschan echo "Channel name : "$CHANNEL_NAME verifyResult () { if [ $1 -ne 0 ] ; then echo "!!!!!!!!!!!!!!! "$2" !!!!!!!!!!!!!!!!" echo "================== ERROR !!! FAILED to execute End-2-End Scenario ==================" echo exit 1 fi } setGlobals () { PEER=$1 ORG=$2 if [[ $ORG -eq 1 ]] ; then CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp if [ $PEER -eq 0 ]; then CORE_PEER_ADDRESS=peer0.org1.example.com:7051 else CORE_PEER_ADDRESS=peer1.org1.example.com:7051 fi elif [[ $ORG -eq 3 ]] ; then CORE_PEER_LOCALMSPID="Org3MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/idemix/idemix-config CORE_PEER_LOCALMSPTYPE=idemix else CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp if [ $PEER -eq 0 ]; then CORE_PEER_ADDRESS=peer0.org2.example.com:7051 else CORE_PEER_ADDRESS=peer1.org2.example.com:7051 fi fi env |grep CORE } checkOSNAvailability() { # Use orderer's MSP for fetching system channel config block CORE_PEER_LOCALMSPID="OrdererMSP" CORE_PEER_TLS_ROOTCERT_FILE=$ORDERER_CA CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp local rc=1 local starttime=$(date +%s) # continue to poll # we either get a successful response, or reach TIMEOUT while test "$(($(date +%s)-starttime))" -lt "$TIMEOUT" -a $rc -ne 0 do sleep 3 echo "Attempting to fetch system channel '$ORDERER_SYSCHAN_ID' ...$(($(date +%s)-starttime)) secs" if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then peer channel fetch 0 -o orderer0.example.com:7050 -c "$ORDERER_SYSCHAN_ID" >&log.txt else peer channel fetch 0 0_block.pb -o orderer0.example.com:7050 -c "$ORDERER_SYSCHAN_ID" --tls --cafile $ORDERER_CA >&log.txt fi test $? -eq 0 && VALUE=$(cat log.txt | awk '/Received block/ {print $NF}') test "$VALUE" = "0" && let rc=0 done cat log.txt verifyResult $rc "Ordering Service is not available, Please try again ..." echo "===================== Ordering Service is up and running ===================== " echo } createChannel() { setGlobals 0 1 if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then peer channel create -o orderer0.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx >&log.txt else peer channel create -o orderer0.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA >&log.txt fi res=$? cat log.txt verifyResult $res "Channel creation failed" echo "===================== Channel '$CHANNEL_NAME' created ===================== " echo } updateAnchorPeers() { PEER=$1 ORG=$2 setGlobals $PEER $ORG if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then peer channel update -o orderer0.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx >&log.txt else peer channel update -o orderer0.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA >&log.txt fi res=$? cat log.txt verifyResult $res "Anchor peer update failed" echo "===================== Anchor peers updated for org '$CORE_PEER_LOCALMSPID' on channel '$CHANNEL_NAME' ===================== " sleep 5 echo } ## Sometimes Join takes time hence RETRY atleast for 5 times joinChannelWithRetry () { PEER=$1 ORG=$2 setGlobals $PEER $ORG peer channel join -b $CHANNEL_NAME.block >&log.txt res=$? cat log.txt if [ $res -ne 0 -a $COUNTER -lt $MAX_RETRY ]; then COUNTER=` expr $COUNTER + 1` echo "peer${PEER}.org${ORG} failed to join the channel, Retry after 2 seconds" sleep 2 joinChannelWithRetry $1 else COUNTER=1 fi verifyResult $res "After $MAX_RETRY attempts, peer${PEER}.org${ORG} has failed to join channel '$CHANNEL_NAME' " } joinChannel () { for org in 1 2; do for peer in 0 1; do joinChannelWithRetry $peer $org echo "===================== peer${peer}.org${org} joined channel '$CHANNEL_NAME' ===================== " sleep 2 echo done done } installChaincode () { PEER=$1 ORG=$2 setGlobals $PEER $ORG peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/example02/cmd >&log.txt res=$? cat log.txt verifyResult $res "Chaincode installation on peer peer${PEER}.org${ORG} has Failed" echo "===================== Chaincode is installed on peer${PEER}.org${ORG} ===================== " echo } instantiateChaincode () { PEER=$1 ORG=$2 setGlobals $PEER $ORG # while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful), # lets supply it directly as we know it using the "-o" option if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then peer chaincode instantiate -o orderer0.example.com:7050 -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" >&log.txt else peer chaincode instantiate -o orderer0.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" >&log.txt fi res=$? cat log.txt verifyResult $res "Chaincode instantiation on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' failed" echo "===================== Chaincode is instantiated on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== " echo } chaincodeQuery () { PEER=$1 ORG=$2 setGlobals $PEER $ORG EXPECTED_RESULT=$3 echo "===================== Querying on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME'... ===================== " local rc=1 local starttime=$(date +%s) # continue to poll # we either get a successful response, or reach TIMEOUT while test "$(($(date +%s)-starttime))" -lt "$TIMEOUT" -a $rc -ne 0 do sleep 3 echo "Attempting to Query peer${PEER}.org${ORG} ...$(($(date +%s)-starttime)) secs" peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' >&log.txt test $? -eq 0 && VALUE=$(cat log.txt | egrep '^[0-9]+$') test "$VALUE" = "$EXPECTED_RESULT" && let rc=0 done echo cat log.txt if test $rc -eq 0 ; then echo "===================== Query successful on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== " else echo "!!!!!!!!!!!!!!! Query result on peer${PEER}.org${ORG} is INVALID !!!!!!!!!!!!!!!!" echo "================== ERROR !!! FAILED to execute End-2-End Scenario ==================" echo exit 1 fi } # parsePeerConnectionParameters $@ # Helper function that takes the parameters from a chaincode operation # (e.g. invoke, query, instantiate) and checks for an even number of # peers and associated org, then sets $PEER_CONN_PARMS and $PEERS parsePeerConnectionParameters() { # check for uneven number of peer and org parameters if [ $(( $# % 2 )) -ne 0 ]; then exit 1 fi PEER_CONN_PARMS="" PEERS="" while [ "$#" -gt 0 ]; do PEER="peer$1.org$2" PEERS="$PEERS $PEER" PEER_CONN_PARMS="$PEER_CONN_PARMS --peerAddresses $PEER.example.com:7051" if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "true" ]; then TLSINFO=$(eval echo "--tlsRootCertFiles \$PEER$1_ORG$2_CA") PEER_CONN_PARMS="$PEER_CONN_PARMS $TLSINFO" fi # shift by two to get the next pair of peer/org parameters shift; shift done # remove leading space for output PEERS="$(echo -e "$PEERS" | sed -e 's/^[[:space:]]*//')" } # chaincodeInvoke <peer> <org> ... # Accepts as many peer/org pairs as desired and requests endorsement from each chaincodeInvoke () { parsePeerConnectionParameters $@ res=$? verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters " # while 'peer chaincode' command can get the orderer endpoint from the # peer (if join was successful), let's supply it directly as we know # it using the "-o" option if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then peer chaincode invoke -o orderer0.example.com:7050 -C $CHANNEL_NAME -n mycc $PEER_CONN_PARMS -c '{"Args":["invoke","a","b","10"]}' >&log.txt else peer chaincode invoke -o orderer0.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc $PEER_CONN_PARMS -c '{"Args":["invoke","a","b","10"]}' >&log.txt fi res=$? cat log.txt verifyResult $res "Invoke execution on PEER$PEER failed " echo "===================== Invoke transaction successful on $PEERS on channel '$CHANNEL_NAME' ===================== " echo } # Check for orderering service availablility echo "Check orderering service availability..." checkOSNAvailability # Create channel echo "Creating channel..." createChannel # Join all the peers to the channel echo "Having all peers join the channel..." joinChannel # Set the anchor peers for each org in the channel echo "Updating anchor peers for org1..." updateAnchorPeers 0 1 echo "Updating anchor peers for org2..." updateAnchorPeers 0 2 # Install chaincode on peer0.org1 and peer2.org2 echo "Installing chaincode on peer0.org1..." installChaincode 0 1 echo "Install chaincode on peer0.org2..." installChaincode 0 2 # Instantiate chaincode on peer0.org2 echo "Instantiating chaincode on peer0.org2..." instantiateChaincode 0 2 # Query on chaincode on peer0.org1 echo "Querying chaincode on peer0.org1..." chaincodeQuery 0 1 100 # Invoke on chaincode on peer0.org1 and peer0.org2 echo "Sending invoke transaction on peer0.org1 and peer0.org2..." chaincodeInvoke 0 1 0 2 # Install chaincode on peer1.org2 echo "Installing chaincode on peer1.org2..." installChaincode 1 2 # Query on chaincode on peer1.org2, check if the result is 90 echo "Querying chaincode on peer1.org2..." chaincodeQuery 1 2 90 #Query on chaincode on peer1.org3 with idemix MSP type, check if the result is 90 echo "Querying chaincode on peer1.org3..." chaincodeQuery 1 3 90 echo echo "===================== All GOOD, End-2-End execution completed ===================== " echo echo echo " _____ _ _ ____ _____ ____ _____ " echo "| ____| | \ | | | _ \ | ____| |___ \ | ____|" echo "| _| | \| | | | | | _____ | _| __) | | _| " echo "| |___ | |\ | | |_| | |_____| | |___ / __/ | |___ " echo "|_____| |_| \_| |____/ |_____| |_____| |_____|" echo exit 0
11.选择org1,执行docker exec -it cli bash进入容器
docker exec -it cli bash
进入cli容器后,然后执行
./scripts/script.sh mychannel
依次创建channel,加入channel,安装chaincode,实例化chaincode,转账,查询等操作。结果如下:
end-e2e.png
图中错误是由于script.sh文件中调用到了org3,但是实际部署中我并未设置该组织节点并做相应配置,所以产生了异常,该异常可忽略(可以修改scripts.sh文件)。
为了便于开发,提供配置文件下载链接:
https://pan.baidu.com/s/1LdIUih0jB_At9OEW1VYMwA注意:务必将文件解压到e2e_cli目录下
以上所述就是小编给大家介绍的《Fabric kafka多机部署总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Docker Swarm部署应用的总结
- 【Vue项目总结】项目nginx部署
- 总结—Harbor仓库部署和使用问题集锦
- Spring Boot Tomcat 容器化部署实践与总结
- 每日一博 | Nginx+SSL+Tomcat+CDN 部署总结
- linux 部署golang 项目(直接部署和基于nginx部署)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解OpenCV
[巴西]Daniel Lelis Baggio / 刘波 / 机械工业出版社 / 2014-9 / 59
opencv是最常见的计算机视觉库之一,它提供了许多经过优化的复杂算法。本书对已掌握基本opencv技术同时想提高计算机视觉的实践经验的开发者来讲是一本非常好的书。每章都有一个单独的项目,其背景也在这些章节中进行了介绍。因此,读者可以依次学习这些项目,也可以直接跳到感兴趣的项目进行学习。 《深入理解opencv:实用计算机视觉项目解析》详细讲解9个实用的计算机视觉项目,通过本书的学习,读者可......一起来看看 《深入理解OpenCV》 这本书的介绍吧!