我已經構建了一個 Hyperledger Fabric 網路并且網路設定良好。鏈碼也已部署。現在,我想呼叫鏈??碼的函式。如果我必須通過終端來做,那么它就像:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"StorePacketData","Args":["a0", "b0", "c0", "d0", "e0"]}'
這作業得很好。但是,我想從一個 shell 腳本呼叫這個函式,其中函式的引數是變數。這個 shell 腳本檔案被另一個 shell 腳本呼叫。因此,我的 shell 腳本檔案如下所示:
#!/bin/bash
invokeCC() {
arg1=$1
arg2=$2
arg3=$3
arg4=$4
arg5=$5
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"StorePacketData","Args":["$arg1", "$arg2", "$arg3", "$arg4", "$arg5"]}'
}
invokeCC $1 $2 $3 $4 $5
很明顯這個詞:
'{"function":"StorePacketData","Args":["$arg1", "$arg2", "$arg3", "$arg4", "$arg5"]}'
被視為一個完整的字串,不能傳遞變數。因此,我嘗試了一個變體:
#!/bin/bash
invokeCC() {
arg1=$1
arg2=$2
arg3=$3
arg4=$4
arg5=$5
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
QUOTE="'"
args="{\"function\":\"StorePacketData\",\"Args\":[\"$arg1\", \"$arg2\", \"$arg3\", \"$arg4\", \"$arg5\"]}"
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c $QUOTE$args$QUOTE
}
invokeCC $1 $2 $3 $4 $5
這也給出了錯誤,這是
Error: chaincode argument error: invalid character '\'' looking for beginning of value
我知道我在第二種方法中出錯了,但我不知道還能做什么。
請建議我應該在這里做什么來呼叫鏈碼。如果我需要提供任何其他資訊,請告訴我。
提前致謝!
uj5u.com熱心網友回復:
要使用任意命令列引數串列生成格式良好、語法有效的 JSON,請使用jq1.6 版和$ARGS.positional:
#!/usr/bin/env bash
invokeCC() {
args=$(jq -n '{"function":"StorePacketData", "Args": $ARGS.positional}' --args "$@")
peer chaincode invoke ... --args "$args"
}
invokeCC "$@"
也可以使用--argand實作相同的目標$ARGS.named:
invokeCC() {
local -a jq_args=( )
local arg idx=0 idx_str
for arg in "$@"; do
printf -v idx_str 'd' "$idx"
jq_args =( --arg "arg$idx_str" "$arg" )
(( idx ))
done
jq -nc "${jq_args[@]}" '{"function": "StorePacketData", "Args": [$ARGS.named | to_entries | sort_by(.key)[] | .value]}'
}
invokeCC "$@"
uj5u.com熱心網友回復:
正如@Charles Duffy 建議的那樣,我用于jq傳遞引數。所以,我將我的 shell 腳本更改為:
#!/bin/bash
invokeCC() {
arg1=$1
arg2=$2
arg3=$3
arg4=$4
arg5=$5
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
echo hello
args=$(jq \
-n --arg val1 "$arg1" \
-n --arg val2 "$arg2" \
-n --arg val3 "$arg3" \
-n --arg val4 "$arg4" \
-n --arg val5 "$arg5" \
'{"function":"StorePacketData", "Args": [$val1, $val2, $val3, $val4, $val5]}'
)
echo "$args"
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c "$args"
}
invokeCC "$1" "$2" "$3" "$4" "$5"
這作業得很好。但是,@Charles Duffy 建議的解決方案要好得多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336376.html
