CHANNEL_NAME="$1" CC_RUNTIME_LANGUAGE="$2" VERSION="$3" DELAY="$4" MAX_RETRY="$5" VERBOSE="$6" : ${CHANNEL_NAME:="mychannel"} : ${CC_RUNTIME_LANGUAGE:="golang"} : ${VERSION:="1"} : ${DELAY:="3"} : ${MAX_RETRY:="5"} : ${VERBOSE:="false"} CC_RUNTIME_LANGUAGE=`echo "$CC_RUNTIME_LANGUAGE" | tr [:upper:] [:lower:]` COUNTER=1 FABRIC_CFG_PATH=$PWD/../config/ if [ "$CC_RUNTIME_LANGUAGE" = "go" -o "$CC_RUNTIME_LANGUAGE" = "golang" ]; then CC_RUNTIME_LANGUAGE=golang CC_SRC_PATH="../chaincode/fabcar/go/" elif [ "$CC_RUNTIME_LANGUAGE" = "javascript" ]; then CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js CC_SRC_PATH="../chaincode/fabcar/javascript/" elif [ "$CC_RUNTIME_LANGUAGE" = "java" ]; then CC_RUNTIME_LANGUAGE=java CC_SRC_PATH="../chaincode/fabcar/java/" else echo The chaincode language ${CC_RUNTIME_LANGUAGE} is not supported by this script echo Supported chaincode languages are: go, javascript, java exit 1 fi # import utils . scripts/envVar.sh packageChaincode() { ORG=$1 setGlobals $ORG set -x peer lifecycle chaincode package fabcar.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label fabcar_${VERSION} >&log.txt res=$? set +x cat log.txt verifyResult $res "Chaincode packaging on peer0.org${ORG} has failed" echo "===================== Chaincode is packaged on peer0.org${ORG} ===================== " echo } # installChaincode PEER ORG installChaincode() { ORG=$1 setGlobals $ORG set -x peer lifecycle chaincode install fabcar.tar.gz >&log.txt res=$? set +x cat log.txt verifyResult $res "Chaincode installation on peer0.org${ORG} has failed" echo "===================== Chaincode is installed on peer0.org${ORG} ===================== " echo } # queryInstalled PEER ORG queryInstalled() { ORG=$1 setGlobals $ORG set -x peer lifecycle chaincode queryinstalled >&log.txt res=$? set +x cat log.txt PACKAGE_ID=$(sed -n "/fabcar_${VERSION}/{s/^Package ID: //; s/, Label:.*$//; p;}" log.txt) verifyResult $res "Query installed on peer0.org${ORG} has failed" echo PackageID is ${PACKAGE_ID} echo "===================== Query installed successful on peer0.org${ORG} on channel ===================== " echo } # approveForMyOrg VERSION PEER ORG approveForMyOrg() { ORG=$1 setGlobals $ORG if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then set -x peer lifecycle chaincode approveformyorg -o localhost:7050 --channelID $CHANNEL_NAME --name fabcar --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence ${VERSION} --waitForEvent >&log.txt set +x else set -x peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name fabcar --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence ${VERSION} >&log.txt set +x fi cat log.txt verifyResult $res "Chaincode definition approved on peer0.org${ORG} on channel '$CHANNEL_NAME' failed" echo "===================== Chaincode definition approved on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " echo } # commitChaincodeDefinition VERSION PEER ORG (PEER ORG)... commitChaincodeDefinition() { 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 localhost:7050 --channelID $CHANNEL_NAME --name fabcar $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --init-required >&log.txt res=$? set +x else set -x peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name fabcar $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 peer0.org${ORG} on channel '$CHANNEL_NAME' failed" echo "===================== Chaincode definition committed on channel '$CHANNEL_NAME' ===================== " echo } # checkCommitReadiness VERSION PEER ORG checkCommitReadiness() { ORG=$1 shift 1 setGlobals $ORG echo "===================== Checking the commit readiness of the chaincode definition on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " local rc=1 # continue to poll # we either get a successful response, or reach MAX RETRY if [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; then COUNTER=$(expr $COUNTER + 1) sleep $DELAY echo "Attempting to check the commit readiness of the chaincode definition on peer0.org${ORG} secs" set -x peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name fabcar $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --output json --init-required >&log.txt res=$? set +x test $res -eq 0 || let rc=1 else COUNTER=1 fi for var in "$@" do grep "$var" log.txt &>/dev/null || let rc=1 done echo cat log.txt if test $rc -eq 1; then echo "===================== Checking the commit readiness of the chaincode definition successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " else echo "!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Check commit readiness result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!" echo "================== ERROR !!! FAILED to execute End-2-End Scenario ==================" echo exit 1 fi } # queryCommitted ORG queryCommitted() { ORG=$1 setGlobals $ORG EXPECTED_RESULT="Version: ${VERSION}, Sequence: ${VERSION}, Endorsement Plugin: escc, Validation Plugin: vscc" echo "===================== Querying chaincode definition on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " local rc=1 # continue to poll # we either get a successful response, or reach MAX RETRY if [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; then COUNTER=$(expr $COUNTER + 1) sleep $DELAY echo "Attempting to Query committed status on peer0.org${ORG}, Retry after $DELAY seconds." set -x peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name fabcar >&log.txt res=$? set +x test $res -eq 0 || let rc=1 else COUNTER=1 fi echo cat log.txt if test $rc -eq 1; then echo "===================== Query chaincode definition successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " else echo "!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Query chaincode definition result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!" echo "================== ERROR !!! FAILED to execute End-2-End Scenario ==================" echo exit 1 fi } chaincodeInvokeInit() { 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 chaincode invoke -o localhost:7050 -C $CHANNEL_NAME -n fabcar $PEER_CONN_PARMS --isInit -c '{"function":"init","Args":[]}' >&log.txt res=$? set +x else set -x peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n fabcar $PEER_CONN_PARMS --isInit -c '{"function":"initLedger","Args":[]}' >&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 } chaincodeInvoke() { parsePeerConnectionParameters $@ res=$? verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters " # while 'peer chaincode' command can get the orderer endpoint from the # peer (if join was successful), let's supply it directly as we know # it using the "-o" option if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then set -x peer chaincode invoke -o localhost:7050 -C $CHANNEL_NAME -n fabcar $PEER_CONN_PARMS -c '{"function":"initLedger","Args":[]}' >&log.txt res=$? set +x else set -x peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n fabcar $PEER_CONN_PARMS -c '{"function":"initLedger","Args":[]}' >&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 } chaincodeQuery() { ORG=$1 setGlobals $ORG echo "===================== Querying on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " local rc=1 # continue to poll # we either get a successful response, or reach MAX RETRY if [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; then COUNTER=$(expr $COUNTER + 1) sleep $DELAY echo "Attempting to Query peer0.org${ORG} ...$(($(date +%s) - starttime)) secs" set -x peer chaincode query -C $CHANNEL_NAME -n fabcar -c '{"Args":["queryAllCars"]}' >&log.txt res=$? set +x test $res -eq 0 || let rc=1 else COUNTER=1 fi echo cat log.txt if test $rc -eq 1; then echo "===================== Query successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " else echo "!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Query result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!" echo "================== ERROR !!! FAILED to execute End-2-End Scenario ==================" echo exit 1 fi } ## at first we package the chaincode packageChaincode 1 ## Install chaincode on peer0.org1 and peer0.org2 echo "Installing chaincode on peer0.org1..." installChaincode 1 echo "Install chaincode on peer0.org2..." installChaincode 2 ## query whether the chaincode is installed queryInstalled 1 ## approve the definition for org1 approveForMyOrg 1 ## check whether the chaincode definition is ready to be committed ## expect org1 to have approved and org2 not to checkCommitReadiness 1 "\"Org1MSP\": true" "\"Org2MSP\": false" checkCommitReadiness 2 "\"Org1MSP\": true" "\"Org2MSP\": false" ## now approve also for org2 approveForMyOrg 2 ## check whether the chaincode definition is ready to be committed ## expect them both to have approved checkCommitReadiness 1 "\"Org1MSP\": true" "\"Org2MSP\": true" checkCommitReadiness 2 "\"Org1MSP\": true" "\"Org2MSP\": true" ## now that we know for sure both orgs have approved, commit the definition commitChaincodeDefinition 1 2 ## query on both orgs to see that the definition committed successfully queryCommitted 1 queryCommitted 2 ## Invoke the chaincode chaincodeInvokeInit 1 2 sleep 10 ## Invoke the chaincode chaincodeInvoke 1 2 # Query chaincode on peer0.org1 echo "Querying chaincode on peer0.org1..." chaincodeQuery 1 exit 0