diff --git a/first-network/configtx.yaml b/first-network/configtx.yaml index a366fea253..c0f0856824 100644 --- a/first-network/configtx.yaml +++ b/first-network/configtx.yaml @@ -157,9 +157,13 @@ Capabilities: # used with prior release orderers. # Set the value of the capability to true to require it. Application: &ApplicationCapabilities + # V2.0 for Application enables the new non-backwards compatible + # features and fixes of fabric v2.0. + V2_0: true # V1.3 for Application enables the new non-backwards compatible - # features and fixes of fabric v1.3. - V1_3: true + # features and fixes of fabric v1.3 (note, this need not be set if + # later version capabilities are set) + V1_3: false # V1.2 for Application enables the new non-backwards compatible # features and fixes of fabric v1.2 (note, this need not be set if # later version capabilities are set) diff --git a/first-network/eyfn.sh b/first-network/eyfn.sh index ad2c376932..490ece5ffc 100755 --- a/first-network/eyfn.sh +++ b/first-network/eyfn.sh @@ -117,15 +117,6 @@ function networkUp () { echo "ERROR !!!! Unable to have Org3 peers join network" exit 1 fi - echo - echo "###############################################################" - echo "##### Upgrade chaincode to have Org3 peers on the network #####" - echo "###############################################################" - docker exec cli ./scripts/step3org3.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE - if [ $? -ne 0 ]; then - echo "ERROR !!!! Unable to add Org3 peers on network" - exit 1 - fi # finish by running the test docker exec Org3cli ./scripts/testorg3.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE if [ $? -ne 0 ]; then diff --git a/first-network/scripts/script.sh b/first-network/scripts/script.sh index 53259e3cdf..7f9aa81cce 100755 --- a/first-network/scripts/script.sh +++ b/first-network/scripts/script.sh @@ -22,6 +22,7 @@ VERBOSE="$5" LANGUAGE=`echo "$LANGUAGE" | tr [:upper:] [:lower:]` COUNTER=1 MAX_RETRY=10 +PACKAGE_ID="" if [ "$LANGUAGE" = "node" ]; then CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/node/" @@ -81,15 +82,31 @@ updateAnchorPeers 0 1 echo "Updating anchor peers for org2..." updateAnchorPeers 0 2 +## 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 -# Instantiate chaincode on peer0.org2 -echo "Instantiating chaincode on peer0.org2..." -instantiateChaincode 0 2 +## query whether the chaincode is installed +queryInstalled 0 1 + +## approve the definition for both orgs +approveForMyOrg 1 0 1 +approveForMyOrg 1 0 2 + +## commit the definition +commitChaincodeDefinition 1 0 1 0 2 + +## query on both orgs to see that the definition committed ok +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..." @@ -97,7 +114,11 @@ chaincodeQuery 0 1 100 # Invoke chaincode on peer0.org1 and peer0.org2 echo "Sending invoke transaction on peer0.org1 peer0.org2..." -chaincodeInvoke 0 1 0 2 +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..." diff --git a/first-network/scripts/step2org3.sh b/first-network/scripts/step2org3.sh index c0a8d8d160..60203292c3 100755 --- a/first-network/scripts/step2org3.sh +++ b/first-network/scripts/step2org3.sh @@ -27,6 +27,7 @@ VERBOSE="$5" LANGUAGE=`echo "$LANGUAGE" | tr [:upper:] [:lower:]` COUNTER=1 MAX_RETRY=5 +PACKAGE_ID="" if [ "$LANGUAGE" = "node" ]; then CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/node/" @@ -51,11 +52,28 @@ joinChannelWithRetry 0 3 echo "===================== peer0.org3 joined channel '$CHANNEL_NAME' ===================== " joinChannelWithRetry 1 3 echo "===================== peer1.org3 joined channel '$CHANNEL_NAME' ===================== " -echo "Installing chaincode 2.0 on peer0.org3..." -installChaincode 0 3 2.0 + +## 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 "========= Org3 is now halfway onto your first network ========= " +echo "========= Finished adding Org3 to your first network! ========= " echo exit 0 diff --git a/first-network/scripts/step3org3.sh b/first-network/scripts/step3org3.sh deleted file mode 100755 index 381af51a5f..0000000000 --- a/first-network/scripts/step3org3.sh +++ /dev/null @@ -1,55 +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 cli container as the third -# step of the EYFN tutorial. It installs the chaincode as version 2.0 -# on peer0.org1 and peer0.org2, and uprage the chaincode on the -# channel to version 2.0, thus completing the addition of org3 to the -# network previously setup in the BYFN tutorial. -# - -echo -echo "========= Finish adding Org3 to your first network ========= " -echo -CHANNEL_NAME="$1" -DELAY="$2" -LANGUAGE="$3" -TIMEOUT="$4" -VERBOSE="$5" -: ${CHANNEL_NAME:="mychannel"} -: ${DELAY:="3"} -: ${LANGUAGE:="golang"} -: ${TIMEOUT:="10"} -: ${VERBOSE:="false"} -LANGUAGE=`echo "$LANGUAGE" | tr [:upper:] [:lower:]` -COUNTER=1 -MAX_RETRY=5 - -if [ "$LANGUAGE" = "node" ]; then - CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/node/" -elif [ "$LANGUAGE" = "java" ]; then - CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/" -else - CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/" -fi - -# import utils -. scripts/utils.sh - -echo "===================== Installing chaincode 2.0 on peer0.org1 ===================== " -installChaincode 0 1 2.0 -echo "===================== Installing chaincode 2.0 on peer0.org2 ===================== " -installChaincode 0 2 2.0 - -echo "===================== Upgrading chaincode on peer0.org1 ===================== " -upgradeChaincode 0 1 - -echo -echo "========= Finished adding Org3 to your first network! ========= " -echo - -exit 0 diff --git a/first-network/scripts/testorg3.sh b/first-network/scripts/testorg3.sh index dd87675801..693ad32fab 100755 --- a/first-network/scripts/testorg3.sh +++ b/first-network/scripts/testorg3.sh @@ -50,9 +50,9 @@ echo "Channel name : "$CHANNEL_NAME echo "Querying chaincode on peer0.org3..." chaincodeQuery 0 3 90 -# Invoke chaincode on peer0.org1, peer0.org2, and peer0.org3 -echo "Sending invoke transaction on peer0.org1 peer0.org2 peer0.org3..." -chaincodeInvoke 0 1 0 2 0 3 +# 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 diff --git a/first-network/scripts/utils.sh b/first-network/scripts/utils.sh index a6c533235a..c46ab96ed8 100755 --- a/first-network/scripts/utils.sh +++ b/first-network/scripts/utils.sh @@ -113,13 +113,29 @@ joinChannelWithRetry() { 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 ${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 - VERSION=${3:-1.0} set -x - peer chaincode install -n mycc -v ${VERSION} -l ${LANGUAGE} -p ${CC_SRC_PATH} >&log.txt + peer lifecycle chaincode install mycc.tar.gz >&log.txt res=$? set +x cat log.txt @@ -128,45 +144,108 @@ installChaincode() { echo } -instantiateChaincode() { +# queryInstalled PEER ORG +queryInstalled() { PEER=$1 ORG=$2 setGlobals $PEER $ORG - VERSION=${3:-1.0} + 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 - # 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 instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -l ${LANGUAGE} -v ${VERSION} -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" >&log.txt + peer lifecycle chaincode approveformyorg --channelID $CHANNEL_NAME --name mycc --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence 1 --waitForEvent >&log.txt + set +x + else + set -x + peer lifecycle chaincode approveformyorg --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name mycc --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence 1 --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 1 --init-required >&log.txt res=$? set +x else set -x - peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -l ${LANGUAGE} -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" >&log.txt + peer lifecycle chaincode commit -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name mycc $PEER_CONN_PARMS --version ${VERSION} --sequence 1 --init-required >&log.txt res=$? set +x fi cat log.txt - verifyResult $res "Chaincode instantiation on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' failed" - echo "===================== Chaincode is instantiated on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== " + 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 } -upgradeChaincode() { - PEER=$1 - ORG=$2 +# 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) - set -x - peer chaincode upgrade -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 2.0 -c '{"Args":["init","a","90","b","210"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer','Org3MSP.peer')" - res=$? - set +x - cat log.txt - verifyResult $res "Chaincode upgrade on peer${PEER}.org${ORG} has failed" - echo "===================== Chaincode is upgraded on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== " + # 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 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() { @@ -293,24 +372,34 @@ parsePeerConnectionParameters() { PEERS="$(echo -e "$PEERS" | sed -e 's/^[[:space:]]*//')" } -# chaincodeInvoke ... +# 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 -c '{"Args":["invoke","a","b","10"]}' >&log.txt + 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 $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc $PEER_CONN_PARMS -c '{"Args":["invoke","a","b","10"]}' >&log.txt + peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc $PEER_CONN_PARMS ${INIT_ARG} -c ${CCARGS} >&log.txt res=$? set +x fi