mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 15:35:09 +00:00
Add chaincode utilities
This change is meant to help cover end user functionality that was previously covered by the blockchain VSCode Plugin. Functions added: - cc mode with package, list chaincode, invoke and query functions - auto sequencing for chaincode deployment - move variables into config file Signed-off-by: Chris Elder <celder@Chriss-MacBook-Air.local>
This commit is contained in:
parent
99a1f49da0
commit
e73bb717db
6 changed files with 533 additions and 110 deletions
58
test-network/network.config
Normal file
58
test-network/network.config
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
# default image tag, example: "2.5.4". "default" will download the latest. (-i)
|
||||
IMAGETAG="default"
|
||||
|
||||
# default ca image tag, example: "1.5.7". "default" will download the latest. (-cai)
|
||||
CA_IMAGETAG="default"
|
||||
|
||||
# Using crpto vs CA. default is cryptogen
|
||||
CRYPTO="cryptogen"
|
||||
|
||||
# max number of retries before giving up (-r)
|
||||
MAX_RETRY=5
|
||||
|
||||
# default for delay between commands (-d)
|
||||
CLI_DELAY=3
|
||||
|
||||
# channel name defaults to "mychannel" (-c)
|
||||
CHANNEL_NAME="mychannel"
|
||||
|
||||
# default database (-s)
|
||||
DATABASE="leveldb"
|
||||
|
||||
# default org (-org)
|
||||
ORG=1
|
||||
|
||||
# chaincode language defaults to "NA" (-ccl)
|
||||
CC_SRC_LANGUAGE="go"
|
||||
|
||||
# Chaincode version (-ccv)
|
||||
CC_VERSION="1.0.1"
|
||||
|
||||
# chaincode name defaults to "NA" (-ccn)
|
||||
CC_NAME="basic"
|
||||
|
||||
# default to running the docker commands for the CCAAS (-ccaasdocker)
|
||||
CCAAS_DOCKER_RUN=true
|
||||
|
||||
# chaincode path defaults to "NA" (-ccp)
|
||||
CC_SRC_PATH="../asset-transfer-basic/chaincode-go"
|
||||
|
||||
# endorsement policy defaults to "NA". This would allow chaincodes to use the majority default policy. (-ccep)
|
||||
CC_END_POLICY="NA"
|
||||
|
||||
# collection configuration defaults to "NA" (-cccg)
|
||||
CC_COLL_CONFIG="NA"
|
||||
|
||||
# chaincode init function defaults to "NA" (-cci)
|
||||
CC_INIT_FCN="NA"
|
||||
|
||||
# Chaincode definition sequence, this should be an integer or auto (-ccs)
|
||||
CC_SEQUENCE=auto
|
||||
|
||||
# Default constructor for testing a chaincode invoke (-ccic)
|
||||
CC_INVOKE_CONSTRUCTOR=''{\"Args\":[\"InitLedger\"]}''
|
||||
|
||||
# Default constructor for testing a chaincode query (-cciq)
|
||||
CC_QUERY_CONSTRUCTOR=''{\"Args\":[\"GetAllAssets\"]}''
|
||||
|
||||
|
||||
|
|
@ -351,6 +351,66 @@ function deployCCAAS() {
|
|||
fi
|
||||
}
|
||||
|
||||
## Call the script to package the chaincode
|
||||
function packageChaincode() {
|
||||
|
||||
infoln "Packaging chaincode"
|
||||
|
||||
scripts/packageCC.sh $CC_NAME $CC_SRC_PATH $CC_SRC_LANGUAGE $CC_VERSION true
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
fatalln "Packaging the chaincode failed"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
## Call the script to list installed and committed chaincode on a peer
|
||||
function listChaincode() {
|
||||
|
||||
export FABRIC_CFG_PATH=${PWD}/../config
|
||||
|
||||
. scripts/envVar.sh
|
||||
. scripts/ccutils.sh
|
||||
|
||||
setGlobals $ORG
|
||||
|
||||
println
|
||||
queryInstalledOnPeer
|
||||
println
|
||||
|
||||
listAllCommitted
|
||||
|
||||
}
|
||||
|
||||
## Call the script to invoke
|
||||
function invokeChaincode() {
|
||||
|
||||
export FABRIC_CFG_PATH=${PWD}/../config
|
||||
|
||||
. scripts/envVar.sh
|
||||
. scripts/ccutils.sh
|
||||
|
||||
setGlobals $ORG
|
||||
|
||||
chaincodeInvoke $ORG $CHANNEL_NAME $CC_NAME $CC_INVOKE_CONSTRUCTOR
|
||||
|
||||
}
|
||||
|
||||
## Call the script to query chaincode
|
||||
function queryChaincode() {
|
||||
|
||||
export FABRIC_CFG_PATH=${PWD}/../config
|
||||
|
||||
. scripts/envVar.sh
|
||||
. scripts/ccutils.sh
|
||||
|
||||
setGlobals $ORG
|
||||
|
||||
chaincodeQuery $ORG $CHANNEL_NAME $CC_NAME $CC_QUERY_CONSTRUCTOR
|
||||
|
||||
}
|
||||
|
||||
|
||||
# Tear down running network
|
||||
function networkDown() {
|
||||
local temp_compose=$COMPOSE_FILE_BASE
|
||||
|
|
@ -396,25 +456,8 @@ function networkDown() {
|
|||
fi
|
||||
}
|
||||
|
||||
# Using crpto vs CA. default is cryptogen
|
||||
CRYPTO="cryptogen"
|
||||
# timeout duration - the duration the CLI should wait for a response from
|
||||
# another container before giving up
|
||||
MAX_RETRY=5
|
||||
# default for delay between commands
|
||||
CLI_DELAY=3
|
||||
# channel name defaults to "mychannel"
|
||||
CHANNEL_NAME="mychannel"
|
||||
# chaincode name defaults to "NA"
|
||||
CC_NAME="NA"
|
||||
# chaincode path defaults to "NA"
|
||||
CC_SRC_PATH="NA"
|
||||
# endorsement policy defaults to "NA". This would allow chaincodes to use the majority default policy.
|
||||
CC_END_POLICY="NA"
|
||||
# collection configuration defaults to "NA"
|
||||
CC_COLL_CONFIG="NA"
|
||||
# chaincode init function defaults to "NA"
|
||||
CC_INIT_FCN="NA"
|
||||
. ./network.config
|
||||
|
||||
# use this as the default docker-compose yaml definition
|
||||
COMPOSE_FILE_BASE=compose-test-net.yaml
|
||||
# docker-compose.yaml file if you are using couchdb
|
||||
|
|
@ -428,16 +471,6 @@ COMPOSE_FILE_ORG3_COUCH=compose-couch-org3.yaml
|
|||
# certificate authorities compose file
|
||||
COMPOSE_FILE_ORG3_CA=compose-ca-org3.yaml
|
||||
#
|
||||
# chaincode language defaults to "NA"
|
||||
CC_SRC_LANGUAGE="NA"
|
||||
# default to running the docker commands for the CCAAS
|
||||
CCAAS_DOCKER_RUN=true
|
||||
# Chaincode version
|
||||
CC_VERSION="1.0"
|
||||
# Chaincode definition sequence
|
||||
CC_SEQUENCE=1
|
||||
# default database
|
||||
DATABASE="leveldb"
|
||||
|
||||
# Get docker sock path from environment variable
|
||||
SOCK="${DOCKER_HOST:-/var/run/docker.sock}"
|
||||
|
|
@ -457,14 +490,28 @@ else
|
|||
shift
|
||||
fi
|
||||
|
||||
# parse a createChannel subcommand if used
|
||||
## if no parameters are passed, show the help for cc
|
||||
if [ "$MODE" == "cc" ] && [[ $# -lt 1 ]]; then
|
||||
printHelp $MODE
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# parse subcommands if used
|
||||
if [[ $# -ge 1 ]] ; then
|
||||
key="$1"
|
||||
# check for the createChannel subcommand
|
||||
if [[ "$key" == "createChannel" ]]; then
|
||||
export MODE="createChannel"
|
||||
shift
|
||||
# check for the cc command
|
||||
elif [[ "$MODE" == "cc" ]]; then
|
||||
if [ "$1" != "-h" ]; then
|
||||
export SUBCOMMAND=$key
|
||||
shift
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# parse flags
|
||||
|
||||
|
|
@ -539,6 +586,26 @@ while [[ $# -ge 1 ]] ; do
|
|||
-verbose )
|
||||
VERBOSE=true
|
||||
;;
|
||||
-org )
|
||||
ORG="$2"
|
||||
shift
|
||||
;;
|
||||
-i )
|
||||
IMAGETAG="$2"
|
||||
shift
|
||||
;;
|
||||
-cai )
|
||||
CA_IMAGETAG="$2"
|
||||
shift
|
||||
;;
|
||||
-ccic )
|
||||
CC_INVOKE_CONSTRUCTOR="$2"
|
||||
shift
|
||||
;;
|
||||
-ccqc )
|
||||
CC_QUERY_CONSTRUCTOR="$2"
|
||||
shift
|
||||
;;
|
||||
* )
|
||||
errorln "Unknown flag: $key"
|
||||
printHelp
|
||||
|
|
@ -566,7 +633,10 @@ else
|
|||
fi
|
||||
|
||||
# Determine mode of operation and printing out what we asked for
|
||||
if [ "$MODE" == "up" ]; then
|
||||
if [ "$MODE" == "prereq" ]; then
|
||||
infoln "Installing binaries and fabric images. Fabric Version: ${IMAGETAG} Fabric CA Version: ${CA_IMAGETAG}"
|
||||
installPrereqs
|
||||
elif [ "$MODE" == "up" ]; then
|
||||
infoln "Starting nodes with CLI timeout of '${MAX_RETRY}' tries and CLI delay of '${CLI_DELAY}' seconds and using database '${DATABASE}' ${CRYPTO_MODE}"
|
||||
networkUp
|
||||
elif [ "$MODE" == "createChannel" ]; then
|
||||
|
|
@ -586,6 +656,14 @@ elif [ "$MODE" == "deployCC" ]; then
|
|||
elif [ "$MODE" == "deployCCAAS" ]; then
|
||||
infoln "deploying chaincode-as-a-service on channel '${CHANNEL_NAME}'"
|
||||
deployCCAAS
|
||||
elif [ "$MODE" == "cc" ] && [ "$SUBCOMMAND" == "package" ]; then
|
||||
packageChaincode
|
||||
elif [ "$MODE" == "cc" ] && [ "$SUBCOMMAND" == "list" ]; then
|
||||
listChaincode
|
||||
elif [ "$MODE" == "cc" ] && [ "$SUBCOMMAND" == "invoke" ]; then
|
||||
invokeChaincode
|
||||
elif [ "$MODE" == "cc" ] && [ "$SUBCOMMAND" == "query" ]; then
|
||||
queryChaincode
|
||||
else
|
||||
printHelp
|
||||
exit 1
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
# installChaincode PEER ORG
|
||||
function installChaincode() {
|
||||
ORG=$1
|
||||
|
|
@ -174,3 +173,174 @@ function chaincodeQuery() {
|
|||
fatalln "After $MAX_RETRY attempts, Query result on peer0.org${ORG} is INVALID!"
|
||||
fi
|
||||
}
|
||||
|
||||
function resolveSequence() {
|
||||
|
||||
#if the sequence is not "auto", then use the provided sequence
|
||||
if [[ "${CC_SEQUENCE}" != "auto" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
local rc=1
|
||||
local COUNTER=1
|
||||
# first, find the sequence number of the committed chaincode
|
||||
# we either get a successful response, or reach MAX RETRY
|
||||
while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
|
||||
set -x
|
||||
COMMITTED_CC_SEQUENCE=$(peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name ${CC_NAME} | sed -n "/Version:/{s/.*Sequence: //; s/, Endorsement Plugin:.*$//; p;}")
|
||||
res=$?
|
||||
{ set +x; } 2>/dev/null
|
||||
let rc=$res
|
||||
COUNTER=$(expr $COUNTER + 1)
|
||||
done
|
||||
|
||||
# if there are no committed versions, then set the sequence to 1
|
||||
if [ -z $COMMITTED_CC_SEQUENCE ]; then
|
||||
CC_SEQUENCE=1
|
||||
return 0
|
||||
fi
|
||||
|
||||
rc=1
|
||||
COUNTER=1
|
||||
# next, find the sequence number of the approved chaincode
|
||||
# we either get a successful response, or reach MAX RETRY
|
||||
while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
|
||||
set -x
|
||||
APPROVED_CC_SEQUENCE=$(peer lifecycle chaincode queryapproved --channelID $CHANNEL_NAME --name ${CC_NAME} | sed -n "/sequence:/{s/^sequence: //; s/, version:.*$//; p;}")
|
||||
res=$?
|
||||
{ set +x; } 2>/dev/null
|
||||
let rc=$res
|
||||
COUNTER=$(expr $COUNTER + 1)
|
||||
done
|
||||
|
||||
# if the committed sequence and the approved sequence match, then increment the sequence
|
||||
# otherwise, use the approved sequence
|
||||
if [ $COMMITTED_CC_SEQUENCE == $APPROVED_CC_SEQUENCE ]; then
|
||||
CC_SEQUENCE=$((COMMITTED_CC_SEQUENCE+1))
|
||||
else
|
||||
CC_SEQUENCE=$APPROVED_CC_SEQUENCE
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
#. scripts/envVar.sh
|
||||
|
||||
queryInstalledOnPeer() {
|
||||
|
||||
local rc=1
|
||||
local COUNTER=1
|
||||
# continue to poll
|
||||
# we either get a successful response, or reach MAX RETRY
|
||||
while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
|
||||
#sleep $DELAY
|
||||
#infoln "Attempting to list on peer0.org${ORG}, Retry after $DELAY seconds."
|
||||
peer lifecycle chaincode queryinstalled >&log.txt
|
||||
res=$?
|
||||
let rc=$res
|
||||
COUNTER=$(expr $COUNTER + 1)
|
||||
done
|
||||
cat log.txt
|
||||
}
|
||||
|
||||
queryCommittedOnChannel() {
|
||||
CHANNEL=$1
|
||||
local rc=1
|
||||
local COUNTER=1
|
||||
# continue to poll
|
||||
# we either get a successful response, or reach MAX RETRY
|
||||
while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
|
||||
#sleep $DELAY
|
||||
#infoln "Attempting to list on peer0.org${ORG}, Retry after $DELAY seconds."
|
||||
peer lifecycle chaincode querycommitted -C $CHANNEL >&log.txt
|
||||
res=$?
|
||||
let rc=$res
|
||||
COUNTER=$(expr $COUNTER + 1)
|
||||
done
|
||||
cat log.txt
|
||||
if test $rc -ne 0; then
|
||||
fatalln "After $MAX_RETRY attempts, Failed to retrieve committed chaincode!"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
## Function to list chaincodes installed on the peer and committed chaincode visible to the org
|
||||
listAllCommitted() {
|
||||
|
||||
local rc=1
|
||||
local COUNTER=1
|
||||
# continue to poll
|
||||
# we either get a successful response, or reach MAX RETRY
|
||||
while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
|
||||
CHANNEL_LIST=$(peer channel list | sed '1,1d')
|
||||
res=$?
|
||||
let rc=$res
|
||||
COUNTER=$(expr $COUNTER + 1)
|
||||
done
|
||||
if test $rc -eq 0; then
|
||||
for channel in $CHANNEL_LIST
|
||||
do
|
||||
queryCommittedOnChannel "$channel"
|
||||
done
|
||||
else
|
||||
fatalln "After $MAX_RETRY attempts, Failed to retrieve committed chaincode!"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
chaincodeInvoke() {
|
||||
ORG=$1
|
||||
CHANNEL=$2
|
||||
CC_NAME=$3
|
||||
CC_INVOKE_CONSTRUCTOR=$4
|
||||
|
||||
infoln "Invoking on peer0.org${ORG} on channel '$CHANNEL_NAME'..."
|
||||
local rc=1
|
||||
local COUNTER=1
|
||||
# continue to poll
|
||||
# we either get a successful response, or reach MAX RETRY
|
||||
while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
|
||||
sleep $DELAY
|
||||
infoln "Attempting to Invoke on peer0.org${ORG}, Retry after $DELAY seconds."
|
||||
set -x
|
||||
peer chaincode invoke -o localhost:7050 -C $CHANNEL_NAME -n ${CC_NAME} -c ${CC_INVOKE_CONSTRUCTOR} --tls --cafile $ORDERER_CA --peerAddresses localhost:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses localhost:9051 --tlsRootCertFiles $PEER0_ORG2_CA >&log.txt
|
||||
res=$?
|
||||
{ set +x; } 2>/dev/null
|
||||
let rc=$res
|
||||
COUNTER=$(expr $COUNTER + 1)
|
||||
done
|
||||
cat log.txt
|
||||
if test $rc -eq 0; then
|
||||
successln "Invoke successful on peer0.org${ORG} on channel '$CHANNEL_NAME'"
|
||||
else
|
||||
fatalln "After $MAX_RETRY attempts, Invoke result on peer0.org${ORG} is INVALID!"
|
||||
fi
|
||||
}
|
||||
|
||||
chaincodeQuery() {
|
||||
ORG=$1
|
||||
CHANNEL=$2
|
||||
CC_NAME=$3
|
||||
CC_QUERY_CONSTRUCTOR=$4
|
||||
|
||||
infoln "Querying on peer0.org${ORG} on channel '$CHANNEL_NAME'..."
|
||||
local rc=1
|
||||
local COUNTER=1
|
||||
# continue to poll
|
||||
# we either get a successful response, or reach MAX RETRY
|
||||
while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do
|
||||
sleep $DELAY
|
||||
infoln "Attempting to Query peer0.org${ORG}, Retry after $DELAY seconds."
|
||||
set -x
|
||||
peer chaincode query -C $CHANNEL_NAME -n ${CC_NAME} -c ${CC_QUERY_CONSTRUCTOR} >&log.txt
|
||||
res=$?
|
||||
{ set +x; } 2>/dev/null
|
||||
let rc=$res
|
||||
COUNTER=$(expr $COUNTER + 1)
|
||||
done
|
||||
cat log.txt
|
||||
if test $rc -eq 0; then
|
||||
successln "Query successful on peer0.org${ORG} on channel '$CHANNEL_NAME'"
|
||||
else
|
||||
fatalln "After $MAX_RETRY attempts, Query result on peer0.org${ORG} is INVALID!"
|
||||
fi
|
||||
}
|
||||
|
|
@ -29,66 +29,6 @@ println "- DELAY: ${C_GREEN}${DELAY}${C_RESET}"
|
|||
println "- MAX_RETRY: ${C_GREEN}${MAX_RETRY}${C_RESET}"
|
||||
println "- VERBOSE: ${C_GREEN}${VERBOSE}${C_RESET}"
|
||||
|
||||
FABRIC_CFG_PATH=$PWD/../config/
|
||||
|
||||
#User has not provided a name
|
||||
if [ -z "$CC_NAME" ] || [ "$CC_NAME" = "NA" ]; then
|
||||
fatalln "No chaincode name was provided. Valid call example: ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go"
|
||||
|
||||
# User has not provided a path
|
||||
elif [ -z "$CC_SRC_PATH" ] || [ "$CC_SRC_PATH" = "NA" ]; then
|
||||
fatalln "No chaincode path was provided. Valid call example: ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go"
|
||||
|
||||
# User has not provided a language
|
||||
elif [ -z "$CC_SRC_LANGUAGE" ] || [ "$CC_SRC_LANGUAGE" = "NA" ]; then
|
||||
fatalln "No chaincode language was provided. Valid call example: ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go"
|
||||
|
||||
## Make sure that the path to the chaincode exists
|
||||
elif [ ! -d "$CC_SRC_PATH" ] && [ ! -f "$CC_SRC_PATH" ]; then
|
||||
fatalln "Path to chaincode does not exist. Please provide different path."
|
||||
fi
|
||||
|
||||
CC_SRC_LANGUAGE=$(echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:])
|
||||
|
||||
# do some language specific preparation to the chaincode before packaging
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
|
||||
infoln "Vendoring Go dependencies at $CC_SRC_PATH"
|
||||
pushd $CC_SRC_PATH
|
||||
GO111MODULE=on go mod vendor
|
||||
popd
|
||||
successln "Finished vendoring Go dependencies"
|
||||
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
|
||||
rm -rf $CC_SRC_PATH/build/install/
|
||||
infoln "Compiling Java code..."
|
||||
pushd $CC_SRC_PATH
|
||||
./gradlew installDist
|
||||
popd
|
||||
successln "Finished compiling Java code"
|
||||
CC_SRC_PATH=$CC_SRC_PATH/build/install/$CC_NAME
|
||||
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node
|
||||
|
||||
elif [ "$CC_SRC_LANGUAGE" = "typescript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node
|
||||
|
||||
infoln "Compiling TypeScript code into JavaScript..."
|
||||
pushd $CC_SRC_PATH
|
||||
npm install
|
||||
npm run build
|
||||
popd
|
||||
successln "Finished compiling TypeScript code into JavaScript"
|
||||
|
||||
else
|
||||
fatalln "The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script. Supported chaincode languages are: go, java, javascript, and typescript"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INIT_REQUIRED="--init-required"
|
||||
# check if the init fcn should be called
|
||||
if [ "$CC_INIT_FCN" = "NA" ]; then
|
||||
|
|
@ -107,21 +47,12 @@ else
|
|||
CC_COLL_CONFIG="--collections-config $CC_COLL_CONFIG"
|
||||
fi
|
||||
|
||||
FABRIC_CFG_PATH=$PWD/../config/
|
||||
|
||||
# import utils
|
||||
. scripts/envVar.sh
|
||||
. scripts/ccutils.sh
|
||||
|
||||
packageChaincode() {
|
||||
set -x
|
||||
peer lifecycle chaincode package ${CC_NAME}.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label ${CC_NAME}_${CC_VERSION} >&log.txt
|
||||
res=$?
|
||||
PACKAGE_ID=$(peer lifecycle chaincode calculatepackageid ${CC_NAME}.tar.gz)
|
||||
{ set +x; } 2>/dev/null
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode packaging has failed"
|
||||
successln "Chaincode is packaged"
|
||||
}
|
||||
|
||||
function checkPrereqs() {
|
||||
jq --version > /dev/null 2>&1
|
||||
|
||||
|
|
@ -138,7 +69,9 @@ function checkPrereqs() {
|
|||
checkPrereqs
|
||||
|
||||
## package the chaincode
|
||||
packageChaincode
|
||||
./scripts/packageCC.sh $CC_NAME $CC_SRC_PATH $CC_SRC_LANGUAGE $CC_VERSION
|
||||
|
||||
PACKAGE_ID=$(peer lifecycle chaincode calculatepackageid ${CC_NAME}.tar.gz)
|
||||
|
||||
## Install chaincode on peer0.org1 and peer0.org2
|
||||
infoln "Installing chaincode on peer0.org1..."
|
||||
|
|
@ -146,6 +79,8 @@ installChaincode 1
|
|||
infoln "Install chaincode on peer0.org2..."
|
||||
installChaincode 2
|
||||
|
||||
resolveSequence
|
||||
|
||||
## query whether the chaincode is installed
|
||||
queryInstalled 1
|
||||
|
||||
|
|
|
|||
103
test-network/scripts/packageCC.sh
Executable file
103
test-network/scripts/packageCC.sh
Executable file
|
|
@ -0,0 +1,103 @@
|
|||
#!/bin/bash
|
||||
|
||||
#!/bin/bash
|
||||
|
||||
source scripts/utils.sh
|
||||
|
||||
CC_NAME=${1}
|
||||
CC_SRC_PATH=${2}
|
||||
CC_SRC_LANGUAGE=${3}
|
||||
CC_VERSION=${4}
|
||||
CC_PACKAGE_ONLY=${5:-false}
|
||||
|
||||
println "executing with the following"
|
||||
println "- CC_NAME: ${C_GREEN}${CC_NAME}${C_RESET}"
|
||||
println "- CC_SRC_PATH: ${C_GREEN}${CC_SRC_PATH}${C_RESET}"
|
||||
println "- CC_SRC_LANGUAGE: ${C_GREEN}${CC_SRC_LANGUAGE}${C_RESET}"
|
||||
println "- CC_VERSION: ${C_GREEN}${CC_VERSION}${C_RESET}"
|
||||
|
||||
FABRIC_CFG_PATH=$PWD/../config/
|
||||
|
||||
#User has not provided a name
|
||||
if [ -z "$CC_NAME" ] || [ "$CC_NAME" = "NA" ]; then
|
||||
fatalln "No chaincode name was provided. Valid call example: ./network.sh packageCC -ccn basic -ccp chaincode/asset-transfer-basic/chaincode-go -ccv 1.0.0 -ccl go"
|
||||
|
||||
# User has not provided a path
|
||||
elif [ -z "$CC_SRC_PATH" ] || [ "$CC_SRC_PATH" = "NA" ]; then
|
||||
fatalln "No chaincode path was provided. Valid call example: ./network.sh packageCC -ccn basic -ccp chaincode/asset-transfer-basic/chaincode-go -ccv 1.0.0 -ccl go"
|
||||
|
||||
# User has not provided a language
|
||||
elif [ -z "$CC_SRC_LANGUAGE" ] || [ "$CC_SRC_LANGUAGE" = "NA" ]; then
|
||||
fatalln "No chaincode language was provided. Valid call example: ./network.sh packageCC -ccn basic -ccp chaincode/asset-transfer-basic/chaincode-go -ccv 1.0.0 -ccl go"
|
||||
|
||||
## Make sure that the path to the chaincode exists
|
||||
elif [ ! -d "$CC_SRC_PATH" ]; then
|
||||
fatalln "Path to chaincode does not exist. Please provide different path."
|
||||
fi
|
||||
|
||||
CC_SRC_LANGUAGE=$(echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:])
|
||||
|
||||
# do some language specific preparation to the chaincode before packaging
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
|
||||
infoln "Vendoring Go dependencies at $CC_SRC_PATH"
|
||||
pushd $CC_SRC_PATH
|
||||
GO111MODULE=on go mod vendor
|
||||
popd
|
||||
successln "Finished vendoring Go dependencies"
|
||||
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
|
||||
infoln "Compiling Java code..."
|
||||
pushd $CC_SRC_PATH
|
||||
./gradlew installDist
|
||||
popd
|
||||
successln "Finished compiling Java code"
|
||||
CC_SRC_PATH=$CC_SRC_PATH/build/install/$CC_NAME
|
||||
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node
|
||||
|
||||
elif [ "$CC_SRC_LANGUAGE" = "typescript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node
|
||||
|
||||
infoln "Compiling TypeScript code into JavaScript..."
|
||||
pushd $CC_SRC_PATH
|
||||
npm install
|
||||
npm run build
|
||||
popd
|
||||
successln "Finished compiling TypeScript code into JavaScript"
|
||||
|
||||
else
|
||||
fatalln "The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script. Supported chaincode languages are: go, java, javascript, and typescript"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
verifyResult() {
|
||||
if [ $1 -ne 0 ]; then
|
||||
fatalln "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
packageChaincode() {
|
||||
set -x
|
||||
if [ ${CC_PACKAGE_ONLY} = true ] ; then
|
||||
mkdir -p packagedChaincode
|
||||
peer lifecycle chaincode package packagedChaincode/${CC_NAME}_${CC_VERSION}.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label ${CC_NAME}_${CC_VERSION} >&log.txt
|
||||
else
|
||||
peer lifecycle chaincode package ${CC_NAME}.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label ${CC_NAME}_${CC_VERSION} >&log.txt
|
||||
fi
|
||||
res=$?
|
||||
{ set +x; } 2>/dev/null
|
||||
cat log.txt
|
||||
PACKAGE_ID=$(peer lifecycle chaincode calculatepackageid ${CC_NAME}.tar.gz)
|
||||
verifyResult $res "Chaincode packaging has failed"
|
||||
successln "Chaincode is packaged"
|
||||
}
|
||||
|
||||
## package the chaincode
|
||||
packageChaincode
|
||||
|
||||
exit 0
|
||||
|
|
@ -9,7 +9,18 @@ C_YELLOW='\033[1;33m'
|
|||
# Print the usage message
|
||||
function printHelp() {
|
||||
USAGE="$1"
|
||||
if [ "$USAGE" == "up" ]; then
|
||||
if [ "$USAGE" == "prereq" ]; then
|
||||
println "Usage: "
|
||||
println " network.sh <Mode> [Flags]"
|
||||
println " Modes:"
|
||||
println " \033[0;32mprereq\033[0m - Install Fabric binaries and docker images"
|
||||
println
|
||||
println " Flags:"
|
||||
println " Used with \033[0;32mnetwork.sh prereq\033[0m:"
|
||||
println " -i FabricVersion (default: '2.5.4')"
|
||||
println " -cai Fabric CA Version (default: '1.5.7')"
|
||||
println
|
||||
elif [ "$USAGE" == "up" ]; then
|
||||
println "Usage: "
|
||||
println " network.sh \033[0;32mup\033[0m [Flags]"
|
||||
println
|
||||
|
|
@ -62,7 +73,7 @@ function printHelp() {
|
|||
println " -ccn <name> - Chaincode name."
|
||||
println " -ccl <language> - Programming language of chaincode to deploy: go, java, javascript, typescript"
|
||||
println " -ccv <version> - Chaincode version. 1.0 (default), v2, version3.x, etc"
|
||||
println " -ccs <sequence> - Chaincode definition sequence. Must be an integer, 1 (default), 2, 3, etc"
|
||||
println " -ccs <sequence> - Chaincode definition sequence. Must be auto (default) or an integer, 1 , 2, 3, etc"
|
||||
println " -ccp <path> - File path to the chaincode."
|
||||
println " -ccep <policy> - (Optional) Chaincode endorsement policy using signature policy syntax. The default policy requires an endorsement from Org1 and Org2"
|
||||
println " -cccg <collection-config> - (Optional) File path to private data collections configuration file"
|
||||
|
|
@ -84,7 +95,7 @@ function printHelp() {
|
|||
println " -c <channel name> - Name of channel to deploy chaincode to"
|
||||
println " -ccn <name> - Chaincode name."
|
||||
println " -ccv <version> - Chaincode version. 1.0 (default), v2, version3.x, etc"
|
||||
println " -ccs <sequence> - Chaincode definition sequence. Must be an integer, 1 (default), 2, 3, etc"
|
||||
println " -ccs <sequence> - Chaincode definition sequence. Must be auto (default) or an integer, 1 , 2, 3, etc"
|
||||
println " -ccp <path> - File path to the chaincode. (used to find the dockerfile for building the docker image only)"
|
||||
println " -ccep <policy> - (Optional) Chaincode endorsement policy using signature policy syntax. The default policy requires an endorsement from Org1 and Org2"
|
||||
println " -cccg <collection-config> - (Optional) File path to private data collections configuration file"
|
||||
|
|
@ -99,17 +110,58 @@ function printHelp() {
|
|||
println " Examples:"
|
||||
println " network.sh deployCCAAS -ccn basicj -ccp ../asset-transfer-basic/chaincode-java"
|
||||
println " network.sh deployCCAAS -ccn basict -ccp ../asset-transfer-basic/chaincode-typescript -ccaasdocker false"
|
||||
elif [ "$USAGE" == "cc" ] ; then
|
||||
println "Usage: "
|
||||
println " network.sh cc <Mode> [Flags]"
|
||||
println
|
||||
println " Modes:"
|
||||
println " \033[0;32mlist\033[0m - list chaincodes installed on a peer and committed on a channel"
|
||||
println " \033[0;32mpackage\033[0m - package a chaincode in tar format. Stores in directory packagedChaincode"
|
||||
println " \033[0;32minvoke\033[0m - execute an invoke operation"
|
||||
println " \033[0;32mquery\033[0m - execute an query operation"
|
||||
println
|
||||
println " Flags:"
|
||||
println " -org <number> - Org number for the executing the command (1,2,etc) (default is 1)."
|
||||
println " -c <channel name> - Name of channel"
|
||||
println " -ccn <name> - Chaincode name."
|
||||
println " -ccl <language> - Programming language of chaincode to deploy: go, java, javascript, typescript"
|
||||
println " -ccv <version> - Chaincode version. 1.0 (default), v2, version3.x, etc"
|
||||
println " -ccp <path> - File path to the chaincode."
|
||||
println " -ccic <string> - Chaincode invoke constructor."
|
||||
println " -ccqc <string> - Chaincode query constructor."
|
||||
println " -h - Print this message"
|
||||
println
|
||||
println " Possible Mode and flag combinations"
|
||||
println " \033[0;32mcc list\033[0m -org -verbose"
|
||||
println " \033[0;32mcc package\033[0m -ccn -ccl -ccv -ccp -verbose"
|
||||
println " \033[0;32mcc invoke\033[0m -org -c -ccic -verbose"
|
||||
println " \033[0;32mcc query\033[0m -org -c -ccqc -verbose"
|
||||
println
|
||||
println " Examples:"
|
||||
println " network.sh cc list -org 1"
|
||||
println " network.sh cc package -ccn basic -ccp chaincode/asset-transfer-basic/go -ccv 1.0.0 -ccl go"
|
||||
println " network.sh cc invoke -c channel1 -ccic '{\"Args\":[\"CreateAsset\",\"asset1\",\"red\",\"10\",\"fred\",\"500\"]}'"
|
||||
println " network.sh cc query -c channel1 -ccqc '{\"Args\":[\"ReadAsset\",\"asset1\"]}'"
|
||||
println
|
||||
println " NOTE: Default settings can be changed in network.config"
|
||||
println
|
||||
else
|
||||
println "Usage: "
|
||||
println " network.sh <Mode> [Flags]"
|
||||
println " Modes:"
|
||||
println " \033[0;32mprereq\033[0m - Install Fabric binaries and docker images"
|
||||
println " \033[0;32mup\033[0m - Bring up Fabric orderer and peer nodes. No channel is created"
|
||||
println " \033[0;32mup createChannel\033[0m - Bring up fabric network with one channel"
|
||||
println " \033[0;32mcreateChannel\033[0m - Create and join a channel after the network is created"
|
||||
println " \033[0;32mdeployCC\033[0m - Deploy a chaincode to a channel (defaults to asset-transfer-basic)"
|
||||
println " \033[0;32mcc\033[0m - chaincode functions, use \"network.sh cc -h\" for options"
|
||||
println " \033[0;32mdown\033[0m - Bring down the network"
|
||||
println
|
||||
println " Flags:"
|
||||
println " Used with \033[0;32mnetwork.sh prereq\033[0m"
|
||||
println " -i FabricVersion (default: '2.5.4')"
|
||||
println " -cai Fabric CA Version (default: '1.5.7')"
|
||||
println
|
||||
println " Used with \033[0;32mnetwork.sh up\033[0m, \033[0;32mnetwork.sh createChannel\033[0m:"
|
||||
println " -ca - Use Certificate Authorities to generate network crypto material"
|
||||
println " -cfssl <use CFSSL> - Use CFSSL CA to generate network crypto material"
|
||||
|
|
@ -120,12 +172,12 @@ function printHelp() {
|
|||
println " -d <delay> - CLI delays for a certain number of seconds (defaults to 3)"
|
||||
println " -verbose - Verbose mode"
|
||||
println
|
||||
println " Used with \033[0;32mnetwork.sh deployCC\033[0m"
|
||||
println " Used with \033[0;32mnetwork.sh deployCC\033[0m:"
|
||||
println " -c <channel name> - Name of channel to deploy chaincode to"
|
||||
println " -ccn <name> - Chaincode name."
|
||||
println " -ccl <language> - Programming language of the chaincode to deploy: go, java, javascript, typescript"
|
||||
println " -ccv <version> - Chaincode version. 1.0 (default), v2, version3.x, etc"
|
||||
println " -ccs <sequence> - Chaincode definition sequence. Must be an integer, 1 (default), 2, 3, etc"
|
||||
println " -ccs <sequence> - Chaincode definition sequence. Must be auto (default) or an integer, 1 , 2, 3, etc"
|
||||
println " -ccp <path> - File path to the chaincode."
|
||||
println " -ccep <policy> - (Optional) Chaincode endorsement policy using signature policy syntax. The default policy requires an endorsement from Org1 and Org2"
|
||||
println " -cccg <collection-config> - (Optional) File path to private data collections configuration file"
|
||||
|
|
@ -146,9 +198,36 @@ function printHelp() {
|
|||
println " network.sh createChannel -c channelName"
|
||||
println " network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-javascript/ -ccl javascript"
|
||||
println " network.sh deployCC -ccn mychaincode -ccp ./user/mychaincode -ccv 1 -ccl javascript"
|
||||
println
|
||||
println " NOTE: Default settings can be changed in network.config"
|
||||
fi
|
||||
}
|
||||
|
||||
function installPrereqs() {
|
||||
|
||||
infoln "installing prereqs"
|
||||
|
||||
FILE=../install-fabric.sh
|
||||
if [ ! -f $FILE ]; then
|
||||
curl -sSLO https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh && chmod +x install-fabric.sh
|
||||
cp install-fabric.sh ..
|
||||
fi
|
||||
|
||||
IMAGE_PARAMETER=""
|
||||
if [ "$IMAGETAG" != "default" ]; then
|
||||
IMAGE_PARAMETER="-f ${IMAGETAG}"
|
||||
fi
|
||||
|
||||
CA_IMAGE_PARAMETER=""
|
||||
if [ "$CA_IMAGETAG" != "default" ]; then
|
||||
CA_IMAGE_PARAMETER="-c ${CA_IMAGETAG}"
|
||||
fi
|
||||
|
||||
cd ..
|
||||
./install-fabric.sh ${IMAGE_PARAMETER} ${CA_IMAGE_PARAMETER} docker binary
|
||||
|
||||
}
|
||||
|
||||
# println echos string
|
||||
function println() {
|
||||
echo -e "$1"
|
||||
|
|
|
|||
Loading…
Reference in a new issue