【fabric源碼】Goland/Vscode調試Hyperledger Fabric 2.0源碼、單機網絡(傻瓜式調試)

引言

  • 啓動一個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_GENESISMETHODORDERER_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請設置爲offauto

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調試

  1. 用goland打開$GOPATH/src/github.com/hyperledger/fabric目錄,會在當前目錄下自動生成.idea目錄

  2. 修改golang項目配置

cd $GOPATH/src/github.com/hyperledger/fabric
vim .idea/workspace.xml
  1. 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 &quot;{\&quot;function\&quot;:\&quot;initLedger\&quot;,\&quot;Args\&quot;:[\&quot;\&quot;]}&quot;" />
      <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 &quot;{\&quot;function\&quot;:\&quot;CreateCar\&quot;,\&quot;Args\&quot;:[\&quot;CAR9\&quot;,\&quot;BYD\&quot;,\&quot;唐dm\&quot;,\&quot;Red\&quot;,\&quot;Pld\&quot;]}&quot;" />
      <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 &quot;{\&quot;function\&quot;:\&quot;QueryAllCars\&quot;,\&quot;Args\&quot;:[\&quot;\&quot;]}&quot;" />
      <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調試

  1. vscode打開$GOPATH/src/github.com/hyperledger/fabric目錄
  2. 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 install07 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模式)

  1. 配置修改
    修改15 chaincode debug fabcar配置中參數
    環境變量CORE_CHAINCODE_ID_NAMEpackage-id
    參數-peer.address參數指定peer的鏈碼服務監聽地址。

  2. 下載依賴

 cd chaincode/fabcar/go 
 go get -t github.com/hyperledger/fabric-contract-api-go/contractapi
  1. 殺掉peer啓動的chaincode進程(下一步啓動成我們自己的chaincode進程)
ps -ef | grep fabcarv1-external | grep -v grep | awk '{print $2}'|xargs kill -9
  1. 打好斷點,啓動調試程序15
  2. 啓動配置13或14調用chaincode ,檢查斷點是否有效
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章