mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 15:35:09 +00:00
FAB-18015 (#214)
Remove first network sample if Fabric 2.2 Signed-off-by: NIKHIL E GUPTA <negupta@us.ibm.com> Co-authored-by: NIKHIL E GUPTA <negupta@us.ibm.com>
This commit is contained in:
parent
a42bbba2c5
commit
adfef198df
28 changed files with 0 additions and 3242 deletions
|
|
@ -1,2 +0,0 @@
|
|||
COMPOSE_PROJECT_NAME=net
|
||||
IMAGE_TAG=latest
|
||||
8
first-network/.gitignore
vendored
8
first-network/.gitignore
vendored
|
|
@ -1,8 +0,0 @@
|
|||
/channel-artifacts/*.tx
|
||||
/channel-artifacts/*.block
|
||||
/crypto-config/*
|
||||
/ledgers
|
||||
/ledgers-backup
|
||||
/channel-artifacts/*.json
|
||||
/org3-artifacts/crypto-config/*
|
||||
/connection-*.*
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
## Build Your First Network (BYFN)
|
||||
|
||||
The directions for using this are documented in the Hyperledger Fabric
|
||||
["Build Your First Network"](http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html) tutorial.
|
||||
|
||||
*NOTE:* After navigating to the documentation, choose the documentation version that matches your version of Fabric
|
||||
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
|
||||
orderer.example.com:
|
||||
container_name: orderer.example.com
|
||||
extends:
|
||||
file: peer-base.yaml
|
||||
service: orderer-base
|
||||
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
|
||||
- orderer.example.com:/var/hyperledger/production/orderer
|
||||
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_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
|
||||
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
|
||||
- peer0.org1.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 7051:7051
|
||||
|
||||
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:8051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:8051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:8052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:8051
|
||||
- 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
|
||||
- peer1.org1.example.com:/var/hyperledger/production
|
||||
|
||||
ports:
|
||||
- 8051:8051
|
||||
|
||||
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:9051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:9051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:9052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:9052
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:9051
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:10051
|
||||
- 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
|
||||
- peer0.org2.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 9051:9051
|
||||
|
||||
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:10051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:10051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:10052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:10052
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:10051
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:9051
|
||||
- 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
|
||||
- peer1.org2.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 10051:10051
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
peer-base:
|
||||
image: hyperledger/fabric-peer:$IMAGE_TAG
|
||||
environment:
|
||||
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
|
||||
# the following setting starts chaincode containers on the same
|
||||
# bridge network as the peers
|
||||
# https://docs.docker.com/compose/networking/
|
||||
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn
|
||||
- FABRIC_LOGGING_SPEC=INFO
|
||||
#- FABRIC_LOGGING_SPEC=DEBUG
|
||||
- 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
|
||||
# Allow more time for chaincode container to build on install.
|
||||
- CORE_CHAINCODE_EXECUTETIMEOUT=300s
|
||||
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
|
||||
command: peer node start
|
||||
|
||||
orderer-base:
|
||||
image: hyperledger/fabric-orderer:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_LOGGING_SPEC=INFO
|
||||
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
|
||||
- ORDERER_GENERAL_BOOTSTRAPMETHOD=file
|
||||
- ORDERER_GENERAL_BOOTSTRAPFILE=/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_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
|
||||
- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
|
||||
- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
|
||||
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
|
||||
command: orderer
|
||||
|
||||
|
|
@ -1,532 +0,0 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp All Rights Reserved
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script will orchestrate a sample end-to-end execution of the Hyperledger
|
||||
# Fabric network.
|
||||
#
|
||||
# The end-to-end verification provisions a sample Fabric network consisting of
|
||||
# two organizations, each maintaining two peers, and a Raft ordering service.
|
||||
#
|
||||
# This verification makes use of two fundamental tools, which are necessary to
|
||||
# create a functioning transactional network with digital signature validation
|
||||
# and access control:
|
||||
#
|
||||
# * cryptogen - generates the x509 certificates used to identify and
|
||||
# authenticate the various components in the network.
|
||||
# * configtxgen - generates the requisite configuration artifacts for orderer
|
||||
# bootstrap and channel creation.
|
||||
#
|
||||
# Each tool consumes a configuration yaml file, within which we specify the topology
|
||||
# of our network (cryptogen) and the location of our certificates for various
|
||||
# configuration operations (configtxgen). Once the tools have been successfully run,
|
||||
# we are able to launch our network. More detail on the tools and the structure of
|
||||
# the network will be provided later in this document. For now, let's get going...
|
||||
|
||||
# prepending $PWD/../bin to PATH to ensure we are picking up the correct binaries
|
||||
# this may be commented out to resolve installed version of tools if desired
|
||||
export PATH=${PWD}/../bin:${PWD}:$PATH
|
||||
export FABRIC_CFG_PATH=${PWD}
|
||||
export VERBOSE=false
|
||||
|
||||
# Print the usage message
|
||||
function printHelp() {
|
||||
echo "Usage: "
|
||||
echo " byfn.sh <mode> [-c <channel name>] [-t <timeout>] [-d <delay>] [-f <docker-compose-file>] [-s <dbtype>] [-l <language>] [-i <imagetag>] [-a] [-n] [-v]"
|
||||
echo " <mode> - one of 'up', 'down', 'restart', 'generate' or 'upgrade'"
|
||||
echo " - 'up' - bring up the network with docker-compose up"
|
||||
echo " - 'down' - clear the network with docker-compose down"
|
||||
echo " - 'restart' - restart the network"
|
||||
echo " - 'generate' - generate required certificates and genesis block"
|
||||
echo " - 'upgrade' - upgrade the network from version 1.3.x to 1.4.0"
|
||||
echo " -c <channel name> - channel name to use (defaults to \"mychannel\")"
|
||||
echo " -t <timeout> - CLI timeout duration in seconds (defaults to 10)"
|
||||
echo " -d <delay> - delay duration in seconds (defaults to 3)"
|
||||
echo " -s <dbtype> - the database backend to use: goleveldb (default) or couchdb"
|
||||
echo " -l <language> - the programming language of the chaincode to deploy: go (default), javascript, or java"
|
||||
echo " -i <imagetag> - the tag to be used to launch the network (defaults to \"latest\")"
|
||||
echo " -a - launch certificate authorities (no certificate authorities are launched by default)"
|
||||
echo " -n - do not deploy chaincode (abstore chaincode is deployed by default)"
|
||||
echo " -v - verbose mode"
|
||||
echo " byfn.sh -h (print this message)"
|
||||
echo
|
||||
echo "Typically, one would first generate the required certificates and "
|
||||
echo "genesis block, then bring up the network. e.g.:"
|
||||
echo
|
||||
echo " byfn.sh generate -c mychannel"
|
||||
echo " byfn.sh up -c mychannel -s couchdb"
|
||||
echo " byfn.sh up -c mychannel -s couchdb -i 1.4.0"
|
||||
echo " byfn.sh up -l javascript"
|
||||
echo " byfn.sh down -c mychannel"
|
||||
echo " byfn.sh upgrade -c mychannel"
|
||||
echo
|
||||
echo "Taking all defaults:"
|
||||
echo " byfn.sh generate"
|
||||
echo " byfn.sh up"
|
||||
echo " byfn.sh down"
|
||||
}
|
||||
|
||||
# Ask user for confirmation to proceed
|
||||
function askProceed() {
|
||||
read -p "Continue? [Y/n] " ans
|
||||
case "$ans" in
|
||||
y | Y | "")
|
||||
echo "proceeding ..."
|
||||
;;
|
||||
n | N)
|
||||
echo "exiting..."
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
echo "invalid response"
|
||||
askProceed
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Obtain CONTAINER_IDS and remove them
|
||||
# TODO Might want to make this optional - could clear other containers
|
||||
function clearContainers() {
|
||||
CONTAINER_IDS=$(docker ps -a | awk '($2 ~ /dev-peer.*/) {print $1}')
|
||||
if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
|
||||
echo "---- No containers available for deletion ----"
|
||||
else
|
||||
docker rm -f $CONTAINER_IDS
|
||||
fi
|
||||
}
|
||||
|
||||
# Delete any images that were generated as a part of this setup
|
||||
# specifically the following images are often left behind:
|
||||
# TODO list generated image naming patterns
|
||||
function removeUnwantedImages() {
|
||||
DOCKER_IMAGE_IDS=$(docker images | awk '($1 ~ /dev-peer.*/) {print $3}')
|
||||
if [ -z "$DOCKER_IMAGE_IDS" -o "$DOCKER_IMAGE_IDS" == " " ]; then
|
||||
echo "---- No images available for deletion ----"
|
||||
else
|
||||
docker rmi -f $DOCKER_IMAGE_IDS
|
||||
fi
|
||||
}
|
||||
|
||||
# Versions of fabric known not to work with this release of first-network
|
||||
BLACKLISTED_VERSIONS="^1\."
|
||||
|
||||
# Do some basic sanity checking to make sure that the appropriate versions of fabric
|
||||
# binaries/images are available. In the future, additional checking for the presence
|
||||
# of go or other items could be added.
|
||||
function checkPrereqs() {
|
||||
# Note, we check configtxlator externally because it does not require a config file, and peer in the
|
||||
# docker image because of FAB-8551 that makes configtxlator return 'development version' in docker
|
||||
LOCAL_VERSION=$(configtxlator version | sed -ne 's/ Version: //p')
|
||||
DOCKER_IMAGE_VERSION=$(docker run --rm hyperledger/fabric-tools:$IMAGETAG peer version | sed -ne 's/ Version: //p' | head -1)
|
||||
|
||||
echo "LOCAL_VERSION=$LOCAL_VERSION"
|
||||
echo "DOCKER_IMAGE_VERSION=$DOCKER_IMAGE_VERSION"
|
||||
|
||||
if [ "$LOCAL_VERSION" != "$DOCKER_IMAGE_VERSION" ]; then
|
||||
echo "=================== WARNING ==================="
|
||||
echo " Local fabric binaries and docker images are "
|
||||
echo " out of sync. This may cause problems. "
|
||||
echo "==============================================="
|
||||
fi
|
||||
|
||||
for UNSUPPORTED_VERSION in $BLACKLISTED_VERSIONS; do
|
||||
echo "$LOCAL_VERSION" | grep -q $UNSUPPORTED_VERSION
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "ERROR! Local Fabric binary version of $LOCAL_VERSION does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$DOCKER_IMAGE_VERSION" | grep -q $UNSUPPORTED_VERSION
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "ERROR! Fabric Docker image version of $DOCKER_IMAGE_VERSION does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Generate the needed certificates, the genesis block and start the network.
|
||||
function networkUp() {
|
||||
checkPrereqs
|
||||
# generate artifacts if they don't exist
|
||||
if [ ! -d "crypto-config" ]; then
|
||||
generateCerts
|
||||
generateChannelArtifacts
|
||||
fi
|
||||
COMPOSE_FILES="-f ${COMPOSE_FILE} -f ${COMPOSE_FILE_RAFT2}"
|
||||
if [ "${CERTIFICATE_AUTHORITIES}" == "true" ]; then
|
||||
COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_CA}"
|
||||
export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls *_sk)
|
||||
export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls *_sk)
|
||||
fi
|
||||
if [ "${IF_COUCHDB}" == "couchdb" ]; then
|
||||
COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_COUCH}"
|
||||
fi
|
||||
IMAGE_TAG=$IMAGETAG docker-compose ${COMPOSE_FILES} up -d 2>&1
|
||||
docker ps -a
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Unable to start network"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Sleeping 15s to allow Raft cluster to complete booting"
|
||||
sleep 15
|
||||
|
||||
if [ "${NO_CHAINCODE}" != "true" ]; then
|
||||
echo Vendoring Go dependencies ...
|
||||
pushd ../chaincode/abstore/go
|
||||
GO111MODULE=on go mod vendor
|
||||
popd
|
||||
echo Finished vendoring Go dependencies
|
||||
fi
|
||||
|
||||
# now run the end to end script
|
||||
docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE $NO_CHAINCODE
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Test failed"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Upgrade the network components which are at version 1.3.x to 1.4.x
|
||||
# Stop the orderer and peers, backup the ledger for orderer and peers, cleanup chaincode containers and images
|
||||
# and relaunch the orderer and peers with latest tag
|
||||
function upgradeNetwork() {
|
||||
if [[ "$IMAGETAG" == *"1.4"* ]] || [[ $IMAGETAG == "latest" ]]; then
|
||||
docker inspect -f '{{.Config.Volumes}}' orderer.example.com | grep -q '/var/hyperledger/production/orderer'
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! This network does not appear to start with fabric-samples >= v1.3.x?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LEDGERS_BACKUP=./ledgers-backup
|
||||
|
||||
# create ledger-backup directory
|
||||
mkdir -p $LEDGERS_BACKUP
|
||||
|
||||
export IMAGE_TAG=$IMAGETAG
|
||||
COMPOSE_FILES="-f ${COMPOSE_FILE} -f ${COMPOSE_FILE_RAFT2}"
|
||||
if [ "${CERTIFICATE_AUTHORITIES}" == "true" ]; then
|
||||
COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_CA}"
|
||||
export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls *_sk)
|
||||
export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls *_sk)
|
||||
fi
|
||||
if [ "${IF_COUCHDB}" == "couchdb" ]; then
|
||||
COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_COUCH}"
|
||||
fi
|
||||
|
||||
# removing the cli container
|
||||
docker-compose $COMPOSE_FILES stop cli
|
||||
docker-compose $COMPOSE_FILES up -d --no-deps cli
|
||||
|
||||
echo "Upgrading orderer"
|
||||
docker-compose $COMPOSE_FILES stop orderer.example.com
|
||||
docker cp -a orderer.example.com:/var/hyperledger/production/orderer $LEDGERS_BACKUP/orderer.example.com
|
||||
docker-compose $COMPOSE_FILES up -d --no-deps orderer.example.com
|
||||
|
||||
for PEER in peer0.org1.example.com peer1.org1.example.com peer0.org2.example.com peer1.org2.example.com; do
|
||||
echo "Upgrading peer $PEER"
|
||||
|
||||
# Stop the peer and backup its ledger
|
||||
docker-compose $COMPOSE_FILES stop $PEER
|
||||
docker cp -a $PEER:/var/hyperledger/production $LEDGERS_BACKUP/$PEER/
|
||||
|
||||
# Remove any old containers and images for this peer
|
||||
CC_CONTAINERS=$(docker ps | grep dev-$PEER | awk '{print $1}')
|
||||
if [ -n "$CC_CONTAINERS" ]; then
|
||||
docker rm -f $CC_CONTAINERS
|
||||
fi
|
||||
CC_IMAGES=$(docker images | grep dev-$PEER | awk '{print $1}')
|
||||
if [ -n "$CC_IMAGES" ]; then
|
||||
docker rmi -f $CC_IMAGES
|
||||
fi
|
||||
|
||||
# Start the peer again
|
||||
docker-compose $COMPOSE_FILES up -d --no-deps $PEER
|
||||
done
|
||||
|
||||
docker exec cli scripts/upgrade_to_v14.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Test failed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERROR !!!! Pass the v1.4.x image tag"
|
||||
fi
|
||||
}
|
||||
|
||||
# Tear down running network
|
||||
function networkDown() {
|
||||
# stop org3 containers also in addition to org1 and org2, in case we were running sample to add org3
|
||||
docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH -f $COMPOSE_FILE_RAFT2 -f $COMPOSE_FILE_CA -f $COMPOSE_FILE_ORG3 down --volumes --remove-orphans
|
||||
|
||||
# Don't remove the generated artifacts -- note, the ledgers are always removed
|
||||
if [ "$MODE" != "restart" ]; then
|
||||
# Bring down the network, deleting the volumes
|
||||
#Delete any ledger backups
|
||||
docker run -v $PWD:/tmp/first-network --rm hyperledger/fabric-tools:$IMAGETAG rm -Rf /tmp/first-network/ledgers-backup
|
||||
#Cleanup the chaincode containers
|
||||
clearContainers
|
||||
#Cleanup images
|
||||
removeUnwantedImages
|
||||
# remove orderer block and other channel configuration transactions and certs
|
||||
rm -rf channel-artifacts/*.block channel-artifacts/*.tx crypto-config ./org3-artifacts/crypto-config/ channel-artifacts/org3.json
|
||||
fi
|
||||
}
|
||||
|
||||
# We will use the cryptogen tool to generate the cryptographic material (x509 certs)
|
||||
# for our various network entities. The certificates are based on a standard PKI
|
||||
# implementation where validation is achieved by reaching a common trust anchor.
|
||||
#
|
||||
# Cryptogen consumes a file - ``crypto-config.yaml`` - that contains the network
|
||||
# topology and allows us to generate a library of certificates for both the
|
||||
# Organizations and the components that belong to those Organizations. Each
|
||||
# Organization is provisioned a unique root certificate (``ca-cert``), that binds
|
||||
# specific components (peers and orderers) to that Org. Transactions and communications
|
||||
# within Fabric are signed by an entity's private key (``keystore``), and then verified
|
||||
# by means of a public key (``signcerts``). You will notice a "count" variable within
|
||||
# this file. We use this to specify the number of peers per Organization; in our
|
||||
# case it's two peers per Org. The rest of this template is extremely
|
||||
# self-explanatory.
|
||||
#
|
||||
# After we run the tool, the certs will be parked in a folder titled ``crypto-config``.
|
||||
|
||||
# Generates Org certs using cryptogen tool
|
||||
function generateCerts() {
|
||||
which cryptogen
|
||||
if [ "$?" -ne 0 ]; then
|
||||
echo "cryptogen tool not found. exiting"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "##########################################################"
|
||||
echo "##### Generate certificates using cryptogen tool #########"
|
||||
echo "##########################################################"
|
||||
|
||||
if [ -d "crypto-config" ]; then
|
||||
rm -Rf crypto-config
|
||||
fi
|
||||
set -x
|
||||
cryptogen generate --config=./crypto-config.yaml
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate certificates..."
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "Generate CCP files for Org1 and Org2"
|
||||
./ccp-generate.sh
|
||||
}
|
||||
|
||||
# The `configtxgen tool is used to create four artifacts: orderer **bootstrap
|
||||
# block**, fabric **channel configuration transaction**, and two **anchor
|
||||
# peer transactions** - one for each Peer Org.
|
||||
#
|
||||
# The orderer block is the genesis block for the ordering service, and the
|
||||
# channel transaction file is broadcast to the orderer at channel creation
|
||||
# time. The anchor peer transactions, as the name might suggest, specify each
|
||||
# Org's anchor peer on this channel.
|
||||
#
|
||||
# Configtxgen consumes a file - ``configtx.yaml`` - that contains the definitions
|
||||
# for the sample network. There are three members - one Orderer Org (``OrdererOrg``)
|
||||
# and two Peer Orgs (``Org1`` & ``Org2``) each managing and maintaining two peer nodes.
|
||||
# This file also specifies a consortium - ``SampleConsortium`` - consisting of our
|
||||
# two Peer Orgs. Pay specific attention to the "Profiles" section at the top of
|
||||
# this file. You will notice that we have two unique headers. One for the orderer genesis
|
||||
# block - ``TwoOrgsOrdererGenesis`` - and one for our channel - ``TwoOrgsChannel``.
|
||||
# These headers are important, as we will pass them in as arguments when we create
|
||||
# our artifacts. This file also contains two additional specifications that are worth
|
||||
# noting. Firstly, we specify the anchor peers for each Peer Org
|
||||
# (``peer0.org1.example.com`` & ``peer0.org2.example.com``). Secondly, we point to
|
||||
# the location of the MSP directory for each member, in turn allowing us to store the
|
||||
# root certificates for each Org in the orderer genesis block. This is a critical
|
||||
# concept. Now any network entity communicating with the ordering service can have
|
||||
# its digital signature verified.
|
||||
#
|
||||
# This function will generate the crypto material and our four configuration
|
||||
# artifacts, and subsequently output these files into the ``channel-artifacts``
|
||||
# folder.
|
||||
#
|
||||
# If you receive the following warning, it can be safely ignored:
|
||||
#
|
||||
# [bccsp] GetDefault -> WARN 001 Before using BCCSP, please call InitFactories(). Falling back to bootBCCSP.
|
||||
#
|
||||
# You can ignore the logs regarding intermediate certs, we are not using them in
|
||||
# this crypto implementation.
|
||||
|
||||
# Generate orderer genesis block, channel configuration transaction and
|
||||
# anchor peer update transactions
|
||||
function generateChannelArtifacts() {
|
||||
which configtxgen
|
||||
if [ "$?" -ne 0 ]; then
|
||||
echo "configtxgen tool not found. exiting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "##########################################################"
|
||||
echo "######### Generating Orderer Genesis block ##############"
|
||||
echo "##########################################################"
|
||||
# Note: For some unknown reason (at least for now) the block file can't be
|
||||
# named orderer.genesis.block or the orderer will fail to launch!
|
||||
set -x
|
||||
configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate orderer genesis block..."
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "#################################################################"
|
||||
echo "### Generating channel configuration transaction 'channel.tx' ###"
|
||||
echo "#################################################################"
|
||||
set -x
|
||||
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate channel configuration transaction..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "#################################################################"
|
||||
echo "####### Generating anchor peer update for Org1MSP ##########"
|
||||
echo "#################################################################"
|
||||
set -x
|
||||
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate anchor peer update for Org1MSP..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "#################################################################"
|
||||
echo "####### Generating anchor peer update for Org2MSP ##########"
|
||||
echo "#################################################################"
|
||||
set -x
|
||||
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate \
|
||||
./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate anchor peer update for Org2MSP..."
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
# timeout duration - the duration the CLI should wait for a response from
|
||||
# another container before giving up
|
||||
CLI_TIMEOUT=10
|
||||
# default for delay between commands
|
||||
CLI_DELAY=3
|
||||
# channel name defaults to "mychannel"
|
||||
CHANNEL_NAME="mychannel"
|
||||
# use this as the default docker-compose yaml definition
|
||||
COMPOSE_FILE=docker-compose-cli.yaml
|
||||
#
|
||||
COMPOSE_FILE_COUCH=docker-compose-couch.yaml
|
||||
# org3 docker compose file
|
||||
COMPOSE_FILE_ORG3=docker-compose-org3.yaml
|
||||
# two additional etcd/raft orderers
|
||||
COMPOSE_FILE_RAFT2=docker-compose-etcdraft2.yaml
|
||||
# certificate authorities compose file
|
||||
COMPOSE_FILE_CA=docker-compose-ca.yaml
|
||||
#
|
||||
# use go as the default language for chaincode
|
||||
CC_SRC_LANGUAGE=go
|
||||
# default image tag
|
||||
IMAGETAG="latest"
|
||||
# Parse commandline args
|
||||
if [ "$1" = "-m" ]; then # supports old usage, muscle memory is powerful!
|
||||
shift
|
||||
fi
|
||||
MODE=$1
|
||||
shift
|
||||
# Determine whether starting, stopping, restarting, generating or upgrading
|
||||
if [ "$MODE" == "up" ]; then
|
||||
EXPMODE="Starting"
|
||||
elif [ "$MODE" == "down" ]; then
|
||||
EXPMODE="Stopping"
|
||||
elif [ "$MODE" == "restart" ]; then
|
||||
EXPMODE="Restarting"
|
||||
elif [ "$MODE" == "generate" ]; then
|
||||
EXPMODE="Generating certs and genesis block"
|
||||
elif [ "$MODE" == "upgrade" ]; then
|
||||
EXPMODE="Upgrading the network"
|
||||
else
|
||||
printHelp
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while getopts "h?c:t:d:s:l:i:anv" opt; do
|
||||
case "$opt" in
|
||||
h | \?)
|
||||
printHelp
|
||||
exit 0
|
||||
;;
|
||||
c)
|
||||
CHANNEL_NAME=$OPTARG
|
||||
;;
|
||||
t)
|
||||
CLI_TIMEOUT=$OPTARG
|
||||
;;
|
||||
d)
|
||||
CLI_DELAY=$OPTARG
|
||||
;;
|
||||
s)
|
||||
IF_COUCHDB=$OPTARG
|
||||
;;
|
||||
l)
|
||||
CC_SRC_LANGUAGE=$OPTARG
|
||||
;;
|
||||
i)
|
||||
IMAGETAG=$(go env GOARCH)"-"$OPTARG
|
||||
;;
|
||||
a)
|
||||
CERTIFICATE_AUTHORITIES=true
|
||||
;;
|
||||
n)
|
||||
NO_CHAINCODE=true
|
||||
;;
|
||||
v)
|
||||
VERBOSE=true
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# Announce what was requested
|
||||
|
||||
if [ "${IF_COUCHDB}" == "couchdb" ]; then
|
||||
echo
|
||||
echo "${EXPMODE} for channel '${CHANNEL_NAME}' with CLI timeout of '${CLI_TIMEOUT}' seconds and CLI delay of '${CLI_DELAY}' seconds and using database '${IF_COUCHDB}'"
|
||||
else
|
||||
echo "${EXPMODE} for channel '${CHANNEL_NAME}' with CLI timeout of '${CLI_TIMEOUT}' seconds and CLI delay of '${CLI_DELAY}' seconds"
|
||||
fi
|
||||
# ask for confirmation to proceed
|
||||
askProceed
|
||||
|
||||
#Create the network using docker compose
|
||||
if [ "${MODE}" == "up" ]; then
|
||||
networkUp
|
||||
elif [ "${MODE}" == "down" ]; then ## Clear the network
|
||||
networkDown
|
||||
elif [ "${MODE}" == "generate" ]; then ## Generate Artifacts
|
||||
generateCerts
|
||||
generateChannelArtifacts
|
||||
elif [ "${MODE}" == "restart" ]; then ## Restart the network
|
||||
networkDown
|
||||
networkUp
|
||||
elif [ "${MODE}" == "upgrade" ]; then ## Upgrade the network from version 1.2.x to 1.3.x
|
||||
upgradeNetwork
|
||||
else
|
||||
printHelp
|
||||
exit 1
|
||||
fi
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
function one_line_pem {
|
||||
echo "`awk 'NF {sub(/\\n/, ""); printf "%s\\\\\\\n",$0;}' $1`"
|
||||
}
|
||||
|
||||
function json_ccp {
|
||||
local PP=$(one_line_pem $5)
|
||||
local CP=$(one_line_pem $6)
|
||||
sed -e "s/\${ORG}/$1/" \
|
||||
-e "s/\${P0PORT}/$2/" \
|
||||
-e "s/\${P1PORT}/$3/" \
|
||||
-e "s/\${CAPORT}/$4/" \
|
||||
-e "s#\${PEERPEM}#$PP#" \
|
||||
-e "s#\${CAPEM}#$CP#" \
|
||||
ccp-template.json
|
||||
}
|
||||
|
||||
function yaml_ccp {
|
||||
local PP=$(one_line_pem $5)
|
||||
local CP=$(one_line_pem $6)
|
||||
sed -e "s/\${ORG}/$1/" \
|
||||
-e "s/\${P0PORT}/$2/" \
|
||||
-e "s/\${P1PORT}/$3/" \
|
||||
-e "s/\${CAPORT}/$4/" \
|
||||
-e "s#\${PEERPEM}#$PP#" \
|
||||
-e "s#\${CAPEM}#$CP#" \
|
||||
ccp-template.yaml | sed -e $'s/\\\\n/\\\n /g'
|
||||
}
|
||||
|
||||
ORG=1
|
||||
P0PORT=7051
|
||||
P1PORT=8051
|
||||
CAPORT=7054
|
||||
PEERPEM=crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
|
||||
CAPEM=crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem
|
||||
|
||||
echo "$(json_ccp $ORG $P0PORT $P1PORT $CAPORT $PEERPEM $CAPEM)" > connection-org1.json
|
||||
echo "$(yaml_ccp $ORG $P0PORT $P1PORT $CAPORT $PEERPEM $CAPEM)" > connection-org1.yaml
|
||||
|
||||
ORG=2
|
||||
P0PORT=9051
|
||||
P1PORT=10051
|
||||
CAPORT=8054
|
||||
PEERPEM=crypto-config/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem
|
||||
CAPEM=crypto-config/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem
|
||||
|
||||
echo "$(json_ccp $ORG $P0PORT $P1PORT $CAPORT $PEERPEM $CAPEM)" > connection-org2.json
|
||||
echo "$(yaml_ccp $ORG $P0PORT $P1PORT $CAPORT $PEERPEM $CAPEM)" > connection-org2.yaml
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
{
|
||||
"name": "first-network-org${ORG}",
|
||||
"version": "1.0.0",
|
||||
"client": {
|
||||
"organization": "Org${ORG}",
|
||||
"connection": {
|
||||
"timeout": {
|
||||
"peer": {
|
||||
"endorser": "300"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"organizations": {
|
||||
"Org${ORG}": {
|
||||
"mspid": "Org${ORG}MSP",
|
||||
"peers": [
|
||||
"peer0.org${ORG}.example.com",
|
||||
"peer1.org${ORG}.example.com"
|
||||
],
|
||||
"certificateAuthorities": [
|
||||
"ca.org${ORG}.example.com"
|
||||
]
|
||||
}
|
||||
},
|
||||
"peers": {
|
||||
"peer0.org${ORG}.example.com": {
|
||||
"url": "grpcs://localhost:${P0PORT}",
|
||||
"tlsCACerts": {
|
||||
"pem": "${PEERPEM}"
|
||||
},
|
||||
"grpcOptions": {
|
||||
"ssl-target-name-override": "peer0.org${ORG}.example.com",
|
||||
"hostnameOverride": "peer0.org${ORG}.example.com"
|
||||
}
|
||||
},
|
||||
"peer1.org${ORG}.example.com": {
|
||||
"url": "grpcs://localhost:${P1PORT}",
|
||||
"tlsCACerts": {
|
||||
"pem": "${PEERPEM}"
|
||||
},
|
||||
"grpcOptions": {
|
||||
"ssl-target-name-override": "peer1.org${ORG}.example.com",
|
||||
"hostnameOverride": "peer1.org${ORG}.example.com"
|
||||
}
|
||||
}
|
||||
},
|
||||
"certificateAuthorities": {
|
||||
"ca.org${ORG}.example.com": {
|
||||
"url": "https://localhost:${CAPORT}",
|
||||
"caName": "ca-org${ORG}",
|
||||
"tlsCACerts": {
|
||||
"pem": "${CAPEM}"
|
||||
},
|
||||
"httpOptions": {
|
||||
"verify": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
---
|
||||
name: first-network-org${ORG}
|
||||
version: 1.0.0
|
||||
client:
|
||||
organization: Org${ORG}
|
||||
connection:
|
||||
timeout:
|
||||
peer:
|
||||
endorser: '300'
|
||||
organizations:
|
||||
Org${ORG}:
|
||||
mspid: Org${ORG}MSP
|
||||
peers:
|
||||
- peer0.org${ORG}.example.com
|
||||
- peer1.org${ORG}.example.com
|
||||
certificateAuthorities:
|
||||
- ca.org${ORG}.example.com
|
||||
peers:
|
||||
peer0.org${ORG}.example.com:
|
||||
url: grpcs://localhost:${P0PORT}
|
||||
tlsCACerts:
|
||||
pem: |
|
||||
${PEERPEM}
|
||||
grpcOptions:
|
||||
ssl-target-name-override: peer0.org${ORG}.example.com
|
||||
hostnameOverride: peer0.org${ORG}.example.com
|
||||
peer1.org${ORG}.example.com:
|
||||
url: grpcs://localhost:${P1PORT}
|
||||
tlsCACerts:
|
||||
pem: |
|
||||
${PEERPEM}
|
||||
grpcOptions:
|
||||
ssl-target-name-override: peer1.org${ORG}.example.com
|
||||
hostnameOverride: peer1.org${ORG}.example.com
|
||||
certificateAuthorities:
|
||||
ca.org${ORG}.example.com:
|
||||
url: https://localhost:${CAPORT}
|
||||
caName: ca-org${ORG}
|
||||
tlsCACerts:
|
||||
pem: |
|
||||
${CAPEM}
|
||||
httpOptions:
|
||||
verify: false
|
||||
|
|
@ -1,363 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
---
|
||||
################################################################################
|
||||
#
|
||||
# Section: Organizations
|
||||
#
|
||||
# - This section defines the different organizational identities which will
|
||||
# be referenced later in the configuration.
|
||||
#
|
||||
################################################################################
|
||||
Organizations:
|
||||
|
||||
# SampleOrg defines an MSP using the sampleconfig. It should never be used
|
||||
# in production but may be used as a template for other definitions
|
||||
- &OrdererOrg
|
||||
# DefaultOrg defines the organization which is used in the sampleconfig
|
||||
# of the fabric.git development environment
|
||||
Name: OrdererOrg
|
||||
|
||||
# ID to load the MSP definition as
|
||||
ID: OrdererMSP
|
||||
|
||||
# MSPDir is the filesystem path which contains the MSP configuration
|
||||
MSPDir: crypto-config/ordererOrganizations/example.com/msp
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For organization policies, their canonical path is usually
|
||||
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('OrdererMSP.member')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('OrdererMSP.member')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('OrdererMSP.admin')"
|
||||
|
||||
OrdererEndpoints:
|
||||
- orderer.example.com:7050
|
||||
|
||||
- &Org1
|
||||
# DefaultOrg defines the organization which is used in the sampleconfig
|
||||
# of the fabric.git development environment
|
||||
Name: Org1MSP
|
||||
|
||||
# ID to load the MSP definition as
|
||||
ID: Org1MSP
|
||||
|
||||
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For organization policies, their canonical path is usually
|
||||
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('Org1MSP.admin')"
|
||||
Endorsement:
|
||||
Type: Signature
|
||||
Rule: "OR('Org1MSP.peer')"
|
||||
|
||||
# leave this flag set to true.
|
||||
AnchorPeers:
|
||||
# AnchorPeers defines the location of peers which can be used
|
||||
# for cross org gossip communication. Note, this value is only
|
||||
# encoded in the genesis block in the Application section context
|
||||
- Host: peer0.org1.example.com
|
||||
Port: 7051
|
||||
|
||||
- &Org2
|
||||
# DefaultOrg defines the organization which is used in the sampleconfig
|
||||
# of the fabric.git development environment
|
||||
Name: Org2MSP
|
||||
|
||||
# ID to load the MSP definition as
|
||||
ID: Org2MSP
|
||||
|
||||
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For organization policies, their canonical path is usually
|
||||
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('Org2MSP.admin')"
|
||||
Endorsement:
|
||||
Type: Signature
|
||||
Rule: "OR('Org2MSP.peer')"
|
||||
|
||||
AnchorPeers:
|
||||
# AnchorPeers defines the location of peers which can be used
|
||||
# for cross org gossip communication. Note, this value is only
|
||||
# encoded in the genesis block in the Application section context
|
||||
- Host: peer0.org2.example.com
|
||||
Port: 9051
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# SECTION: Capabilities
|
||||
#
|
||||
# - This section defines the capabilities of fabric network. This is a new
|
||||
# concept as of v1.1.0 and should not be utilized in mixed networks with
|
||||
# v1.0.x peers and orderers. Capabilities define features which must be
|
||||
# present in a fabric binary for that binary to safely participate in the
|
||||
# fabric network. For instance, if a new MSP type is added, newer binaries
|
||||
# might recognize and validate the signatures from this type, while older
|
||||
# binaries without this support would be unable to validate those
|
||||
# transactions. This could lead to different versions of the fabric binaries
|
||||
# having different world states. Instead, defining a capability for a channel
|
||||
# informs those binaries without this capability that they must cease
|
||||
# processing transactions until they have been upgraded. For v1.0.x if any
|
||||
# capabilities are defined (including a map with all capabilities turned off)
|
||||
# then the v1.0.x peer will deliberately crash.
|
||||
#
|
||||
################################################################################
|
||||
Capabilities:
|
||||
# Channel capabilities apply to both the orderers and the peers and must be
|
||||
# supported by both.
|
||||
# Set the value of the capability to true to require it.
|
||||
Channel: &ChannelCapabilities
|
||||
# V2_0 capability ensures that orderers and peers behave according
|
||||
# to v2.0 channel capabilities. Orderers and peers from
|
||||
# prior releases would behave in an incompatible way, and are therefore
|
||||
# not able to participate in channels at v2.0 capability.
|
||||
# Prior to enabling V2.0 channel capabilities, ensure that all
|
||||
# orderers and peers on a channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
# Orderer capabilities apply only to the orderers, and may be safely
|
||||
# used with prior release peers.
|
||||
# Set the value of the capability to true to require it.
|
||||
Orderer: &OrdererCapabilities
|
||||
# V2_0 orderer capability ensures that orderers behave according
|
||||
# to v2.0 orderer capabilities. Orderers from
|
||||
# prior releases would behave in an incompatible way, and are therefore
|
||||
# not able to participate in channels at v2.0 orderer capability.
|
||||
# Prior to enabling V2.0 orderer capabilities, ensure that all
|
||||
# orderers on channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
# Application capabilities apply only to the peer network, and may be safely
|
||||
# used with prior release orderers.
|
||||
# Set the value of the capability to true to require it.
|
||||
Application: &ApplicationCapabilities
|
||||
# V2_0 application capability ensures that peers behave according
|
||||
# to v2.0 application capabilities. Peers from
|
||||
# prior releases would behave in an incompatible way, and are therefore
|
||||
# not able to participate in channels at v2.0 application capability.
|
||||
# Prior to enabling V2.0 application capabilities, ensure that all
|
||||
# peers on channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# SECTION: Application
|
||||
#
|
||||
# - This section defines the values to encode into a config transaction or
|
||||
# genesis block for application related parameters
|
||||
#
|
||||
################################################################################
|
||||
Application: &ApplicationDefaults
|
||||
|
||||
# Organizations is the list of orgs which are defined as participants on
|
||||
# the application side of the network
|
||||
Organizations:
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Application policies, their canonical path is
|
||||
# /Channel/Application/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
LifecycleEndorsement:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Endorsement"
|
||||
Endorsement:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Endorsement"
|
||||
|
||||
Capabilities:
|
||||
<<: *ApplicationCapabilities
|
||||
################################################################################
|
||||
#
|
||||
# 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
|
||||
OrdererType: etcdraft
|
||||
|
||||
# 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: 99 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
|
||||
|
||||
# Organizations is the list of orgs which are defined as participants on
|
||||
# the orderer side of the network
|
||||
Organizations:
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Orderer policies, their canonical path is
|
||||
# /Channel/Orderer/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
# BlockValidation specifies what signatures must be included in the block
|
||||
# from the orderer for the peer to validate it.
|
||||
BlockValidation:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# CHANNEL
|
||||
#
|
||||
# This section defines the values to encode into a config transaction or
|
||||
# genesis block for channel related parameters.
|
||||
#
|
||||
################################################################################
|
||||
Channel: &ChannelDefaults
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Channel policies, their canonical path is
|
||||
# /Channel/<PolicyName>
|
||||
Policies:
|
||||
# Who may invoke the 'Deliver' API
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
# Who may invoke the 'Broadcast' API
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
# By default, who may modify elements at this config level
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
|
||||
# Capabilities describes the channel level capabilities, see the
|
||||
# dedicated Capabilities section elsewhere in this file for a full
|
||||
# description
|
||||
Capabilities:
|
||||
<<: *ChannelCapabilities
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Profile
|
||||
#
|
||||
# - Different configuration profiles may be encoded here to be specified
|
||||
# as parameters to the configtxgen tool
|
||||
#
|
||||
################################################################################
|
||||
Profiles:
|
||||
|
||||
TwoOrgsChannel:
|
||||
Consortium: SampleConsortium
|
||||
<<: *ChannelDefaults
|
||||
Application:
|
||||
<<: *ApplicationDefaults
|
||||
Organizations:
|
||||
- *Org1
|
||||
- *Org2
|
||||
Capabilities:
|
||||
<<: *ApplicationCapabilities
|
||||
|
||||
SampleMultiNodeEtcdRaft:
|
||||
<<: *ChannelDefaults
|
||||
Capabilities:
|
||||
<<: *ChannelCapabilities
|
||||
Orderer:
|
||||
<<: *OrdererDefaults
|
||||
OrdererType: etcdraft
|
||||
EtcdRaft:
|
||||
Consenters:
|
||||
- Host: orderer.example.com
|
||||
Port: 7050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
|
||||
- Host: orderer2.example.com
|
||||
Port: 8050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt
|
||||
- Host: orderer3.example.com
|
||||
Port: 9050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt
|
||||
- Host: orderer4.example.com
|
||||
Port: 10050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt
|
||||
- Host: orderer5.example.com
|
||||
Port: 11050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/server.crt
|
||||
Addresses:
|
||||
- orderer.example.com:7050
|
||||
- orderer2.example.com:8050
|
||||
- orderer3.example.com:9050
|
||||
- orderer4.example.com:10050
|
||||
- orderer5.example.com:11050
|
||||
|
||||
Organizations:
|
||||
- *OrdererOrg
|
||||
Capabilities:
|
||||
<<: *OrdererCapabilities
|
||||
Application:
|
||||
<<: *ApplicationDefaults
|
||||
Organizations:
|
||||
- <<: *OrdererOrg
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
- *Org1
|
||||
- *Org2
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# "OrdererOrgs" - Definition of organizations managing orderer nodes
|
||||
# ---------------------------------------------------------------------------
|
||||
OrdererOrgs:
|
||||
# ---------------------------------------------------------------------------
|
||||
# Orderer
|
||||
# ---------------------------------------------------------------------------
|
||||
- Name: Orderer
|
||||
Domain: example.com
|
||||
# ---------------------------------------------------------------------------
|
||||
# "Specs" - See PeerOrgs below for complete description
|
||||
# ---------------------------------------------------------------------------
|
||||
Specs:
|
||||
- Hostname: orderer
|
||||
- Hostname: orderer2
|
||||
- Hostname: orderer3
|
||||
- Hostname: orderer4
|
||||
- Hostname: orderer5
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# "PeerOrgs" - Definition of organizations managing peer nodes
|
||||
# ---------------------------------------------------------------------------
|
||||
PeerOrgs:
|
||||
# ---------------------------------------------------------------------------
|
||||
# Org1
|
||||
# ---------------------------------------------------------------------------
|
||||
- Name: Org1
|
||||
Domain: org1.example.com
|
||||
EnableNodeOUs: true
|
||||
# ---------------------------------------------------------------------------
|
||||
# "Specs"
|
||||
# ---------------------------------------------------------------------------
|
||||
# Uncomment this section to enable the explicit definition of hosts in your
|
||||
# configuration. Most users will want to use Template, below
|
||||
#
|
||||
# Specs is an array of Spec entries. Each Spec entry consists of two fields:
|
||||
# - Hostname: (Required) The desired hostname, sans the domain.
|
||||
# - CommonName: (Optional) Specifies the template or explicit override for
|
||||
# the CN. By default, this is the template:
|
||||
#
|
||||
# "{{.Hostname}}.{{.Domain}}"
|
||||
#
|
||||
# which obtains its values from the Spec.Hostname and
|
||||
# Org.Domain, respectively.
|
||||
# ---------------------------------------------------------------------------
|
||||
# Specs:
|
||||
# - Hostname: foo # implicitly "foo.org1.example.com"
|
||||
# CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above
|
||||
# - Hostname: bar
|
||||
# - Hostname: baz
|
||||
# ---------------------------------------------------------------------------
|
||||
# "Template"
|
||||
# ---------------------------------------------------------------------------
|
||||
# Allows for the definition of 1 or more hosts that are created sequentially
|
||||
# from a template. By default, this looks like "peer%d" from 0 to Count-1.
|
||||
# You may override the number of nodes (Count), the starting index (Start)
|
||||
# or the template used to construct the name (Hostname).
|
||||
#
|
||||
# Note: Template and Specs are not mutually exclusive. You may define both
|
||||
# sections and the aggregate nodes will be created for you. Take care with
|
||||
# name collisions
|
||||
# ---------------------------------------------------------------------------
|
||||
Template:
|
||||
Count: 2
|
||||
# Start: 5
|
||||
# Hostname: {{.Prefix}}{{.Index}} # default
|
||||
# ---------------------------------------------------------------------------
|
||||
# "Users"
|
||||
# ---------------------------------------------------------------------------
|
||||
# Count: The number of user accounts _in addition_ to Admin
|
||||
# ---------------------------------------------------------------------------
|
||||
Users:
|
||||
Count: 1
|
||||
# ---------------------------------------------------------------------------
|
||||
# Org2: See "Org1" for full specification
|
||||
# ---------------------------------------------------------------------------
|
||||
- Name: Org2
|
||||
Domain: org2.example.com
|
||||
EnableNodeOUs: true
|
||||
Template:
|
||||
Count: 2
|
||||
Users:
|
||||
Count: 1
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
ca0:
|
||||
image: hyperledger/fabric-ca:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
|
||||
- FABRIC_CA_SERVER_CA_NAME=ca-org1
|
||||
- FABRIC_CA_SERVER_TLS_ENABLED=true
|
||||
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
|
||||
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/${BYFN_CA1_PRIVATE_KEY}
|
||||
- FABRIC_CA_SERVER_PORT=7054
|
||||
ports:
|
||||
- "7054:7054"
|
||||
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${BYFN_CA1_PRIVATE_KEY} -b admin:adminpw -d'
|
||||
volumes:
|
||||
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
|
||||
container_name: ca_peerOrg1
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
ca1:
|
||||
image: hyperledger/fabric-ca:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
|
||||
- FABRIC_CA_SERVER_CA_NAME=ca-org2
|
||||
- FABRIC_CA_SERVER_TLS_ENABLED=true
|
||||
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
|
||||
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/${BYFN_CA2_PRIVATE_KEY}
|
||||
- FABRIC_CA_SERVER_PORT=8054
|
||||
ports:
|
||||
- "8054:8054"
|
||||
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${BYFN_CA2_PRIVATE_KEY} -b admin:adminpw -d'
|
||||
volumes:
|
||||
- ./crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
|
||||
container_name: ca_peerOrg2
|
||||
networks:
|
||||
- byfn
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
volumes:
|
||||
orderer.example.com:
|
||||
peer0.org1.example.com:
|
||||
peer1.org1.example.com:
|
||||
peer0.org2.example.com:
|
||||
peer1.org2.example.com:
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
|
||||
orderer.example.com:
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: orderer.example.com
|
||||
container_name: orderer.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org1.example.com:
|
||||
container_name: peer0.org1.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer0.org1.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org1.example.com:
|
||||
container_name: peer1.org1.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer1.org1.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org2.example.com:
|
||||
container_name: peer0.org2.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer0.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org2.example.com:
|
||||
container_name: peer1.org2.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer1.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
cli:
|
||||
container_name: cli
|
||||
image: hyperledger/fabric-tools:$IMAGE_TAG
|
||||
tty: true
|
||||
stdin_open: true
|
||||
environment:
|
||||
- GOPATH=/opt/gopath
|
||||
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
|
||||
#- FABRIC_LOGGING_SPEC=DEBUG
|
||||
- FABRIC_LOGGING_SPEC=INFO
|
||||
- CORE_PEER_ID=cli
|
||||
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
|
||||
- CORE_PEER_LOCALMSPID=Org1MSP
|
||||
- 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
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ./../chaincode/:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
|
||||
- ./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:
|
||||
- orderer.example.com
|
||||
- peer0.org1.example.com
|
||||
- peer1.org1.example.com
|
||||
- peer0.org2.example.com
|
||||
- peer1.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
couchdb4:
|
||||
container_name: couchdb4
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "9984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org3.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb4:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb4
|
||||
|
||||
couchdb5:
|
||||
container_name: couchdb5
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "10984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org3.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb5:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb5
|
||||
|
|
@ -1,118 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
couchdb0:
|
||||
container_name: couchdb0
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "5984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org1.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb0
|
||||
|
||||
couchdb1:
|
||||
container_name: couchdb1
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "6984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org1.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb1:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb1
|
||||
|
||||
couchdb2:
|
||||
container_name: couchdb2
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "7984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org2.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb2:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb2
|
||||
|
||||
couchdb3:
|
||||
container_name: couchdb3
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "8984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org2.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb3:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb3
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
volumes:
|
||||
orderer.example.com:
|
||||
peer0.org1.example.com:
|
||||
peer1.org1.example.com:
|
||||
peer0.org2.example.com:
|
||||
peer1.org2.example.com:
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
services:
|
||||
ca0:
|
||||
image: hyperledger/fabric-ca:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
|
||||
- FABRIC_CA_SERVER_CA_NAME=ca-org1
|
||||
- FABRIC_CA_SERVER_TLS_ENABLED=true
|
||||
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
|
||||
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/CA1_PRIVATE_KEY
|
||||
ports:
|
||||
- "7054:7054"
|
||||
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/CA1_PRIVATE_KEY -b admin:adminpw -d'
|
||||
volumes:
|
||||
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
|
||||
container_name: ca_peerOrg1
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
ca1:
|
||||
image: hyperledger/fabric-ca:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
|
||||
- FABRIC_CA_SERVER_CA_NAME=ca-org2
|
||||
- FABRIC_CA_SERVER_TLS_ENABLED=true
|
||||
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
|
||||
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/CA2_PRIVATE_KEY
|
||||
ports:
|
||||
- "8054:7054"
|
||||
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/CA2_PRIVATE_KEY -b admin:adminpw -d'
|
||||
volumes:
|
||||
- ./crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
|
||||
container_name: ca_peerOrg2
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
orderer.example.com:
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: orderer.example.com
|
||||
container_name: orderer.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org1.example.com:
|
||||
container_name: peer0.org1.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer0.org1.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org1.example.com:
|
||||
container_name: peer1.org1.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer1.org1.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org2.example.com:
|
||||
container_name: peer0.org2.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer0.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org2.example.com:
|
||||
container_name: peer1.org2.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer1.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
volumes:
|
||||
orderer2.example.com:
|
||||
orderer3.example.com:
|
||||
orderer4.example.com:
|
||||
orderer5.example.com:
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
|
||||
orderer2.example.com:
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: orderer-base
|
||||
environment:
|
||||
- ORDERER_GENERAL_LISTENPORT=8050
|
||||
container_name: orderer2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
volumes:
|
||||
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer2.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 8050:8050
|
||||
|
||||
orderer3.example.com:
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: orderer-base
|
||||
environment:
|
||||
- ORDERER_GENERAL_LISTENPORT=9050
|
||||
container_name: orderer3.example.com
|
||||
networks:
|
||||
- byfn
|
||||
volumes:
|
||||
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer3.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 9050:9050
|
||||
|
||||
orderer4.example.com:
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: orderer-base
|
||||
environment:
|
||||
- ORDERER_GENERAL_LISTENPORT=10050
|
||||
container_name: orderer4.example.com
|
||||
networks:
|
||||
- byfn
|
||||
volumes:
|
||||
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer4.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 10050:10050
|
||||
|
||||
orderer5.example.com:
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: orderer-base
|
||||
environment:
|
||||
- ORDERER_GENERAL_LISTENPORT=11050
|
||||
container_name: orderer5.example.com
|
||||
networks:
|
||||
- byfn
|
||||
volumes:
|
||||
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer5.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 11050:11050
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
volumes:
|
||||
peer0.org3.example.com:
|
||||
peer1.org3.example.com:
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
|
||||
peer0.org3.example.com:
|
||||
container_name: peer0.org3.example.com
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: peer-base
|
||||
environment:
|
||||
- CORE_PEER_ID=peer0.org3.example.com
|
||||
- CORE_PEER_ADDRESS=peer0.org3.example.com:11051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:11051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer0.org3.example.com:11052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:11052
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org3.example.com:12051
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org3.example.com:11051
|
||||
- CORE_PEER_LOCALMSPID=Org3MSP
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ./org3-artifacts/crypto-config/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/msp:/etc/hyperledger/fabric/msp
|
||||
- ./org3-artifacts/crypto-config/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls:/etc/hyperledger/fabric/tls
|
||||
- peer0.org3.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 11051:11051
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org3.example.com:
|
||||
container_name: peer1.org3.example.com
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: peer-base
|
||||
environment:
|
||||
- CORE_PEER_ID=peer1.org3.example.com
|
||||
- CORE_PEER_ADDRESS=peer1.org3.example.com:12051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:12051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer1.org3.example.com:12052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:12052
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org3.example.com:11051
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org3.example.com:12051
|
||||
- CORE_PEER_LOCALMSPID=Org3MSP
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ./org3-artifacts/crypto-config/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/msp:/etc/hyperledger/fabric/msp
|
||||
- ./org3-artifacts/crypto-config/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls:/etc/hyperledger/fabric/tls
|
||||
- peer1.org3.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 12051:12051
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
|
||||
Org3cli:
|
||||
container_name: Org3cli
|
||||
image: hyperledger/fabric-tools:$IMAGE_TAG
|
||||
tty: true
|
||||
stdin_open: true
|
||||
environment:
|
||||
- GOPATH=/opt/gopath
|
||||
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
|
||||
- FABRIC_LOGGING_SPEC=INFO
|
||||
#- FABRIC_LOGGING_SPEC=DEBUG
|
||||
- CORE_PEER_ID=Org3cli
|
||||
- CORE_PEER_ADDRESS=peer0.org3.example.com:11051
|
||||
- CORE_PEER_LOCALMSPID=Org3MSP
|
||||
- CORE_PEER_TLS_ENABLED=true
|
||||
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/server.crt
|
||||
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/server.key
|
||||
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
|
||||
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
|
||||
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
|
||||
command: /bin/bash
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ./../chaincode/:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
|
||||
- ./org3-artifacts/crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
|
||||
- ./crypto-config/peerOrganizations/org1.example.com:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com
|
||||
- ./crypto-config/peerOrganizations/org2.example.com:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com
|
||||
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
|
||||
depends_on:
|
||||
- peer0.org3.example.com
|
||||
- peer1.org3.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
|
@ -1,307 +0,0 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp All Rights Reserved
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script extends the Hyperledger Fabric By Your First Network by
|
||||
# adding a third organization to the network previously setup in the
|
||||
# BYFN tutorial.
|
||||
#
|
||||
|
||||
# prepending $PWD/../bin to PATH to ensure we are picking up the correct binaries
|
||||
# this may be commented out to resolve installed version of tools if desired
|
||||
export PATH=${PWD}/../bin:${PWD}:$PATH
|
||||
export FABRIC_CFG_PATH=${PWD}
|
||||
export VERBOSE=false
|
||||
|
||||
# Print the usage message
|
||||
function printHelp () {
|
||||
echo "Usage: "
|
||||
echo " eyfn.sh up|down|restart|generate [-c <channel name>] [-t <timeout>] [-d <delay>] [-f <docker-compose-file>] [-s <dbtype>]"
|
||||
echo " eyfn.sh -h|--help (print this message)"
|
||||
echo " <mode> - one of 'up', 'down', 'restart' or 'generate'"
|
||||
echo " - 'up' - bring up the network with docker-compose up"
|
||||
echo " - 'down' - clear the network with docker-compose down"
|
||||
echo " - 'restart' - restart the network"
|
||||
echo " - 'generate' - generate required certificates and genesis block"
|
||||
echo " -c <channel name> - channel name to use (defaults to \"mychannel\")"
|
||||
echo " -t <timeout> - CLI timeout duration in seconds (defaults to 10)"
|
||||
echo " -d <delay> - delay duration in seconds (defaults to 3)"
|
||||
echo " -s <dbtype> - the database backend to use: goleveldb (default) or couchdb"
|
||||
echo " -l <language> - the programming language of the chaincode to deploy: go (default), javascript, or java"
|
||||
echo " -i <imagetag> - the tag to be used to launch the network (defaults to \"latest\")"
|
||||
echo " -v - verbose mode"
|
||||
echo
|
||||
echo "Typically, one would first generate the required certificates and "
|
||||
echo "genesis block, then bring up the network. e.g.:"
|
||||
echo
|
||||
echo " eyfn.sh generate -c mychannel"
|
||||
echo " eyfn.sh up -c mychannel -s couchdb"
|
||||
echo " eyfn.sh up -l javascript"
|
||||
echo " eyfn.sh down -c mychannel"
|
||||
echo
|
||||
echo "Taking all defaults:"
|
||||
echo " eyfn.sh generate"
|
||||
echo " eyfn.sh up"
|
||||
echo " eyfn.sh down"
|
||||
}
|
||||
|
||||
# Ask user for confirmation to proceed
|
||||
function askProceed () {
|
||||
read -p "Continue? [Y/n] " ans
|
||||
case "$ans" in
|
||||
y|Y|"" )
|
||||
echo "proceeding ..."
|
||||
;;
|
||||
n|N )
|
||||
echo "exiting..."
|
||||
exit 1
|
||||
;;
|
||||
* )
|
||||
echo "invalid response"
|
||||
askProceed
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Obtain CONTAINER_IDS and remove them
|
||||
# TODO Might want to make this optional - could clear other containers
|
||||
function clearContainers () {
|
||||
CONTAINER_IDS=$(docker ps -aq)
|
||||
if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
|
||||
echo "---- No containers available for deletion ----"
|
||||
else
|
||||
docker rm -f $CONTAINER_IDS
|
||||
fi
|
||||
}
|
||||
|
||||
# Delete any images that were generated as a part of this setup
|
||||
# specifically the following images are often left behind:
|
||||
# TODO list generated image naming patterns
|
||||
function removeUnwantedImages() {
|
||||
DOCKER_IMAGE_IDS=$(docker images|awk '($1 ~ /dev-peer.*.mycc.*/) {print $3}')
|
||||
if [ -z "$DOCKER_IMAGE_IDS" -o "$DOCKER_IMAGE_IDS" == " " ]; then
|
||||
echo "---- No images available for deletion ----"
|
||||
else
|
||||
docker rmi -f $DOCKER_IMAGE_IDS
|
||||
fi
|
||||
}
|
||||
|
||||
# Generate the needed certificates, the genesis block and start the network.
|
||||
function networkUp () {
|
||||
# generate artifacts if they don't exist
|
||||
if [ ! -d "org3-artifacts/crypto-config" ]; then
|
||||
generateCerts
|
||||
generateChannelArtifacts
|
||||
createConfigTx
|
||||
fi
|
||||
# start org3 peers
|
||||
if [ "${IF_COUCHDB}" == "couchdb" ]; then
|
||||
IMAGE_TAG=${IMAGETAG} docker-compose -f $COMPOSE_FILE_ORG3 -f $COMPOSE_FILE_COUCH_ORG3 up -d 2>&1
|
||||
else
|
||||
IMAGE_TAG=$IMAGETAG docker-compose -f $COMPOSE_FILE_ORG3 up -d 2>&1
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Unable to start Org3 network"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "###############################################################"
|
||||
echo "############### Have Org3 peers join network ##################"
|
||||
echo "###############################################################"
|
||||
docker exec Org3cli ./scripts/step2org3.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Unable to have Org3 peers join network"
|
||||
exit 1
|
||||
fi
|
||||
# finish by running the test
|
||||
docker exec Org3cli ./scripts/testorg3.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Unable to run test"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Tear down running network
|
||||
function networkDown () {
|
||||
docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_RAFT2 -f $COMPOSE_FILE_ORG3 -f $COMPOSE_FILE_COUCH down --volumes --remove-orphans
|
||||
# Don't remove containers, images, etc if restarting
|
||||
if [ "$MODE" != "restart" ]; then
|
||||
#Cleanup the chaincode containers
|
||||
clearContainers
|
||||
#Cleanup images
|
||||
removeUnwantedImages
|
||||
# remove orderer block and other channel configuration transactions and certs
|
||||
rm -rf channel-artifacts/*.block channel-artifacts/*.tx crypto-config ./org3-artifacts/crypto-config/ channel-artifacts/org3.json
|
||||
fi
|
||||
}
|
||||
|
||||
# Use the CLI container to create the configuration transaction needed to add
|
||||
# Org3 to the network
|
||||
function createConfigTx () {
|
||||
echo
|
||||
echo "###############################################################"
|
||||
echo "####### Generate and submit config tx to add Org3 #############"
|
||||
echo "###############################################################"
|
||||
docker exec cli scripts/step1org3.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Unable to create config tx"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# We use the cryptogen tool to generate the cryptographic material
|
||||
# (x509 certs) for the new org. After we run the tool, the certs will
|
||||
# be parked in the BYFN folder titled ``crypto-config``.
|
||||
|
||||
# Generates Org3 certs using cryptogen tool
|
||||
function generateCerts (){
|
||||
which cryptogen
|
||||
if [ "$?" -ne 0 ]; then
|
||||
echo "cryptogen tool not found. exiting"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "###############################################################"
|
||||
echo "##### Generate Org3 certificates using cryptogen tool #########"
|
||||
echo "###############################################################"
|
||||
|
||||
(cd org3-artifacts
|
||||
set -x
|
||||
cryptogen generate --config=./org3-crypto.yaml
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate certificates..."
|
||||
exit 1
|
||||
fi
|
||||
)
|
||||
echo
|
||||
}
|
||||
|
||||
# Generate channel configuration transaction
|
||||
function generateChannelArtifacts() {
|
||||
which configtxgen
|
||||
if [ "$?" -ne 0 ]; then
|
||||
echo "configtxgen tool not found. exiting"
|
||||
exit 1
|
||||
fi
|
||||
echo "##########################################################"
|
||||
echo "######### Generating Org3 config material ###############"
|
||||
echo "##########################################################"
|
||||
(cd org3-artifacts
|
||||
export FABRIC_CFG_PATH=$PWD
|
||||
set -x
|
||||
configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate Org3 config material..."
|
||||
exit 1
|
||||
fi
|
||||
)
|
||||
cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/
|
||||
echo
|
||||
}
|
||||
|
||||
|
||||
# If BYFN wasn't run abort
|
||||
if [ ! -d crypto-config ]; then
|
||||
echo
|
||||
echo "ERROR: Please, run byfn.sh first."
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# timeout duration - the duration the CLI should wait for a response from
|
||||
# another container before giving up
|
||||
CLI_TIMEOUT=10
|
||||
#default for delay
|
||||
CLI_DELAY=3
|
||||
# channel name defaults to "mychannel"
|
||||
CHANNEL_NAME="mychannel"
|
||||
# use this as the default docker-compose yaml definition
|
||||
COMPOSE_FILE=docker-compose-cli.yaml
|
||||
#
|
||||
COMPOSE_FILE_COUCH=docker-compose-couch.yaml
|
||||
# use this as the default docker-compose yaml definition
|
||||
COMPOSE_FILE_ORG3=docker-compose-org3.yaml
|
||||
#
|
||||
COMPOSE_FILE_COUCH_ORG3=docker-compose-couch-org3.yaml
|
||||
# two additional etcd/raft orderers
|
||||
COMPOSE_FILE_RAFT2=docker-compose-etcdraft2.yaml
|
||||
# use go as the default language for chaincode
|
||||
CC_SRC_LANGUAGE=go
|
||||
# default image tag
|
||||
IMAGETAG="latest"
|
||||
|
||||
# Parse commandline args
|
||||
if [ "$1" = "-m" ];then # supports old usage, muscle memory is powerful!
|
||||
shift
|
||||
fi
|
||||
MODE=$1;shift
|
||||
# Determine whether starting, stopping, restarting or generating for announce
|
||||
if [ "$MODE" == "up" ]; then
|
||||
EXPMODE="Starting"
|
||||
elif [ "$MODE" == "down" ]; then
|
||||
EXPMODE="Stopping"
|
||||
elif [ "$MODE" == "restart" ]; then
|
||||
EXPMODE="Restarting"
|
||||
elif [ "$MODE" == "generate" ]; then
|
||||
EXPMODE="Generating certs and genesis block for"
|
||||
else
|
||||
printHelp
|
||||
exit 1
|
||||
fi
|
||||
while getopts "h?c:t:d:s:l:i:v" opt; do
|
||||
case "$opt" in
|
||||
h|\?)
|
||||
printHelp
|
||||
exit 0
|
||||
;;
|
||||
c) CHANNEL_NAME=$OPTARG
|
||||
;;
|
||||
t) CLI_TIMEOUT=$OPTARG
|
||||
;;
|
||||
d) CLI_DELAY=$OPTARG
|
||||
;;
|
||||
s) IF_COUCHDB=$OPTARG
|
||||
;;
|
||||
l) CC_SRC_LANGUAGE=$OPTARG
|
||||
;;
|
||||
i) IMAGETAG=$OPTARG
|
||||
;;
|
||||
v) VERBOSE=true
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Announce what was requested
|
||||
|
||||
if [ "${IF_COUCHDB}" == "couchdb" ]; then
|
||||
echo
|
||||
echo "${EXPMODE} with channel '${CHANNEL_NAME}' and CLI timeout of '${CLI_TIMEOUT}' seconds and CLI delay of '${CLI_DELAY}' seconds and using database '${IF_COUCHDB}'"
|
||||
else
|
||||
echo "${EXPMODE} with channel '${CHANNEL_NAME}' and CLI timeout of '${CLI_TIMEOUT}' seconds and CLI delay of '${CLI_DELAY}' seconds"
|
||||
fi
|
||||
# ask for confirmation to proceed
|
||||
askProceed
|
||||
|
||||
#Create the network using docker compose
|
||||
if [ "${MODE}" == "up" ]; then
|
||||
networkUp
|
||||
elif [ "${MODE}" == "down" ]; then ## Clear the network
|
||||
networkDown
|
||||
elif [ "${MODE}" == "generate" ]; then ## Generate Artifacts
|
||||
generateCerts
|
||||
generateChannelArtifacts
|
||||
createConfigTx
|
||||
elif [ "${MODE}" == "restart" ]; then ## Restart the network
|
||||
networkDown
|
||||
networkUp
|
||||
else
|
||||
printHelp
|
||||
exit 1
|
||||
fi
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
---
|
||||
################################################################################
|
||||
#
|
||||
# Section: Organizations
|
||||
#
|
||||
# - This section defines the different organizational identities which will
|
||||
# be referenced later in the configuration.
|
||||
#
|
||||
################################################################################
|
||||
Organizations:
|
||||
- &Org3
|
||||
# DefaultOrg defines the organization which is used in the sampleconfig
|
||||
# of the fabric.git development environment
|
||||
Name: Org3MSP
|
||||
|
||||
# ID to load the MSP definition as
|
||||
ID: Org3MSP
|
||||
|
||||
MSPDir: crypto-config/peerOrganizations/org3.example.com/msp
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For organization policies, their canonical path is usually
|
||||
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org3MSP.admin', 'Org3MSP.peer', 'Org3MSP.client')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org3MSP.admin', 'Org3MSP.client')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('Org3MSP.admin')"
|
||||
|
||||
AnchorPeers:
|
||||
# AnchorPeers defines the location of peers which can be used
|
||||
# for cross org gossip communication. Note, this value is only
|
||||
# encoded in the genesis block in the Application section context
|
||||
- Host: peer0.org3.example.com
|
||||
Port: 11051
|
||||
|
||||
Policies:
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org3MSP.admin', 'Org3MSP.peer', 'Org3MSP.client')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org3MSP.admin', 'Org3MSP.client')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('Org3MSP.admin')"
|
||||
Endorsement:
|
||||
Type: Signature
|
||||
Rule: "OR('Org3MSP.peer')"
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# "PeerOrgs" - Definition of organizations managing peer nodes
|
||||
# ---------------------------------------------------------------------------
|
||||
PeerOrgs:
|
||||
# ---------------------------------------------------------------------------
|
||||
# Org3
|
||||
# ---------------------------------------------------------------------------
|
||||
- Name: Org3
|
||||
Domain: org3.example.com
|
||||
EnableNodeOUs: true
|
||||
Template:
|
||||
Count: 2
|
||||
Users:
|
||||
Count: 1
|
||||
|
|
@ -1,169 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo
|
||||
echo " ____ _____ _ ____ _____ "
|
||||
echo "/ ___| |_ _| / \ | _ \ |_ _|"
|
||||
echo "\___ \ | | / _ \ | |_) | | | "
|
||||
echo " ___) | | | / ___ \ | _ < | | "
|
||||
echo "|____/ |_| /_/ \_\ |_| \_\ |_| "
|
||||
echo
|
||||
echo "Build your first network (BYFN) end-to-end test"
|
||||
echo
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
NO_CHAINCODE="$6"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${DELAY:="3"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${VERBOSE:="false"}
|
||||
: ${NO_CHAINCODE:="false"}
|
||||
CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]`
|
||||
COUNTER=1
|
||||
MAX_RETRY=20
|
||||
PACKAGE_ID=""
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
echo "Channel name : "$CHANNEL_NAME
|
||||
|
||||
# import utils
|
||||
. scripts/utils.sh
|
||||
|
||||
createChannel() {
|
||||
setGlobals 0 1
|
||||
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Channel creation failed"
|
||||
echo "===================== Channel '$CHANNEL_NAME' created ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
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 $DELAY
|
||||
echo
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
## 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
|
||||
|
||||
if [ "${NO_CHAINCODE}" != "true" ]; then
|
||||
|
||||
## at first we package the chaincode
|
||||
packageChaincode 1 0 1
|
||||
|
||||
## Install chaincode on peer0.org1 and peer0.org2
|
||||
echo "Installing chaincode on peer0.org1..."
|
||||
installChaincode 0 1
|
||||
echo "Install chaincode on peer0.org2..."
|
||||
installChaincode 0 2
|
||||
|
||||
## query whether the chaincode is installed
|
||||
queryInstalled 0 1
|
||||
|
||||
## approve the definition for org1
|
||||
approveForMyOrg 1 0 1
|
||||
|
||||
## check whether the chaincode definition is ready to be committed
|
||||
## expect org1 to have approved and org2 not to
|
||||
checkCommitReadiness 1 0 1 "\"Org1MSP\": true" "\"Org2MSP\": false"
|
||||
checkCommitReadiness 1 0 2 "\"Org1MSP\": true" "\"Org2MSP\": false"
|
||||
|
||||
## now approve also for org2
|
||||
approveForMyOrg 1 0 2
|
||||
|
||||
## check whether the chaincode definition is ready to be committed
|
||||
## expect them both to have approved
|
||||
checkCommitReadiness 1 0 1 "\"Org1MSP\": true" "\"Org2MSP\": true"
|
||||
checkCommitReadiness 1 0 2 "\"Org1MSP\": true" "\"Org2MSP\": true"
|
||||
|
||||
## now that we know for sure both orgs have approved, commit the definition
|
||||
commitChaincodeDefinition 1 0 1 0 2
|
||||
|
||||
## query on both orgs to see that the definition committed successfully
|
||||
queryCommitted 1 0 1
|
||||
queryCommitted 1 0 2
|
||||
|
||||
# invoke init
|
||||
chaincodeInvoke 1 0 1 0 2
|
||||
|
||||
# Query chaincode on peer0.org1
|
||||
echo "Querying chaincode on peer0.org1..."
|
||||
chaincodeQuery 0 1 100
|
||||
|
||||
# Invoke chaincode on peer0.org1 and peer0.org2
|
||||
echo "Sending invoke transaction on peer0.org1 peer0.org2..."
|
||||
chaincodeInvoke 0 0 1 0 2
|
||||
|
||||
# Query chaincode on peer0.org1
|
||||
echo "Querying chaincode on peer0.org1..."
|
||||
chaincodeQuery 0 1 90
|
||||
|
||||
## 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
|
||||
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "========= All GOOD, BYFN execution completed =========== "
|
||||
echo
|
||||
|
||||
echo
|
||||
echo " _____ _ _ ____ "
|
||||
echo "| ____| | \ | | | _ \ "
|
||||
echo "| _| | \| | | | | | "
|
||||
echo "| |___ | |\ | | |_| | "
|
||||
echo "|_____| |_| \_| |____/ "
|
||||
echo
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script is designed to be run in the org3cli container as the
|
||||
# first step of the EYFN tutorial. It creates and submits a
|
||||
# configuration transaction to add org3 to the network previously
|
||||
# setup in the BYFN tutorial.
|
||||
#
|
||||
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${DELAY:="3"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${VERBOSE:="false"}
|
||||
CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]`
|
||||
COUNTER=1
|
||||
MAX_RETRY=5
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# import utils
|
||||
. scripts/utils.sh
|
||||
|
||||
echo
|
||||
echo "========= Creating config transaction to add org3 to network =========== "
|
||||
echo
|
||||
|
||||
# Fetch the config for the channel, writing it to config.json
|
||||
fetchChannelConfig ${CHANNEL_NAME} config.json
|
||||
|
||||
# Modify the configuration to append the new org
|
||||
set -x
|
||||
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json
|
||||
set +x
|
||||
|
||||
# Compute a config update, based on the differences between config.json and modified_config.json, write it as a transaction to org3_update_in_envelope.pb
|
||||
createConfigUpdate ${CHANNEL_NAME} config.json modified_config.json org3_update_in_envelope.pb
|
||||
|
||||
echo
|
||||
echo "========= Config transaction to add org3 to network created ===== "
|
||||
echo
|
||||
|
||||
echo "Signing config transaction"
|
||||
echo
|
||||
signConfigtxAsPeerOrg 1 org3_update_in_envelope.pb
|
||||
|
||||
echo
|
||||
echo "========= Submitting transaction from a different peer (peer0.org2) which also signs it ========= "
|
||||
echo
|
||||
setGlobals 0 2
|
||||
set -x
|
||||
peer channel update -f org3_update_in_envelope.pb -c ${CHANNEL_NAME} -o orderer.example.com:7050 --tls --cafile ${ORDERER_CA}
|
||||
set +x
|
||||
|
||||
echo
|
||||
echo "========= Config transaction to add org3 to network submitted! =========== "
|
||||
echo
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script is designed to be run in the org3cli container as the
|
||||
# second step of the EYFN tutorial. It joins the org3 peers to the
|
||||
# channel previously setup in the BYFN tutorial and install the
|
||||
# chaincode as version 2.0 on peer0.org3.
|
||||
#
|
||||
|
||||
echo
|
||||
echo "========= Getting Org3 on to your first network ========= "
|
||||
echo
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${DELAY:="3"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${VERBOSE:="false"}
|
||||
CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]`
|
||||
COUNTER=1
|
||||
MAX_RETRY=5
|
||||
PACKAGE_ID=""
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# import utils
|
||||
. scripts/utils.sh
|
||||
|
||||
echo "Fetching channel config block from orderer..."
|
||||
set -x
|
||||
peer channel fetch 0 $CHANNEL_NAME.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
verifyResult $res "Fetching config block from orderer has Failed"
|
||||
|
||||
joinChannelWithRetry 0 3
|
||||
echo "===================== peer0.org3 joined channel '$CHANNEL_NAME' ===================== "
|
||||
joinChannelWithRetry 1 3
|
||||
echo "===================== peer1.org3 joined channel '$CHANNEL_NAME' ===================== "
|
||||
|
||||
## at first we package the chaincode
|
||||
packageChaincode 1 0 3
|
||||
|
||||
echo "Installing chaincode on peer0.org3..."
|
||||
installChaincode 0 3
|
||||
|
||||
## query whether the chaincode is installed
|
||||
queryInstalled 0 3
|
||||
|
||||
## sanity check: expect the chaincode to be already committed
|
||||
queryCommitted 1 0 3
|
||||
|
||||
## approve it for our org, so that our peers know what package to invoke
|
||||
approveForMyOrg 1 0 3
|
||||
|
||||
# Query on chaincode on peer0.org3, check if the result is 90
|
||||
echo "Querying chaincode on peer0.org3..."
|
||||
chaincodeQuery 0 3 90
|
||||
|
||||
echo
|
||||
echo "========= Finished adding Org3 to your first network! ========= "
|
||||
echo
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script is designed to be run in the org3cli container as the
|
||||
# final step of the EYFN tutorial. It simply issues a couple of
|
||||
# chaincode requests through the org3 peers to check that org3 was
|
||||
# properly added to the network previously setup in the BYFN tutorial.
|
||||
#
|
||||
|
||||
echo
|
||||
echo " ____ _____ _ ____ _____ "
|
||||
echo "/ ___| |_ _| / \ | _ \ |_ _|"
|
||||
echo "\___ \ | | / _ \ | |_) | | | "
|
||||
echo " ___) | | | / ___ \ | _ < | | "
|
||||
echo "|____/ |_| /_/ \_\ |_| \_\ |_| "
|
||||
echo
|
||||
echo "Extend your first network (EYFN) test"
|
||||
echo
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${VERBOSE:="false"}
|
||||
CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]`
|
||||
COUNTER=1
|
||||
MAX_RETRY=5
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Channel name : "$CHANNEL_NAME
|
||||
|
||||
# import functions
|
||||
. scripts/utils.sh
|
||||
|
||||
# Query chaincode on peer0.org3, check if the result is 90
|
||||
echo "Querying chaincode on peer0.org3..."
|
||||
chaincodeQuery 0 3 90
|
||||
|
||||
# Invoke chaincode on peer0.org1 and peer0.org3
|
||||
echo "Sending invoke transaction on peer0.org1 peer0.org3..."
|
||||
chaincodeInvoke 0 0 1 0 3
|
||||
|
||||
# Query on chaincode on peer0.org3, peer0.org2, peer0.org1 check if the result is 80
|
||||
# We query a peer in each organization, to ensure peers from all organizations are in sync
|
||||
# and there is no state fork between organizations.
|
||||
echo "Querying chaincode on peer0.org3..."
|
||||
chaincodeQuery 0 3 80
|
||||
|
||||
echo "Querying chaincode on peer0.org2..."
|
||||
chaincodeQuery 0 2 80
|
||||
|
||||
echo "Querying chaincode on peer0.org1..."
|
||||
chaincodeQuery 0 1 80
|
||||
|
||||
|
||||
echo
|
||||
echo "========= All GOOD, EYFN test execution completed =========== "
|
||||
echo
|
||||
|
||||
echo
|
||||
echo " _____ _ _ ____ "
|
||||
echo "| ____| | \ | | | _ \ "
|
||||
echo "| _| | \| | | | | | "
|
||||
echo "| |___ | |\ | | |_| | "
|
||||
echo "|_____| |_| \_| |____/ "
|
||||
echo
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo
|
||||
echo " ____ _____ _ ____ _____ "
|
||||
echo "/ ___| |_ _| / \ | _ \ |_ _|"
|
||||
echo "\___ \ | | / _ \ | |_) | | | "
|
||||
echo " ___) | | | / ___ \ | _ < | | "
|
||||
echo "|____/ |_| /_/ \_\ |_| \_\ |_| "
|
||||
echo
|
||||
echo "Upgrade your first network (BYFN) from v1.3.x to v1.4.x end-to-end test"
|
||||
echo
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${DELAY:="5"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${VERBOSE:="false"}
|
||||
CC_SRC_LANGUAGE=$(echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:])
|
||||
COUNTER=1
|
||||
MAX_RETRY=5
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Channel name : "$CHANNEL_NAME
|
||||
|
||||
# import utils
|
||||
. scripts/utils.sh
|
||||
|
||||
sleep $DELAY
|
||||
|
||||
#Query on chaincode on Peer0/Org1
|
||||
echo "Querying chaincode on org1/peer0..."
|
||||
chaincodeQuery 0 1 90
|
||||
|
||||
sleep $DELAY
|
||||
|
||||
#Invoke on chaincode on Peer0/Org1
|
||||
echo "Sending invoke transaction on org1/peer0..."
|
||||
chaincodeInvoke 0 1 0 2
|
||||
|
||||
sleep $DELAY
|
||||
|
||||
#Query on chaincode on Peer0/Org1
|
||||
echo "Querying chaincode on org1/peer0..."
|
||||
chaincodeQuery 0 1 80
|
||||
|
||||
echo
|
||||
echo "===================== All GOOD, End-2-End UPGRADE Scenario execution completed ===================== "
|
||||
echo
|
||||
|
||||
echo
|
||||
echo " _____ _ _ ____ _____ ____ _____ "
|
||||
echo "| ____| | \ | | | _ \ | ____| |___ \ | ____|"
|
||||
echo "| _| | \| | | | | | _____ | _| __) | | _| "
|
||||
echo "| |___ | |\ | | |_| | |_____| | |___ / __/ | |___ "
|
||||
echo "|_____| |_| \_| |____/ |_____| |_____| |_____|"
|
||||
echo
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,451 +0,0 @@
|
|||
#
|
||||
# Copyright IBM Corp All Rights Reserved
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This is a collection of bash functions used by different scripts
|
||||
|
||||
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.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
|
||||
PEER0_ORG3_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
|
||||
|
||||
# verify the result of the end-to-end test
|
||||
verifyResult() {
|
||||
if [ $1 -ne 0 ]; then
|
||||
echo "!!!!!!!!!!!!!!! "$2" !!!!!!!!!!!!!!!!"
|
||||
echo "========= ERROR !!! FAILED to execute End-2-End Scenario ==========="
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Set OrdererOrg.Admin globals
|
||||
setOrdererGlobals() {
|
||||
CORE_PEER_LOCALMSPID="OrdererMSP"
|
||||
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
|
||||
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp
|
||||
}
|
||||
|
||||
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:8051
|
||||
fi
|
||||
elif [ $ORG -eq 2 ]; then
|
||||
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:9051
|
||||
else
|
||||
CORE_PEER_ADDRESS=peer1.org2.example.com:10051
|
||||
fi
|
||||
|
||||
elif [ $ORG -eq 3 ]; then
|
||||
CORE_PEER_LOCALMSPID="Org3MSP"
|
||||
CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG3_CA
|
||||
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
|
||||
if [ $PEER -eq 0 ]; then
|
||||
CORE_PEER_ADDRESS=peer0.org3.example.com:11051
|
||||
else
|
||||
CORE_PEER_ADDRESS=peer1.org3.example.com:12051
|
||||
fi
|
||||
else
|
||||
echo "================== ERROR !!! ORG Unknown =================="
|
||||
fi
|
||||
|
||||
if [ "$VERBOSE" == "true" ]; then
|
||||
env | grep CORE
|
||||
fi
|
||||
}
|
||||
|
||||
updateAnchorPeers() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Anchor peer update failed"
|
||||
echo "===================== Anchor peers updated for org '$CORE_PEER_LOCALMSPID' on channel '$CHANNEL_NAME' ===================== "
|
||||
sleep $DELAY
|
||||
echo
|
||||
}
|
||||
|
||||
## Sometimes Join takes time hence RETRY at least 5 times
|
||||
joinChannelWithRetry() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
|
||||
set -x
|
||||
peer channel join -b $CHANNEL_NAME.block >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
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 $DELAY seconds"
|
||||
sleep $DELAY
|
||||
joinChannelWithRetry $PEER $ORG
|
||||
else
|
||||
COUNTER=1
|
||||
fi
|
||||
verifyResult $res "After $MAX_RETRY attempts, peer${PEER}.org${ORG} has failed to join channel '$CHANNEL_NAME' "
|
||||
}
|
||||
|
||||
# packageChaincode VERSION PEER ORG
|
||||
packageChaincode() {
|
||||
VERSION=$1
|
||||
PEER=$2
|
||||
ORG=$3
|
||||
setGlobals $PEER $ORG
|
||||
set -x
|
||||
peer lifecycle chaincode package mycc.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label mycc_${VERSION} >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode packaging on peer${PEER}.org${ORG} has failed"
|
||||
echo "===================== Chaincode is packaged on peer${PEER}.org${ORG} ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# installChaincode PEER ORG
|
||||
installChaincode() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
set -x
|
||||
peer lifecycle chaincode install mycc.tar.gz >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode installation on peer${PEER}.org${ORG} has failed"
|
||||
echo "===================== Chaincode is installed on peer${PEER}.org${ORG} ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# queryInstalled PEER ORG
|
||||
queryInstalled() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
set -x
|
||||
peer lifecycle chaincode queryinstalled >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
PACKAGE_ID=`sed -n '/Package/{s/^Package ID: //; s/, Label:.*$//; p;}' log.txt`
|
||||
verifyResult $res "Query installed on peer${PEER}.org${ORG} has failed"
|
||||
echo PackageID is ${PACKAGE_ID}
|
||||
echo "===================== Query installed successful on peer${PEER}.org${ORG} on channel ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# approveForMyOrg VERSION PEER ORG
|
||||
approveForMyOrg() {
|
||||
VERSION=$1
|
||||
PEER=$2
|
||||
ORG=$3
|
||||
setGlobals $PEER $ORG
|
||||
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer lifecycle chaincode approveformyorg --channelID $CHANNEL_NAME --name mycc --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence ${VERSION} --waitForEvent >&log.txt
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer lifecycle chaincode approveformyorg --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name mycc --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence ${VERSION} --waitForEvent >&log.txt
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode definition approved on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' failed"
|
||||
echo "===================== Chaincode definition approved on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# commitChaincodeDefinition VERSION PEER ORG (PEER ORG)...
|
||||
commitChaincodeDefinition() {
|
||||
VERSION=$1
|
||||
shift
|
||||
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
|
||||
set -x
|
||||
peer lifecycle chaincode commit -o orderer.example.com:7050 --channelID $CHANNEL_NAME --name mycc $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --init-required >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name mycc $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --init-required >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode definition commit failed on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' failed"
|
||||
echo "===================== Chaincode definition committed on channel '$CHANNEL_NAME' ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# checkCommitReadiness VERSION PEER ORG
|
||||
checkCommitReadiness() {
|
||||
VERSION=$1
|
||||
PEER=$2
|
||||
ORG=$3
|
||||
shift 3
|
||||
setGlobals $PEER $ORG
|
||||
echo "===================== Checking the commit readiness of the chaincode definition 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 $DELAY
|
||||
echo "Attempting to check the commit readiness of the chaincode definition on peer${PEER}.org${ORG} ...$(($(date +%s) - starttime)) secs"
|
||||
set -x
|
||||
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name mycc $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --output json --init-required >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
test $res -eq 0 || continue
|
||||
let rc=0
|
||||
for var in "$@"
|
||||
do
|
||||
grep "$var" log.txt &>/dev/null || let rc=1
|
||||
done
|
||||
done
|
||||
echo
|
||||
cat log.txt
|
||||
if test $rc -eq 0; then
|
||||
echo "===================== Checking the commit readiness of the chaincode definition successful on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== "
|
||||
else
|
||||
echo "!!!!!!!!!!!!!!! Check commit readiness result on peer${PEER}.org${ORG} is INVALID !!!!!!!!!!!!!!!!"
|
||||
echo "================== ERROR !!! FAILED to execute End-2-End Scenario =================="
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# queryCommitted VERSION PEER ORG
|
||||
queryCommitted() {
|
||||
VERSION=$1
|
||||
PEER=$2
|
||||
ORG=$3
|
||||
setGlobals $PEER $ORG
|
||||
EXPECTED_RESULT="Version: ${VERSION}, Sequence: ${VERSION}, Endorsement Plugin: escc, Validation Plugin: vscc"
|
||||
echo "===================== Querying chaincode definition 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 $DELAY
|
||||
echo "Attempting to Query committed status on peer${PEER}.org${ORG} ...$(($(date +%s) - starttime)) secs"
|
||||
set -x
|
||||
peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name mycc >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
test $res -eq 0 && VALUE=$(cat log.txt | grep -o '^Version: [0-9], Sequence: [0-9], Endorsement Plugin: escc, Validation Plugin: vscc')
|
||||
test "$VALUE" = "$EXPECTED_RESULT" && let rc=0
|
||||
done
|
||||
echo
|
||||
cat log.txt
|
||||
if test $rc -eq 0; then
|
||||
echo "===================== Query chaincode definition successful on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== "
|
||||
else
|
||||
echo "!!!!!!!!!!!!!!! Query chaincode definition result on peer${PEER}.org${ORG} is INVALID !!!!!!!!!!!!!!!!"
|
||||
echo "================== ERROR !!! FAILED to execute End-2-End Scenario =================="
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
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 $DELAY
|
||||
echo "Attempting to Query peer${PEER}.org${ORG} ...$(($(date +%s) - starttime)) secs"
|
||||
set -x
|
||||
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
test $res -eq 0 && VALUE=$(cat log.txt | awk '/Query Result/ {print $NF}')
|
||||
test "$VALUE" = "$EXPECTED_RESULT" && let rc=0
|
||||
# removed the string "Query Result" from peer chaincode query command
|
||||
# result. as a result, have to support both options until the change
|
||||
# is merged.
|
||||
test $rc -ne 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
|
||||
}
|
||||
|
||||
# fetchChannelConfig <channel_id> <output_json>
|
||||
# Writes the current channel config for a given channel to a JSON file
|
||||
fetchChannelConfig() {
|
||||
CHANNEL=$1
|
||||
OUTPUT=$2
|
||||
|
||||
setOrdererGlobals
|
||||
|
||||
echo "Fetching the most recent configuration block for the channel"
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL --cafile $ORDERER_CA
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL --tls --cafile $ORDERER_CA
|
||||
set +x
|
||||
fi
|
||||
|
||||
echo "Decoding config block to JSON and isolating config to ${OUTPUT}"
|
||||
set -x
|
||||
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config >"${OUTPUT}"
|
||||
set +x
|
||||
}
|
||||
|
||||
# signConfigtxAsPeerOrg <org> <configtx.pb>
|
||||
# Set the peerOrg admin of an org and signing the config update
|
||||
signConfigtxAsPeerOrg() {
|
||||
PEERORG=$1
|
||||
TX=$2
|
||||
setGlobals 0 $PEERORG
|
||||
set -x
|
||||
peer channel signconfigtx -f "${TX}"
|
||||
set +x
|
||||
}
|
||||
|
||||
# createConfigUpdate <channel_id> <original_config.json> <modified_config.json> <output.pb>
|
||||
# Takes an original and modified config, and produces the config update tx
|
||||
# which transitions between the two
|
||||
createConfigUpdate() {
|
||||
CHANNEL=$1
|
||||
ORIGINAL=$2
|
||||
MODIFIED=$3
|
||||
OUTPUT=$4
|
||||
|
||||
set -x
|
||||
configtxlator proto_encode --input "${ORIGINAL}" --type common.Config >original_config.pb
|
||||
configtxlator proto_encode --input "${MODIFIED}" --type common.Config >modified_config.pb
|
||||
configtxlator compute_update --channel_id "${CHANNEL}" --original original_config.pb --updated modified_config.pb >config_update.pb
|
||||
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate >config_update.json
|
||||
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL'", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . >config_update_in_envelope.json
|
||||
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope >"${OUTPUT}"
|
||||
set +x
|
||||
}
|
||||
|
||||
# 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
|
||||
setGlobals $1 $2
|
||||
PEER="peer$1.org$2"
|
||||
PEERS="$PEERS $PEER"
|
||||
PEER_CONN_PARMS="$PEER_CONN_PARMS --peerAddresses $CORE_PEER_ADDRESS"
|
||||
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 IS_INIT PEER ORG (PEER ORG) ...
|
||||
# Accepts as many peer/org pairs as desired and requests endorsement from each
|
||||
chaincodeInvoke() {
|
||||
IS_INIT=$1
|
||||
shift
|
||||
parsePeerConnectionParameters $@
|
||||
res=$?
|
||||
verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters "
|
||||
|
||||
if [ "${IS_INIT}" -eq "1" ]; then
|
||||
CCARGS='{"Args":["Init","a","100","b","100"]}'
|
||||
INIT_ARG="--isInit"
|
||||
else
|
||||
CCARGS='{"Args":["invoke","a","b","10"]}'
|
||||
INIT_ARG=""
|
||||
fi
|
||||
|
||||
# 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
|
||||
set -x
|
||||
peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc $PEER_CONN_PARMS ${INIT_ARG} -c ${CCARGS} >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc $PEER_CONN_PARMS ${INIT_ARG} -c ${CCARGS} >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Invoke execution on $PEERS failed "
|
||||
echo "===================== Invoke transaction successful on $PEERS on channel '$CHANNEL_NAME' ===================== "
|
||||
echo
|
||||
}
|
||||
Loading…
Reference in a new issue