2019-11-19 14:40:38 +08:00
#!/usr/bin/env bash
echo_r ( ) {
[ $# -ne 1 ] && return 0
echo -e " \033[31m $1 \033[0m "
}
echo_g ( ) {
[ $# -ne 1 ] && return 0
echo -e " \033[32m $1 \033[0m "
}
echo_y ( ) {
[ $# -ne 1 ] && return 0
echo -e " \033[33m $1 \033[0m "
}
echo_b ( ) {
[ $# -ne 1 ] && return 0
echo -e " \033[34m $1 \033[0m "
}
# Define those global variables
if [ -f ./variables.sh ] ; then
source ./variables.sh
elif [ -f scripts/variables.sh ] ; then
source scripts/variables.sh
else
echo_r "Cannot find the variables.sh files, pls check"
exit 1
fi
# Verify $1 is not 0, then output error msg $2 and exit
verifyResult ( ) {
if [ $1 -ne 0 ] ; then
echo " $2 "
echo_r "=== ERROR !!! FAILED to execute End-2-End Scenario ==="
exit 1
fi
}
# set env to use orderOrg's identity
setOrdererEnvs ( ) {
export CORE_PEER_LOCALMSPID = "OrdererMSP"
export CORE_PEER_MSPCONFIGPATH = ${ ORDERER0_ADMIN_MSP }
export CORE_PEER_TLS_ROOTCERT_FILE = ${ ORDERER0_TLS_ROOTCERT }
#t="\${ORG${org}_PEER${peer}_URL}" && CORE_PEER_ADDRESS=`eval echo $t`
}
# Set global env variables for fabric cli, after setting:
# client is the admin as given org
# TLS root cert is configured to given peer's tls ca
# remote peer address is configured to given peer's
# CORE_PEER_LOCALMSPID=Org1MSP # local msp id to use
# CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp # local msp path to use
# CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt # local trusted tls ca cert
# CORE_PEER_ADDRESS=peer0.org1.example.com:7051 # remote peer to send proposal to
# Usage: setEnvs org peer
setEnvs ( ) {
local org = $1 # 1 or 2
local peer = $2 # 0 or 1
[ -z $org ] && [ -z $peer ] && echo_r "input param invalid" && exit -1
local t = ""
export CORE_PEER_LOCALMSPID = " Org ${ org } MSP "
#CORE_PEER_MSPCONFIGPATH=\$${ORG${org}_ADMIN_MSP}
t = " \${ORG ${ org } _PEER ${ peer } _URL} " && export CORE_PEER_ADDRESS = ` eval echo $t `
t = " \${ORG ${ org } _ADMIN_MSP} " && export CORE_PEER_MSPCONFIGPATH = ` eval echo $t `
t = " \${ORG ${ org } _PEER ${ peer } _TLS_ROOTCERT} " && export CORE_PEER_TLS_ROOTCERT_FILE = ` eval echo $t `
#env |grep CORE
}
# Internal func called by channelCreate
# channelCreateAction channel tx orderer_url orderer_tls_rootcert
channelCreateAction( ) {
local channel = $1
local channel_tx = $2
local orderer_url = $3
local orderer_tls_rootcert = $4
if [ -z " $CORE_PEER_TLS_ENABLED " ] || [ " $CORE_PEER_TLS_ENABLED " = "false" ] ; then
peer channel create \
-c ${ channel } \
-o ${ orderer_url } \
-f ${ CHANNEL_ARTIFACTS } /${ channel_tx } \
--timeout " ${ TIMEOUT } s "
else
peer channel create \
-c ${ channel } \
-o ${ orderer_url } \
-f ${ CHANNEL_ARTIFACTS } /${ channel_tx } \
--timeout " ${ TIMEOUT } s " \
--tls \
--cafile ${ orderer_tls_rootcert }
fi
return $?
}
# Use peer0/org1's identity to create a channel
# channelCreate APP_CHANNEL APP_CHANNEL.tx org peer orderer_url orderer_tls_rootcert
channelCreate( ) {
local channel = $1
local tx = $2
local org = $3
local peer = $4
local orderer_url = $5
local orderer_tls_rootcert = $6
[ -z $channel ] && [ -z $tx ] && [ -z $org ] && [ -z $peer ] && echo_r "input param invalid" && exit -1
echo " === Create Channel ${ channel } by org $org /peer $peer === "
setEnvs $org $peer
local rc = 1
local counter = 0
while [ ${ counter } -lt ${ MAX_RETRY } -a ${ rc } -ne 0 ] ; do
channelCreateAction ${ channel } ${ tx } ${ orderer_url } ${ orderer_tls_rootcert }
rc = $?
let counter = ${ counter } +1
#COUNTER=` expr $COUNTER + 1`
[ $rc -ne 0 ] && echo " Failed to create channel $channel , retry after 3s " && sleep 3
done
[ $rc -ne 0 ] && cat log.txt
verifyResult ${ rc } " Channel ${ channel } creation failed "
echo " === Channel ${ channel } is created. === "
}
# called by channelJoinWithRetry
channelJoinAction ( ) {
local channel = $1
peer channel join \
-b ${ channel } .block \
>& log.txt
}
## Sometimes Join takes time hence RETRY atleast for 5 times
channelJoinWithRetry ( ) {
local channel = $1
local peer = $2
local counter = 0
channelJoinAction ${ channel }
local rc = $?
while [ ${ counter } -lt ${ MAX_RETRY } -a ${ rc } -ne 0 ] ; do
echo " peer ${ peer } failed to join channel ${ channel } , retry after 2s "
sleep 2
channelJoinAction ${ channel }
rc = $?
let counter = ${ counter } +1
done
[ $rc -ne 0 ] && cat log.txt
verifyResult ${ rc } " After $MAX_RETRY attempts, peer ${ peer } failed to Join the Channel "
}
# Join given (by default all) peers into the channel
# channelJoin channel org peer
channelJoin ( ) {
local channel = $1
local org = $2
local peer = $3
[ -z $channel ] && [ -z $org ] && [ -z $peer ] && echo_r "input param invalid" && exit -1
echo " === Join org $org /peer $peer into channel ${ channel } === "
setEnvs $org $peer
channelJoinWithRetry ${ channel } $peer
echo " === org $org /peer $peer joined into channel ${ channel } === "
}
getShasum ( ) {
[ ! $# -eq 1 ] && exit 1
shasum ${ 1 } | awk '{print $1}'
}
# List the channel that the peer joined
# E.g., for peer 0 at org 1, will do
# channelList 1 0
channelList ( ) {
local org = $1
local peer = $2
echo " === List the channels that org ${ org } /peer ${ peer } joined === "
setEnvs $org $peer
peer channel list >& log.txt
rc = $?
[ $rc -ne 0 ] && cat log.txt
if [ $rc -ne 0 ] ; then
echo " === Failed to list the channels that org ${ org } /peer ${ peer } joined === "
else
echo " === Done to list the channels that org ${ org } /peer ${ peer } joined === "
fi
}
# Get the info of specific channel, including {height, currentBlockHash, previousBlockHash}.
# E.g., for peer 0 at org 1, get info of business channel will do
# channelGetInfo businesschannel 1 0
channelGetInfo ( ) {
local channel = $1
local org = $2
local peer = $3
echo " === Get channel info (height, currentBlockHash, previousBlockHash) of ${ channel } with id of org ${ org } /peer ${ peer } === "
setEnvs $org $peer
peer channel getinfo -c ${ channel } >& log.txt
rc = $?
cat log.txt
if [ $rc -ne 0 ] ; then
echo " === Fail to get channel info of ${ channel } with id of org ${ org } /peer ${ peer } === "
else
echo " === Done to get channel info of ${ channel } with id of org ${ org } /peer ${ peer } === "
fi
}
# Fetch all blocks for a channel
# Usage: channelFetchAll channel org peer orderer_url orderer_tls_rootcert
channelFetchAll ( ) {
local channel = $1
local org = $2
local peer = $3
local orderer_url = $4
local orderer_tls_rootcert = $5
echo " === Fetch all block for channel $channel === "
local block_file = /tmp/${ channel } _newest.block
channelFetch ${ channel } $org $peer ${ orderer_url } ${ orderer_tls_rootcert } "newest" ${ block_file }
[ $? -ne 0 ] && exit 1
newest_block_shasum = $( getShasum ${ block_file } )
echo " fetch newest block ${ block_file } with shasum= ${ newest_block_shasum } "
block_file = ${ CHANNEL_ARTIFACTS } /${ channel } _config.block
channelFetch ${ channel } $org $peer ${ orderer_url } ${ orderer_tls_rootcert } "config" ${ block_file }
[ $? -ne 0 ] && exit 1
echo " fetch config block ${ block_file } "
for i in $( seq 0 16) ; do # we at most fetch 16 blocks
block_file = ${ CHANNEL_ARTIFACTS } /${ channel } _${ i } .block
channelFetch ${ channel } $org $peer ${ orderer_url } ${ orderer_tls_rootcert } $i ${ block_file }
[ $? -ne 0 ] && exit 1
[ -f $block_file ] || break
echo " fetch block $i and saved into ${ block_file } "
block_shasum = $( getShasum ${ block_file } )
[ ${ block_shasum } = ${ newest_block_shasum } ] && { echo " Block $i is the last one for channel $channel " ; break; }
done
}
# Fetch some block from a given channel
# channelFetch channel org peer orderer_url blockNum block_file
channelFetch ( ) {
local channel = $1
local org = $2
local peer = $3
local orderer_url = $4
local orderer_tls_rootcert = $5
local num = $6
local block_file = $7
echo " === Fetch block $num of channel $channel === "
#setEnvs $org $peer
setOrdererEnvs # system channel required id from ordererOrg
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
# lets supply it directly as we know it using the "-o" option
if [ -z " ${ CORE_PEER_TLS_ENABLED } " ] || [ " ${ CORE_PEER_TLS_ENABLED } " = "false" ] ; then
peer channel fetch $num ${ block_file } \
-o ${ orderer_url } \
-c ${ channel } \
>& log.txt
else
peer channel fetch $num ${ block_file } \
-o ${ orderer_url } \
-c ${ channel } \
--tls \
--cafile ${ orderer_tls_rootcert } \
>& log.txt
fi
if [ $? -ne 0 ] ; then
cat log.txt
echo_r " Fetch block $num of channel $channel failed "
return 1
else
echo " === Fetch block $num of channel $channel OK === "
return 0
fi
}
# Sign a channel config tx
# Usage: channelSignConfigTx channel org peer transaction
channelSignConfigTx ( ) {
local channel = $1
local org = $2
local peer = $3
local tx = $4
[ -z $channel ] && [ -z $tx ] && [ -z $org ] && [ -z $peer ] && echo_r "input param invalid" && exit -1
echo " === Sign channel config tx $tx for channel $channel by org $org /peer $peer === "
[ -f ${ CHANNEL_ARTIFACTS } /${ tx } ] || { echo_r " ${ tx } not exist " ; exit 1; }
setEnvs $org $peer
peer channel signconfigtx -f ${ CHANNEL_ARTIFACTS } /${ tx } >& log.txt
rc = $?
[ $rc -ne 0 ] && cat log.txt
if [ $rc -ne 0 ] ; then
echo_r " Sign channel config tx for channel $channel by org $org /peer $peer failed "
else
echo " === Sign channel config tx channel $channel by org $org /peer $peer is successful === "
fi
}
# Update a channel config
# Usage: channelUpdate channel org peer orderer_url orderer_tls_rootcert transaction_file
channelUpdate( ) {
local channel = $1
local org = $2
local peer = $3
local orderer_url = $4
local orderer_tls_rootcert = $5
local tx = $6
[ -z $channel ] && [ -z $tx ] && [ -z $org ] && [ -z $peer ] && echo_r "input param invalid" && exit -1
setEnvs $org $peer
echo " === Update config on channel ${ channel } === "
[ -f ${ CHANNEL_ARTIFACTS } /${ tx } ] || { echo_r " ${ tx } not exist " ; exit 1; }
if [ -z " $CORE_PEER_TLS_ENABLED " -o " $CORE_PEER_TLS_ENABLED " = "false" ] ; then
peer channel update \
-c ${ channel } \
-o ${ orderer_url } \
-f ${ CHANNEL_ARTIFACTS } /${ tx } \
>& log.txt
else
peer channel update \
-c ${ channel } \
-o ${ orderer_url } \
-f ${ CHANNEL_ARTIFACTS } /${ tx } \
--tls \
--cafile ${ orderer_tls_rootcert } \
>& log.txt
fi
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc "peer channel update failed"
echo " === Channel ${ channel } is updated. === "
sleep 2
}
# Install chaincode on the peer node
# In v2.x it will package, install and approve
# chaincodeInstall peer cc_name version path [lang]
chaincodeInstall ( ) {
if [ " $# " -lt 7 ] ; then
echo_r "Wrong param number for chaincode install"
exit -1
fi
local org = $1
local peer = $2
local peer_url = $3
local peer_tls_root_cert = $4
local name = $5
local version = $6
local path = $7
local lang = "golang"
if [ " $# " -eq 8 ] ; then
local lang = $8
fi
[ -z $org ] && [ -z $peer ] && [ -z $name ] && [ -z $version ] && [ -z $path ] && echo_r "input param invalid" && exit -1
echo " === Install Chaincode on org ${ org } /peer ${ peer } === "
echo " name= ${ name } , version= ${ version } , path= ${ path } "
setEnvs $org $peer
peer chaincode install \
-n ${ name } \
-v $version \
-p ${ path } \
-l ${ lang } \
>& log.txt
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " Chaincode installation on remote org ${ org } /peer $peer has Failed "
echo " === Chaincode is installed on org ${ org } /peer $peer === "
}
# Approve the chaincode definition
# chaincodeApprove channel org peer peer_url peer_tls_root_cert orderer_url orderer_tls_rootcert channel name version
chaincodeApprove ( ) {
if [ " $# " -ne 9 -a " $# " -ne 11 ] ; then
echo_r "Wrong param number for chaincode approve"
exit -1
fi
local org = $1
local peer = $2
local peer_url = $3
local peer_tls_root_cert = $4
local orderer_url = $5
local orderer_tls_rootcert = $6
local channel = $7
local name = $8
local version = $9
local collection_config = "" # collection config file path for sideDB
local policy = "OR ('Org1MSP.member','Org2MSP.member')" # endorsement policy
if [ ! -z " ${ 10 } " ] ; then
collection_config = ${ 10 }
fi
if [ ! -z " ${ 11 } " ] ; then
policy = ${ 12 }
fi
setEnvs $org $peer
echo "querying installed chaincode and get its package id"
peer lifecycle chaincode queryinstalled >& query.log
cat query.log
local label = ${ name }
#package_id=$(grep -o "${name}_${version}:[a-z0-9]*" query.log|cut -d ":" -f 2)
package_id = $( grep -o " ${ label } :[a-z0-9]* " query.log)
echo " Approve package id= ${ package_id } by Org ${ org } /Peer ${ peer } "
# use the --init-required flag to request the ``Init`` function be invoked to initialize the chaincode
if [ -z " $CORE_PEER_TLS_ENABLED " -o " $CORE_PEER_TLS_ENABLED " = "false" ] ; then
peer lifecycle chaincode approveformyorg \
--peerAddresses ${ peer_url } \
--channelID ${ channel } \
--name ${ name } \
--version ${ version } \
--init-required \
--package-id ${ package_id } \
--sequence 1 \
--signature-policy " ${ policy } " \
--waitForEvent \
--orderer ${ orderer_url } >& log.txt
else
peer lifecycle chaincode approveformyorg \
--peerAddresses ${ peer_url } \
--tlsRootCertFiles ${ peer_tls_root_cert } \
--channelID ${ channel } \
--name ${ name } \
--version ${ version } \
--init-required \
--package-id ${ package_id } \
--sequence 1 \
--signature-policy " ${ policy } " \
--waitForEvent \
--orderer ${ orderer_url } \
--tls true \
--cafile ${ orderer_tls_rootcert } >& log.txt
fi
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " Chaincode Approval on remote org ${ org } /peer $peer has Failed "
echo " === Chaincode is approved on remote peer $peer === "
}
# Query the Approve the chaincode definition
# chaincodeQueryApprove channel org peer name version
chaincodeQueryApprove ( ) {
if [ " $# " -ne 7 ] ; then
echo_r "Wrong param number for chaincode queryapproval"
exit -1
fi
local org = $1
local peer = $2
local peer_url = $3
local peer_tls_root_cert = $4
local channel = $5
local name = $6
local version = $7
setEnvs $org $peer
echo " Query the approval status of the chaincode $name $version "
peer lifecycle chaincode queryapprovalstatus \
--peerAddresses ${ peer_url } \
--tlsRootCertFiles ${ peer_tls_root_cert } \
--channelID ${ channel } \
--name ${ name } \
--version ${ version }
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " ChaincodeQueryApproval Failed: org ${ org } /peer $peer "
}
# Anyone can commit the chaincode definition once it's approved by major
# chaincodeCommit org peer channel orderer_url orderer_tls_rootcert name version [collection-config] [endorse-policy]
chaincodeCommit ( ) {
if [ " $# " -ne 7 -a " $# " -ne 9 ] ; then
echo_r "Wrong param number for chaincode commit"
exit -1
fi
local org = $1
local peer = $2
local channel = $3
local orderer_url = $4
local orderer_tls_rootcert = $5
local name = $6
local version = $7
local collection_config = "" # collection config file path for sideDB
local policy = "OR ('Org1MSP.member','Org2MSP.member')" # endorsement policy
if [ ! -z " $8 " ] ; then
collection_config = $8
fi
if [ ! -z " $9 " ] ; then
policy = $9 # chaincode endorsement policy
fi
setEnvs $org $peer
echo "querying installed chaincode and get its package id"
peer lifecycle chaincode queryinstalled >& query.log
label = ${ name }
#package_id=$(grep -o "${name}_${version}:[a-z0-9]*" query.log|cut -d ":" -f 2)
package_id = $( grep -o " ${ label } :[a-z0-9]* " query.log)
echo " Committing package id= ${ package_id } by Org ${ org } /Peer ${ peer } "
# use the --init-required flag to request the ``Init`` function be invoked to initialize the chaincode
if [ -z " $CORE_PEER_TLS_ENABLED " -o " $CORE_PEER_TLS_ENABLED " = "false" ] ; then
peer lifecycle chaincode commit \
-o ${ orderer_url } \
--channelID ${ channel } \
--name ${ name } \
--version ${ version } \
--init-required \
--sequence 1 \
--peerAddresses ${ ORG1_PEER0_URL } \
--tlsRootCertFiles ${ ORG1_PEER0_TLS_ROOTCERT } \
--peerAddresses ${ ORG2_PEER0_URL } \
--tlsRootCertFiles ${ ORG2_PEER0_TLS_ROOTCERT } \
--waitForEvent \
--collections-config " ${ collection_config } " \
--signature-policy " ${ policy } "
else
peer lifecycle chaincode commit \
-o ${ orderer_url } \
--channelID ${ channel } \
--name ${ name } \
--version ${ version } \
--init-required \
--sequence 1 \
--peerAddresses ${ ORG1_PEER0_URL } \
--tlsRootCertFiles ${ ORG1_PEER0_TLS_ROOTCERT } \
--peerAddresses ${ ORG2_PEER0_URL } \
--tlsRootCertFiles ${ ORG2_PEER0_TLS_ROOTCERT } \
--waitForEvent \
--collections-config " ${ collection_config } " \
--signature-policy " ${ policy } " \
--tls true \
--cafile ${ orderer_tls_rootcert } >& log.txt
fi
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " Chaincode Commit on remote org ${ org } /peer $peer has Failed "
echo " === Chaincode is committed on channel $channel === "
}
# Query the Commit the chaincode definition
2019-12-28 09:43:08 +08:00
# chaincodeQueryCommitted org peer peer_url peer_tls_root_cert channel cc_name
chaincodeQueryCommitted ( ) {
2019-11-19 14:40:38 +08:00
if [ " $# " -ne 6 ] ; then
echo_r "Wrong param number for chaincode querycommit"
exit -1
fi
local org = $1
local peer = $2
local peer_url = $3
local peer_tls_root_cert = $4
local channel = $5
local name = $6
setEnvs $org $peer
echo " Query the committed status of chaincode $name with ${ ORG1_PEER0_URL } "
peer lifecycle chaincode querycommitted \
--peerAddresses ${ peer_url } \
--tlsRootCertFiles ${ peer_tls_root_cert } \
--channelID ${ channel } \
--name ${ name }
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " ChaincodeQueryCommit Failed: org ${ org } /peer $peer "
}
# Instantiate chaincode on specifized peer node
# chaincodeInstantiate channel org peer orderer_url name version args
chaincodeInstantiate ( ) {
if [ " $# " -gt 9 -a " $# " -lt 7 ] ; then
echo_r "Wrong param number for chaincode instantaite"
exit -1
fi
local channel = $1
local org = $2
local peer = $3
local orderer_url = $4
local name = $5
local version = $6
local args = $7
local collection_config = "" # collection config file path for sideDB
local policy = "OR ('Org1MSP.member','Org2MSP.member')" # endorsement policy
if [ ! -z " $8 " ] ; then
collection_config = $8
fi
if [ ! -z " $9 " ] ; then
policy = $9
fi
setEnvs $org $peer
echo " === chaincodeInstantiate for channel ${ channel } on org $org /peer $peer ==== "
echo " name= ${ name } , version= ${ version } , args= ${ args } , collection_config= ${ collection_config } , policy= ${ policy } "
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
# lets supply it directly as we know it using the "-o" option
if [ -z " $CORE_PEER_TLS_ENABLED " -o " $CORE_PEER_TLS_ENABLED " = "false" ] ; then
peer chaincode instantiate \
-o ${ orderer_url } \
-C ${ channel } \
-n ${ name } \
-v ${ version } \
-c ${ args } \
-P " ${ policy } " \
--collections-config " ${ collection_config } " \
>& log.txt
else
peer chaincode instantiate \
-o ${ orderer_url } \
-C ${ channel } \
-n ${ name } \
-v ${ version } \
-c ${ args } \
-P " ${ policy } " \
--collections-config " ${ collection_config } " \
--tls \
--cafile ${ ORDERER0_TLS_CA } \
>& log.txt
fi
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " ChaincodeInstantiation on org $org /peer $peer in channel ${ channel } failed "
echo " === Chaincode Instantiated in channel ${ channel } by peer $peer === "
}
# Invoke the Init func of chaincode to start the container
# Usage: chaincodeInit org peer channel orderer name args peer_url peer_org_tlsca
chaincodeInit ( ) {
if [ " $# " -ne 8 ] ; then
echo_r "Wrong param number for chaincode Init"
exit -1
fi
local org = $1
local peer = $2
local channel = $3
local orderer = $4
local name = $5
local args = $6
local peer_url = $7
local peer_org_tlsca = $8
[ -z $channel ] && [ -z $org ] && [ -z $peer ] && [ -z $name ] && [ -z $args ] && echo_r "input param invalid" && exit -1
echo " === chaincodeInit to orderer by id of org ${ org } /peer ${ peer } === "
echo " channel= ${ channel } , name= ${ name } , args= ${ args } "
setEnvs $org $peer
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
# lets supply it directly as we know it using the "-o" option
if [ -z " $CORE_PEER_TLS_ENABLED " -o " $CORE_PEER_TLS_ENABLED " = "false" ] ; then
peer chaincode invoke \
-o ${ orderer } \
--channelID ${ channel } \
--name ${ name } \
--peerAddresses ${ peer_url } \
--tlsRootCertFiles ${ peer_org_tlsca } \
--isInit \
-c ${ args } \
>& log.txt
else
peer chaincode invoke \
-o ${ orderer } \
--channelID ${ channel } \
--name ${ name } \
--peerAddresses ${ peer_url } \
--tlsRootCertFiles ${ peer_org_tlsca } \
--isInit \
-c ${ args } \
--tls \
--cafile ${ ORDERER0_TLS_CA } \
>& log.txt
fi
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " Chaincode Init failed: peer $peer in channel ${ channel } "
echo " === Chaincode Init done: peer $peer in channel ${ channel } === "
}
# Usage: chaincodeInvoke org peer channel orderer name args peer_url peer_org_tlsca
chaincodeInvoke ( ) {
if [ " $# " -ne 9 ] ; then
echo_r "Wrong param number for chaincode Invoke"
exit -1
fi
local org = $1
local peer = $2
local peer_url = $3
local peer_org_tlsca = $4
local channel = $5
local orderer_url = $6
local orderer_tls_rootcert = $7
local name = $8
local args = $9
[ -z $channel ] && [ -z $org ] && [ -z $peer ] && [ -z $name ] && [ -z $args ] && echo_r "input param invalid" && exit -1
echo " === chaincodeInvoke to orderer by id of org ${ org } /peer ${ peer } === "
echo " channel= ${ channel } , name= ${ name } , args= ${ args } "
setEnvs $org $peer
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
# lets supply it directly as we know it using the "-o" option
if [ -z " $CORE_PEER_TLS_ENABLED " -o " $CORE_PEER_TLS_ENABLED " = "false" ] ; then
peer chaincode invoke \
-o ${ orderer_url } \
--channelID ${ channel } \
--name ${ name } \
--peerAddresses ${ peer_url } \
--tlsRootCertFiles ${ peer_org_tlsca } \
-c ${ args } \
>& log.txt
else
peer chaincode invoke \
-o ${ orderer_url } \
--channelID ${ channel } \
--name ${ name } \
--peerAddresses ${ peer_url } \
--tlsRootCertFiles ${ peer_org_tlsca } \
-c ${ args } \
--tls \
--cafile ${ orderer_tls_rootcert } \
>& log.txt
fi
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " Invoke execution on peer $peer failed "
echo " === Invoke transaction on peer $peer in channel ${ channel } is successful === "
}
# query org peer channel name args expected_result
chaincodeQuery ( ) {
if [ " $# " -ne 7 -a " $# " -ne 8 ] ; then
echo_r " Wrong param number $# for chaincode Query "
echo $*
exit -1
fi
local org = $1
local peer = $2
local peer_url = $3
local peer_org_tlsca = $4
local channel = $5
local name = $6
local args = $7
local expected_result = ""
[ $# -eq 8 ] && local expected_result = $8
[ -z $channel ] && [ -z $org ] && [ -z $peer ] && [ -z $name ] && [ -z $args ] && echo_r "input param invalid" && exit -1
echo " === chaincodeQuery to org $org /peer $peer === "
echo " channel= ${ channel } , name= ${ name } , args= ${ args } , expected_result= ${ expected_result } "
local rc = 1
local starttime = $( date +%s)
setEnvs $org $peer
# we either get a successful response, or reach TIMEOUT
while [ " $(( $( date +%s) - starttime)) " -lt " $TIMEOUT " -a $rc -ne 0 ] ; do
echo " Attempting to Query org ${ org } /peer ${ peer } ... $(( $( date +%s) - starttime)) secs "
peer chaincode query \
-C " ${ channel } " \
-n " ${ name } " \
--peerAddresses ${ peer_url } \
--tlsRootCertFiles ${ peer_org_tlsca } \
-c " ${ args } " \
>& log.txt
rc = $?
if [ -n " ${ expected_result } " ] ; then # need to check the result
test $? -eq 0 && VALUE = $( cat log.txt | awk 'END {print $NF}' )
if [ " $VALUE " = " ${ expected_result } " ] ; then
let rc = 0
echo_b " $VALUE == ${ expected_result } , passed "
else
let rc = 1
echo_b " $VALUE != ${ expected_result } , will retry "
fi
fi
if [ $rc -ne 0 ] ; then
cat log.txt
sleep 2
fi
done
# rc==0, or timeout
if [ $rc -eq 0 ] ; then
echo " === Query is done: org $org /peer $peer in channel ${ channel } === "
else
echo_r " === Query failed: org $org /peer $peer , run `make stop clean` to clean === "
exit 1
fi
}
# List Installed chaincode on specified peer node, and instantiated chaincodes at specific channel
# chaincodeList org1 peer0 businesschannel
chaincodeList ( ) {
local org = $1
local peer = $2
local channel = $3
[ -z $org ] && [ -z $peer ] && [ -z $channel ] && echo_r "input param invalid" && exit -1
echo " === ChaincodeList on org ${ org } /peer ${ peer } === "
setEnvs $org $peer
echo_b " Get installed chaincodes at peer $peer .org $org "
peer chaincode list \
--installed > log.txt &
# \
#--peerAddresses "peer${peer}.org${org}.example.com" --tls false
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " List installed chaincodes on remote org ${ org } /peer $peer has Failed "
echo_b " Get instantiated chaincodes at channel $org "
peer chaincode list \
--instantiated \
-C ${ channel } > log.txt &
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " List installed chaincodes on remote org ${ org } /peer $peer has Failed "
echo " === ChaincodeList is done at peer ${ peer } .org ${ org } === "
}
# Start chaincode with dev mode
# TODO: use variables instead of hard-coded value
chaincodeStartDev ( ) {
local peer = $1
local version = $2
[ -z $peer ] && [ -z $version ] && echo_r "input param invalid" && exit -1
setEnvs 1 0
CORE_CHAINCODE_LOGLEVEL = debug \
CORE_PEER_ADDRESS = peer${ peer } .org1.example.com:7052 \
CORE_CHAINCODE_ID_NAME = ${ CC_02_NAME } :${ version } \
nohup ./scripts/chaincode_example02 > chaincode_dev.log &
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc "Chaincode start in dev mode has Failed"
echo "=== Chaincode started in dev mode === "
}
# chaincodeUpgrade channel org peer orderer_url name version args
chaincodeUpgrade ( ) {
if [ " $# " -gt 9 -a " $# " -lt 7 ] ; then
echo_r "Wrong param number for chaincode instantaite"
exit -1
fi
local channel = $1
local org = $2
local peer = $3
local orderer_url = $4
local name = $5
local version = $6
local args = $7
local collection_config = "" # collection config file path for sideDB
local policy = "OR ('Org1MSP.member','Org2MSP.member')" # endorsement policy
echo " === chaincodeUpgrade to orderer by id of org ${ org } /peer $peer === "
echo " name= ${ name } , version= ${ version } , args= ${ args } , collection_config= ${ collection_config } , policy= ${ policy } "
setEnvs $org $peer
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
# lets supply it directly as we know it using the "-o" option
if [ -z " $CORE_PEER_TLS_ENABLED " -o " $CORE_PEER_TLS_ENABLED " = "false" ] ; then
peer chaincode upgrade \
-o ${ orderer_url } \
-C ${ channel } \
-n ${ name } \
-v ${ version } \
-c ${ args } \
-P " ${ policy } " \
--collections-config " ${ collection_config } " \
>& log.txt
else
peer chaincode upgrade \
-o ${ orderer_url } \
-C ${ channel } \
-n ${ name } \
-v ${ version } \
-c ${ args } \
-P " ${ policy } " \
--collections-config " ${ collection_config } " \
--tls \
--cafile ${ ORDERER0_TLS_CA } \
>& log.txt
fi
rc = $?
[ $rc -ne 0 ] && cat log.txt
verifyResult $rc " Upgrade execution on peer $peer failed "
echo " === Upgrade transaction on peer $peer in channel ${ channel } is successful === "
}
# configtxlator encode json to pb
# Usage: configtxlatorEncode msgType input output
configtxlatorEncode( ) {
local msgType = $1
local input = $2
local output = $3
echo " Encode $input --> $output using type $msgType "
docker exec -it ${ CTL_CONTAINER } configtxlator proto_encode \
--type= ${ msgType } \
--input= ${ input } \
--output= ${ output }
#curl -sX POST \
# --data-binary @${input} \
# ${CTL_ENCODE_URL}/${msgType} \
# >${output}
}
# configtxlator decode pb to json
# Usage: configtxlatorEncode msgType input output
configtxlatorDecode( ) {
local msgType = $1
local input = $2
local output = $3
echo " Config Decode $input --> $output using type $msgType "
if [ ! -f $input ] ; then
echo_r "input file not found"
exit 1
fi
docker exec -it ${ CTL_CONTAINER } configtxlator proto_decode \
--type= ${ msgType } \
--input= ${ input } \
--output= ${ output }
#curl -sX POST \
# --data-binary @"${input}" \
# "${CTL_DECODE_URL}/${msgType}" \
# > "${output}"
}
# compute diff between two pb
# Usage: configtxlatorCompare channel origin updated output
configtxlatorCompare( ) {
local channel = $1
local origin = $2
local updated = $3
local output = $4
echo " Config Compare $origin vs $updated > ${ output } in channel $channel "
if [ ! -f $origin ] || [ ! -f $updated ] ; then
echo_r "input file not found"
exit 1
fi
docker exec -it ${ CTL_CONTAINER } configtxlator compute_update \
--original= ${ origin } \
--updated= ${ updated } \
--channel_id= ${ channel } \
--output= ${ output }
#curl -sX POST \
# -F channel="${channel}" \
# -F "original=@${origin}" \
# -F "updated=@${updated}" \
# "${CTL_COMPARE_URL}" \
# > "${output}"
[ $? -eq 0 ] || echo_r "Failed to compute config update"
}
# Run cmd inside the config generator container
gen_con_exec( ) {
docker exec -it $GEN_CONTAINER " $@ "
}