mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-22 01:25:10 +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