【fabric源码】Goland调试Hyperledger Fabric 2.0源码、单机网络

引言

  • 启动一个peer和一个orderer
  • 创建通道myc,加入通道
  • 用fabric-sample中的fabcar作为例子,打包、安装、审核、提交密链码,再初始化账本,创建一辆car,查询所有所有car。
  • 所有命令执行都使用debug模式

环境

  • macOS cataline 10.15.3
  • goland 2019.3
  • go 1.14
  • docker-machine 0.16.0
  • 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. 拷贝配置文件

cp -r sampleconfig/* dev-network/

拷贝完后目录结构如下

dev-network
├── config
├── configtx.yaml
├── core.yaml
├── msp
├── orderer.yaml

1.4.修改peer配置文件dev-network/core.yaml

找到fileSystemPath

peer:
     fileSystemPath: $GOPATH/src/github.com/hyperledger/fabric/dev-network/production/peer

这里使用docker跑链码,fabric会调用docker api执行构建、运行链码等操作。找到vm,修改endpoint和docker配置,修改成你自己docker配置(endpointg和tls)

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

1.5.修改orderer配置文件dev-network/orderer.yaml

FileLedger:
    Location: $GOPATH/src/github.com/hyperledger/fabric/dev-network/production/orderer

1.6. 调试工具dlv安装、更新

xcode-select --install
go get -u github.com/go-delve/delve/cmd/dlv
sudo /usr/sbin/DevToolsSecurity -enable

2. 编译configtxgen

fabric没有使用go mod管理依赖,如果转换成go mod 会出现很多错误,如果GO111MODULE=on请设置为off或auto

export GO111MODULE=auto

执行编译,构建这个程序主要为了创建创世块和通道配置

make configtxgen

3. 生成创世块和通道配置

检查是否config目录是否有文件生成

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

4. 导入项目

直接用goland打开$GOPATH/src/github.com/hyperledger/fabric目录,会在当前目录下自动生成.idea目录

5. 导入调试配置

修改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" />
      </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" 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$/../fabric-samples/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="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" 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>
    <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" />
      <item itemvalue="Go Build.06 chaincode install" />
      <item itemvalue="Go Build.07 chaincode queryinstalled" />
      <item itemvalue="Go Build.08 chaincode approve" />
      <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" />
    </list>
  </component>

6. 开始调试

依次运行01~14配置,在需要的地方设置断点,观察控制台变化

  • 将配置“02 peer"中环境变量CORE_PEER_ADDRESS的值修改成你网卡ip地址,否则链码在容器里无法连接到链码服务
  • 05步中–path参数为你的链码路径
  • 执行06步或07步 后记录下Package ID,第8步 approve时需要修改package-id参数
  • 执行10步后,执行docker ps查看链码容器是否启动
发布了22 篇原创文章 · 获赞 0 · 访问量 1277

猜你喜欢

转载自blog.csdn.net/kk3909/article/details/104927333