引言
- 啓動一個peer和一個orderer
- 使用fabric/sampleconfig下的配置文件(一個組織SampleOrg),生成創世塊和通道配置
- 創建通道myc,peer加入通道
- 用fabric-sample中的fabcar作爲例子,打包、安裝、審覈、提交鏈碼,再初始化賬本,創建一輛car,查詢所有所有car。
- 所有命令執行都使用debug模式,無需敲任何peer命令
- 可調試鏈碼
環境
- macOS cataline 10.15.3
- goland 2019.3 / vscode 1.43.0
- go 1.14
- docker-machine 0.16.0
- docker 19.03.5
- ss代理
1. 準備工作
注意:$GOPATH修改成你的GOPATH路徑
1.1. 下載源碼
cd $GOPATH/src/github.com/hyperledger/
git clone https://github.com/hyperledger/fabric.git
git checkout v2.0.1
git clone https://github.com/hyperledger/fabric-samples
下載慢的話需要配置下代理,這裏我本地啓動了ss代理
git config --global http.proxy socks5://127.0.0.1:1080
git config --global http.sslVerify false
git config --global https.proxy socks5://127.0.0.1:1080
取消代理
git config --global --unset http.proxy
git config --global --unset http.sslVerify
git config --global --unset https.proxy
1.2.創建配置文件目錄
cd fabric
mkdir -p dev-network/config
1.3. 拷貝配置文件、外部構建程序、鏈碼demo
cp -r sampleconfig/* dev-network/
cp -r integration/externalbuilders dev-network/
cp -r $GOPATH/src/github.com/hyperledger/fabric-samples/chaincode $GOPATH/src/github.com/hyperledger/fabric/dev-network/
拷貝完後dev-network
目錄結構如下
├── chaincode
│ ├── abac
│ ├── abstore
│ ├── fabcar
│ ├── marbles02
│ ├── marbles02_private
│ └── sacc
├── config
├── configtx.yaml
├── core.yaml
├── externalbuilders
│ ├── binary
│ └── golang
├── msp
│ ├── admincerts
│ ├── cacerts
│ ├── config.yaml
│ ├── keystore
│ ├── signcerts
│ ├── tlscacerts
│ └── tlsintermediatecerts
└── orderer.yaml
1.4.修改peer配置文件dev-network/core.yaml
找到fileSystemPath,修改存儲路徑
peer:
fileSystemPath: $GOPATH/src/github.com/hyperledger/fabric/dev-network/production/peer
使用docker跑鏈碼配置(不支持調試chaincode):peer會調用docker api執行構建、運行鏈碼等操作。
找到vm,修改endpoint和docker配置(請根據實際情況,修改成你自己docker配置)
vm:
endpoint: tcp://192.168.99.100:2376
docker:
tls:
enabled: true
ca:
file: /Users/USER/.docker/machine/machines/demo/ca.pem
cert:
file: /Users/USER/.docker/machine/machines/demo/cert.pem
key:
file: /Users/USER/.docker/machine/machines/demo/key.pem
外部跑鏈碼配置(支持調試chaincode)
chaincode:
externalBuilders:
- path: $GOPATH/src/github.com/hyperledger/fabric/dev-network/externalbuilders/golang
name: external-golang
environmentWhitelist:
- GOPROXY
- GOCACHE
- GOPATH
注意:package的時候label標籤需要以-external
結尾,eg:--label fabcarv1-external
,如果需要修改默認的規則,請修改dev-network/externalbuilders/golang/bin/detect腳本
if [[ "$(jq -r .label "$2/metadata.json")" != *-external* ]]; then
>&2 echo "only golang chaincode named with an '-external' suffix is supported"
exit 1
fi
1.5.修改orderer配置文件dev-network/orderer.yaml
修改創世塊文件位置(OPT,可不修改,後面01 orderer
調試配置中有環境變量ORDERER_GENERAL_GENESISMETHOD
和ORDERER_GENERAL_GENESISFILE
指定了創世塊的位置)
General:
BootstrapFile: $GOPATH/src/github.com/hyperledger/fabric/dev-network/config/orderer.block
修改賬本數據目錄
FileLedger:
Location: $GOPATH/src/github.com/hyperledger/fabric/dev-network/production/orderer
1.6. 調試工具dlv安裝、更新(opt,僅供參考)
xcode-select --install
go get -u github.com/go-delve/delve/cmd/dlv
sudo /usr/sbin/DevToolsSecurity -enable
1.7. docker machine啓動(opt,僅供參考)
docker-machine start demo
啓動後需要導入環境變量
1.8. 環境變量配置(opt,僅供參考)
~/.bash_profile
export GOROOT="/usr/local/Cellar/go/1.14/libexec"
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
export GO111MODULE=auto
export GOPROXY=https://goproxy.io
eval $(docker-machine env demo)
1.9. 安裝外部構建依賴(opt,僅供參考)
brew install jq
2. 編譯configtxgen
fabric
使用dep
管理依賴,如果使用go mod init
轉換成go.mod
會出現不能預知的錯誤(如viper版本過高,不能正確獲取key值),如果GO111MODULE=on
請設置爲off
或auto
export GO111MODULE=auto
執行編譯,構建這個程序主要爲了創建創世塊和通道配置
make configtxgen
3. 生成創世塊和通道配置
cd dev-netwok
# 創世塊
$GOPATH/src/github.com/hyperledger/fabric/build/bin/configtxgen -profile SampleDevModeSolo -channelID sys-channel -outputBlock ./config/orderer.block
# 通道配置
$GOPATH/src/github.com/hyperledger/fabric/build/bin/configtxgen -profile SampleSingleMSPChannel -outputCreateChannelTx ./config/myc.tx -channelID myc
檢查是否config
目錄是否有文件生成
4.導入項目
4.1. 使用goland調試
-
用goland打開
$GOPATH/src/github.com/hyperledger/fabric
目錄,會在當前目錄下自動生成.idea目錄 -
修改golang項目配置
cd $GOPATH/src/github.com/hyperledger/fabric
vim .idea/workspace.xml
- project下添加RunManager組件(用於調試或運行peer 和orderer等相關命令)
<component name="RunManager" selected="Go Build.14 chaincode fabcar QueryAllCars">
<configuration name="01 orderer" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<envs>
<env name="FABRIC_CFG_PATH" value="dev-network" />
<env name="ORDERER_GENERAL_LOCALMSPID" value="SampleOrg" />
<env name="ORDERER_GENERAL_GENESISFILE" value="config/orderer.block" />
<env name="ORDERER_GENERAL_GENESISMETHOD" value="file" />
<env name="ORDERER_GENERAL_LISTENADDRESS" value="0.0.0.0" />
</envs>
<kind value="FILE" />
<filePath value="$PROJECT_DIR$/cmd/orderer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="02 peer" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<parameters value="node start --peer-chaincodedev=true" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="peer" />
<env name="CORE_PEER_ADDRESS" value="192.168.2.5:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
<env name="GOCACHE" value="$USER_HOME$/Library/Caches/go-build" />
</envs>
<kind value="FILE" />
<filePath value="$PROJECT_DIR$/cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="03 channel create " type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<parameters value="channel create -c myc -f dev-network/config/myc.tx -o 127.0.0.1:7050" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="04 channel join " type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<parameters value="channel join -b myc.block" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="05 chaincode package (docker )" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode package fabcar.tar.gz --path $PROJECT_DIR$/dev-network/chaincode/fabcar/go --lang golang --label fabcarv1" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="05 chaincode package (externalbuilder)" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode package fabcar.tar.gz --path $PROJECT_DIR$/dev-network/chaincode/fabcar/go --lang golang --label fabcarv1-external" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="06 chaincode install" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode install fabcar.tar.gz" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="07 chaincode queryinstalled" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode queryinstalled" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="08 chaincode approve (externalbuilder)" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode approveformyorg --channelID myc --name fabcar --version 1.0 --init-required --package-id fabcarv1-external:71e92900aae6b5ed64d53f83940608c9235cd41decf370b346f4833cf3b83345 --sequence 1 --waitForEvent" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="08 chaincode approve (docker)" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode approveformyorg --channelID myc --name fabcar --version 1.0 --init-required --package-id fabcarv1:759e143166fb106f7f150c1e99ee7236eb57fd328b6d9d43b004afbeca9aa475 --sequence 1 --waitForEvent" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="09 chaincode checkcommitreadiness" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode checkcommitreadiness --channelID myc --name fabcar --version 1.0 --init-required --sequence 1" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="10 chaincode commit" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode commit --channelID myc --name fabcar --version 1.0 --sequence 1 --init-required --waitForEvent" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="11 chaincode querycommit" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="lifecycle chaincode querycommitted --channelID myc --output json" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="12 chaincode fabcar initLedger" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="chaincode invoke -C myc -n fabcar --isInit -c "{\"function\":\"initLedger\",\"Args\":[\"\"]}"" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="13 chaincode fabcar create car" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="chaincode invoke -C myc -n fabcar -c "{\"function\":\"CreateCar\",\"Args\":[\"CAR9\",\"BYD\",\"唐dm\",\"Red\",\"Pld\"]}"" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="14 chaincode fabcar QueryAllCars" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/" />
<useCustomBuildTags value="true" />
<parameters value="chaincode invoke -C myc -n fabcar -c "{\"function\":\"QueryAllCars\",\"Args\":[\"\"]}"" />
<envs>
<env name="CORE_PEER_LOCALMSPID" value="SampleOrg" />
<env name="CORE_PEER_ID" value="cli" />
<env name="CORE_PEER_ADDRESS" value="127.0.0.1:7051" />
<env name="FABRIC_CFG_PATH" value="dev-network" />
</envs>
<kind value="FILE" />
<filePath value="cmd/peer/main.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<configuration name="15 chaincode debug fabcar" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="fabric" />
<working_directory value="$PROJECT_DIR$/dev-network/chaincode/fabcar/go" />
<useCustomBuildTags value="true" />
<parameters value="-peer.address=192.168.2.5:7052" />
<envs>
<env name="CORE_CHAINCODE_ID_NAME" value="fabcarv1-external:71e92900aae6b5ed64d53f83940608c9235cd41decf370b346f4833cf3b83345" />
<env name="CORE_PEER_TLS_ENABLED" value="false" />
</envs>
<kind value="FILE" />
<filePath value="fabcar.go" />
<package value="github.com/hyperledger/fabric" />
<directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
<list>
<item itemvalue="Go Build.01 orderer" />
<item itemvalue="Go Build.02 peer" />
<item itemvalue="Go Build.03 channel create " />
<item itemvalue="Go Build.04 channel join " />
<item itemvalue="Go Build.05 chaincode package (docker )" />
<item itemvalue="Go Build.05 chaincode package (externalbuilder)" />
<item itemvalue="Go Build.06 chaincode install" />
<item itemvalue="Go Build.07 chaincode queryinstalled" />
<item itemvalue="Go Build.08 chaincode approve (docker)" />
<item itemvalue="Go Build.08 chaincode approve (externalbuilder)" />
<item itemvalue="Go Build.09 chaincode checkcommitreadiness" />
<item itemvalue="Go Build.10 chaincode commit" />
<item itemvalue="Go Build.11 chaincode querycommit" />
<item itemvalue="Go Build.12 chaincode fabcar initLedger" />
<item itemvalue="Go Build.13 chaincode fabcar create car" />
<item itemvalue="Go Build.14 chaincode fabcar QueryAllCars" />
<item itemvalue="Go Build.15 chaincode debug fabcar" />
</list>
</component>
沒問題的話,將看到下面圖中的配置
4.2. vscode調試
- 用
vscode
打開$GOPATH/src/github.com/hyperledger/fabric
目錄 - 在
fabric
目錄下創建項目配置文件.vscode/launch.json
,內容如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "01 orderer",
"type": "go",
"request": "launch",
"program": "${workspaceRoot}/cmd/orderer",
"showLog": true,
"trace": "log",
"env": {
"GO111MODULE": "auto",
"ORDERER_GENERAL_LISTENADDRESS":"0.0.0.0",
"ORDERER_GENERAL_GENESISMETHOD":"file",
"ORDERER_GENERAL_GENESISFILE":"${workspaceRoot}/dev-network/config/orderer.block",
"ORDERER_GENERAL_LOCALMSPID":"SampleOrg",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network"
},
"args": [],
},
{
"name": "02 peer",
"type": "go",
"request": "launch",
"program": "${workspaceRoot}/cmd/peer",
"showLog": true,
"trace": "log",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"peer",
"CORE_PEER_ADDRESS":"192.168.2.5:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["node","start","--peer-chaincodedev=true"]
},
{
"name": "03 channel create",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["channel","create","-c", "myc","-f","${workspaceRoot}/dev-network/config/myc.tx","-o","127.0.0.1:7050"],
},
{
"name": "04 channel join",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["channel","join","-b","myc.block"]
},
{
"name": "05 chaincode package (docker)",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle","chaincode","package","fabcar.tar.gz","--path","${workspaceRoot}/dev-network/chaincode/fabcar/go","--lang" ,"golang","--label", "fabcarv1"],
},
{
"name": "05 chaincode package (externalbuilder)",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle","chaincode","package","fabcar.tar.gz","--path","${workspaceRoot}/dev-network/chaincode/fabcar/go","--lang" ,"golang","--label", "fabcarv1-external"],
},
{
"name": "06 chaincode install",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle","chaincode","install","fabcar.tar.gz"]
},
{
"name": "07 chaincode queryinstalled",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle","chaincode","queryinstalled"]
},
{
"name": "08 chaincode approve (docker)",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle", "chaincode", "approveformyorg" ,"--channelID" ,"myc" ,"--name", "fabcar" ,"--version", "1.0", "--init-required", "--package-id", "fabcarv1:03bef137867a85ae6dac8b2b8c3f05d041a9b48597b41b346f1988d268705812" ,"--sequence" ,"1", "--waitForEvent"]
},
{
"name": "08 chaincode approve (externalbuilder)",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle", "chaincode", "approveformyorg" ,"--channelID" ,"myc" ,"--name", "fabcar" ,"--version", "1.0", "--init-required", "--package-id", "fabcarv1-external:71e92900aae6b5ed64d53f83940608c9235cd41decf370b346f4833cf3b83345" ,"--sequence" ,"1", "--waitForEvent"]
},
{
"name": "09 chaincode checkcommitreadiness",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle", "chaincode", "checkcommitreadiness" ,"--channelID" ,"myc", "--name" ,"fabcar" ,"--version", "1.0" ,"--init-required" ,"--sequence", "1"]
},
{
"name": "10 chaincode commit",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle", "chaincode","commit", "--channelID", "myc" ,"--name" ,"fabcar", "--version", "1.0" ,"--sequence" ,"1" ,"--init-required" ,"--waitForEvent"]
},
{
"name": "11 chaincode querycommitted",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["lifecycle", "chaincode","querycommitted", "--channelID", "myc" ,"--output", "json"]
},
{
"name": "12 chaincode fabcar initLedger",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["chaincode" ,"invoke", "-C" ,"myc" ,"-n" ,"fabcar", "--isInit", "-c","{\"function\":\"initLedger\",\"Args\":[\"\"]}"]
},
{
"name": "13 chaincode fabcar create car",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["chaincode" ,"invoke", "-C" ,"myc" ,"-n" ,"fabcar", "-c","{\"function\":\"CreateCar\",\"Args\":[\"CAR9\",\"BYD\",\"唐dm\",\"Red\",\"Pld\"]}"]
},
{
"name": "14 chaincode fabcar QueryAllCars",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/cmd/peer",
"env": {
"GO111MODULE": "auto",
"CORE_PEER_LOCALMSPID":"SampleOrg",
"CORE_PEER_ID":"cli",
"CORE_PEER_ADDRESS":"127.0.0.1:7051",
"FABRIC_CFG_PATH":"${workspaceRoot}/dev-network",
},
"args": ["chaincode" ,"invoke", "-C" ,"myc" ,"-n" ,"fabcar", "-c","{\"function\":\"QueryAllCars\",\"Args\":[\"\"]}"]
}
,
{
"name": "15 chaincode debug fabcar",
"type": "go",
"request": "launch",
"showLog": true,
"trace": "log",
"program": "${workspaceRoot}/dev-network/chaincode/fabcar/go",
"env": {
"GO111MODULE": "on",
"CORE_CHAINCODE_ID_NAME":"fabcarv1-external:71e92900aae6b5ed64d53f83940608c9235cd41decf370b346f4833cf3b83345",
"CORE_PEER_TLS_ENABLED":"false"
},
"args": ["-peer.address=192.168.2.5:7052"]
}
]
}
沒有問題的話,打開了調試窗口,將看到下面圖中的配置
注意:vscode的go插件默認使用go mod,須傳入GO111MODULE=auto
禁用go mod ,目錄下沒有go.mod的時候,不使用go mod構建,否則會出現以下錯誤。
can't load package: cannot find module providing package github.com/hyperledger/fabric/cmd/peer: working directory is not part of a module
exit status 1
Process exiting with code: 1
5. 開始調試
依次運行01~14配置,在需要的地方設置斷點,觀察控制檯變化
- 將配置
02 peer
中環境變量CORE_PEER_ADDRESS的值修改成你網卡ip地址(不能使用127.0.0.1之類的迴環地址),否則鏈碼無法連接到peer鏈碼服務 - 將配置
02 peer
中環境變量GOCACHE的值修改成go env GOCACHE
獲取的值,否則externalbuilder無法build 05 chaincode package
有兩個配置,需要調試鏈碼請跑externalbuilder
- 執行
06 chaincode install
或07 chaincode queryinstalled
後需記錄下Package ID,執行08 chaincode approve
替換package-id的值,鏈碼和標籤修改都會導致package-id發生變化 - 如果使用docker跑鏈碼,執行
10 chaincode commit
後,執行docker ps
查看鏈碼容器是否啓動,如果沒有啓動鏈碼無法調用;如果使用externalbuilder跑鏈碼,執行ps -ef | grep fabcarv1-external
檢查鏈碼進程是否啓動
6. debug chaincode(僅針對externalBuilder模式)
-
配置修改
修改15 chaincode debug fabcar
配置中參數
環境變量CORE_CHAINCODE_ID_NAME
爲package-id
參數-peer.address
參數指定peer的鏈碼服務監聽地址。 -
下載依賴
cd chaincode/fabcar/go
go get -t github.com/hyperledger/fabric-contract-api-go/contractapi
- 殺掉peer啓動的chaincode進程(下一步啓動成我們自己的chaincode進程)
ps -ef | grep fabcarv1-external | grep -v grep | awk '{print $2}'|xargs kill -9
- 打好斷點,啓動調試程序15
- 啓動配置13或14調用chaincode ,檢查斷點是否有效