调试fabric源码,我们先调试orderer节点。
提前准备
ubuntu系统(我是win10和ubuntu的双系统)
可以跑起来的fabric(我用的是1.2的版本)
IDE:goland
debug文件准备
先说我的fabric在哪:/home/xxx/go/src/github.com/hyperledger/fabric
1、把我们调试需要的文件都集中放在一个文件中。在/fabric下新建一个目录work_dir
cd go/src/github.com/hyperledger/fabric
mkdir work_dir
2.1、把需要的配置、bin工具、shell文件复制到work_dir下
先给大家看一下最终的样子
现在开始一点一点复制:
把fabric/scripts/fabric-samples下的/bin, /chaincode, /config, /first-network这4个文件夹内容完全复制到/fabric/work_dir下的对应文件夹下。
2.2验证复制过来的配置和工具
cd
cd go/src/github.com/hyperledger/fabric/work_dir/first-network
./byfn.sh down
./byfn.sh up
能够像正常情况下打印出结果,就对了
配置文件中的环境变量迁移到ide中
1、在ide中选中orderer的main.go
点击:Run->Debug->Edit Configurations
编辑:
Run Kind: Package
Package path: github.com/hyperledger/fabric/orderer
Output directory: /home/xxx/go/src/github.com/hyperledger/fabric/work_dir/bin
Working directory: /home/xxx/go/src/github.com/hyperledger/fabric/work_dir/first-network
Environment:
正常跑fabric的时候,环境变量都是写在docker-compose的yaml文件里,总共有三个。byfn用docker-compose-cli.yaml , base/docker-compose-base.yaml , base/peer-base.yaml。
orderer的环境变量都在base/docker-compose-base.yaml里
yaml文件里的环境变量路径都是映射后的路径。用volumes中每个冒号前的部分替换冒号后的部分,记得新路径上加上first-network。改后的内容如下(不用动yaml文件,复制出来改,一会儿我们粘贴到ide里)
还要加上一个FABRIC_CFG_PATH=../config/ (不加会报错哦)
ORDERER_GENERAL_LOGLEVEL=INFO
ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
ORDERER_GENERAL_GENESISMETHOD=file
ORDERER_GENERAL_GENESISFILE=../first-network/channel-artifacts/genesis.block
ORDERER_GENERAL_LOCALMSPID=OrdererMSP
ORDERER_GENERAL_LOCALMSPDIR=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp
ORDERER_GENERAL_TLS_ENABLED=true
ORDERER_GENERAL_TLS_PRIVATEKEY=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
ORDERER_GENERAL_TLS_CERTIFICATE=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
ORDERER_GENERAL_TLS_ROOTCAS=[../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt]
FABRIC_CFG_PATH=../config/ #注意这行,原来没有,debug要加上
然后把这些复制一下,到我们刚才在ide设置debug的配置的地方 (Run->Debug->Edit Configurations),直接点击Environment后面的小图(粘贴),环境变量就都写进去了。
改orderer的config
vi work_dir/config/orderer.yaml
找到FileLedger.Location。原来是映射后的路径,改成。。。/fabric/work_dir/orderer如上图
改docker-compose-cli.yaml
把orderer部分全注释掉
还要注释调service.cli的depends_on的orderer部分
再然后,给此文件中所有其他容器部分加一个orderer的外部ip映射 extra_hosts,像这样:
你自己的ip这么查:在终端输入ifconfig,或者ip a,或者hostname -I(这种最方便,输出很简短,第一个就是想要的ip)
启动网络
先清理之前的网络
cd work_dir/first-network
./byfn.sh down # 清理orderer的FileLedger目录,每次网络重置都需要做这步,orderer的一些内容脚本是清不掉的
rm -rf ../orderer/*
./byfn generate
docker-compose -f docker-compose-cli.yaml up -d # 启动容器
开始调试
在源码中打断点,点击绿色小虫虫debug。能看到filepath=。。。 就对了。像下图。
然后终端我们到cli里去(docker exec -it cli bash) 写一个peer命令
cd work_dir/first-network
docker exec -it cli bash
# 发送channel创建请求
export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
就能看到ide中断点处的值了。
成功!!!过两天我再调试peer