#!/bin/bash set -euo pipefail # ----------------------------------------------------------------------------- # Chaincode deployment helper based on chaincode.txt guide # ----------------------------------------------------------------------------- CHANNEL_NAME=${CHANNEL_NAME:-mychannel} CC_NAME=${CC_NAME:-logVerification} CC_VERSION=${CC_VERSION:-1.0} CC_SEQUENCE=${CC_SEQUENCE:-1} CC_LABEL="${CC_NAME}_${CC_VERSION}" CC_SRC_PATH=${CC_SRC_PATH:-./chaincode/logVerification} CLI_CONTAINER=${CLI_CONTAINER:-cli} ORDERER_ADDRESS=${ORDERER_ADDRESS:-orderer.hospital.com:7050} ORDERER_TLS_HOSTNAME=${ORDERER_TLS_HOSTNAME:-orderer.hospital.com} ORG_ROOT=/opt/gopath/src/github.com/hyperledger/fabric/peer ORDERER_CA=${ORDERER_CA:-${ORG_ROOT}/organizations/ordererOrganizations/hospital.com/orderers/orderer.hospital.com/msp/tlscacerts/tlsca.hospital.com-cert.pem} MSP_PATH=${MSP_PATH:-${ORG_ROOT}/organizations/peerOrganizations/hospital.com/users/Admin@hospital.com/msp} PEER0_TLS=${ORG_ROOT}/organizations/peerOrganizations/hospital.com/peers/peer0.hospital.com/tls/ca.crt PEER1_TLS=${ORG_ROOT}/organizations/peerOrganizations/hospital.com/peers/peer1.hospital.com/tls/ca.crt PEER2_TLS=${ORG_ROOT}/organizations/peerOrganizations/hospital.com/peers/peer2.hospital.com/tls/ca.crt PACKAGE_FILE=${CC_LABEL}.tar.gz info() { echo "[INFO] $*"; } err() { echo "[ERROR] $*" >&2; } run_cli() { docker exec "${CLI_CONTAINER}" bash -lc "$*" } set_peer_env() { local tls=$1 addr=$2 echo "export CORE_PEER_TLS_ENABLED=true" echo "export CORE_PEER_LOCALMSPID=HospitalMSP" echo "export CORE_PEER_TLS_ROOTCERT_FILE=${tls}" echo "export CORE_PEER_MSPCONFIGPATH=${MSP_PATH}" echo "export CORE_PEER_ADDRESS=${addr}" } create_channel_artifacts() { info "Creating channel ${CHANNEL_NAME}" run_cli "export ORDERER_CA=${ORDERER_CA}; \ peer channel create -o ${ORDERER_ADDRESS} -c ${CHANNEL_NAME} -f ./channel-artifacts/${CHANNEL_NAME}.tx --outputBlock ./channel-artifacts/${CHANNEL_NAME}.block --tls --cafile \$ORDERER_CA" run_cli "export ORDERER_CA=${ORDERER_CA}; \ peer channel fetch config ./channel-artifacts/config_block.pb -o ${ORDERER_ADDRESS} --ordererTLSHostnameOverride ${ORDERER_TLS_HOSTNAME} -c ${CHANNEL_NAME} --tls --cafile \$ORDERER_CA" } join_peers() { info "Joining peers to ${CHANNEL_NAME}" run_cli "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -) ; peer channel join -b ./channel-artifacts/${CHANNEL_NAME}.block" run_cli "$(set_peer_env ${PEER1_TLS} peer1.hospital.com:8051 | paste -sd ';' -) ; peer channel join -b ./channel-artifacts/${CHANNEL_NAME}.block" run_cli "$(set_peer_env ${PEER2_TLS} peer2.hospital.com:9051 | paste -sd ';' -) ; peer channel join -b ./channel-artifacts/${CHANNEL_NAME}.block" } package_chaincode() { info "Packaging chaincode ${CC_LABEL}" run_cli "rm -f ${PACKAGE_FILE}" run_cli "peer lifecycle chaincode package ${PACKAGE_FILE} --path ${CC_SRC_PATH} --lang node --label ${CC_LABEL}" } install_chaincode() { info "Installing package on peers" run_cli "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -); peer lifecycle chaincode install ${PACKAGE_FILE}" run_cli "$(set_peer_env ${PEER1_TLS} peer1.hospital.com:8051 | paste -sd ';' -); peer lifecycle chaincode install ${PACKAGE_FILE}" run_cli "$(set_peer_env ${PEER2_TLS} peer2.hospital.com:9051 | paste -sd ';' -); peer lifecycle chaincode install ${PACKAGE_FILE}" } query_package_id() { info "Querying installed chaincode for package ID" PACKAGE_ID=$(docker exec "${CLI_CONTAINER}" bash -lc "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -); peer lifecycle chaincode queryinstalled | grep 'Label: ${CC_LABEL}' | sed -n 's/^Package ID: \([^,]*\),.*/\1/p'") if [[ -z ${PACKAGE_ID} ]]; then err "Failed to find package ID for label ${CC_LABEL}" exit 1 fi echo "PACKAGE_ID=${PACKAGE_ID}" } approve_chaincode() { info "Approving chaincode for HospitalMSP" run_cli "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -); \ peer lifecycle chaincode approveformyorg -o ${ORDERER_ADDRESS} --ordererTLSHostnameOverride ${ORDERER_TLS_HOSTNAME} --channelID ${CHANNEL_NAME} --name ${CC_NAME} --version ${CC_VERSION} --package-id ${PACKAGE_ID} --sequence ${CC_SEQUENCE} --tls --cafile ${ORDERER_CA}" } check_commit_readiness() { info "Checking commit readiness" run_cli "$(set_peer_env ${PEER0_TLS} peer0.hospital.com:7051 | paste -sd ';' -); \ peer lifecycle chaincode checkcommitreadiness -o ${ORDERER_ADDRESS} --channelID ${CHANNEL_NAME} --name ${CC_NAME} --version ${CC_VERSION} --sequence ${CC_SEQUENCE} --tls --cafile ${ORDERER_CA} --output json" } commit_chaincode() { info "Committing chaincode definition" run_cli "peer lifecycle chaincode commit -o ${ORDERER_ADDRESS} --ordererTLSHostnameOverride ${ORDERER_TLS_HOSTNAME} --channelID ${CHANNEL_NAME} --name ${CC_NAME} --version ${CC_VERSION} --sequence ${CC_SEQUENCE} --tls --cafile ${ORDERER_CA} --peerAddresses peer0.hospital.com:7051 --tlsRootCertFiles ${PEER0_TLS}" } main() { local CREATE_CHANNEL=${CREATE_CHANNEL:-false} if [[ ${CREATE_CHANNEL} == "true" ]]; then create_channel_artifacts join_peers fi package_chaincode install_chaincode query_package_id approve_chaincode check_commit_readiness commit_chaincode info "Chaincode ${CC_NAME} (version ${CC_VERSION}, sequence ${CC_SEQUENCE}) deployed on ${CHANNEL_NAME}." info "If this chaincode requires initialization, invoke with --isInit before normal use." } main "$@"