Goland本地调试peer节点

前提

本教程使用ubuntu 16.04 版本
golang环境安装1.14.10 (我使用的是此版本)
下载tar包
下载链接 https://studygolang.com/dl
Goland本地调试peer节点

点击上图红框版本下载,解压到 /usr/local/ 即可
tar -zxvf go1.14.10.linux-amd64.tar.gz go

添加环境变量

vi ~/.bashrc
GOROOT=/usr/local/go
PATH= P A T H : PATH: PATH:GOROOT/bin
source ~/.bashrc
重新打开一个新的控制台
go version
如下图所示即可
Goland本地调试peer节点
修改 go 环境的代理 否则会被墙
export GOPROXY=https://goproxy.cn,direct

docker环境安装

参考官方即可 docker安装

机器环境准备

192.168.5.235:此机器上部署fabrc网络
192.168.5.236:此机器上部署goland调试peer节点

基础目录准备

mkdir ~/go && mkdir go/src && mkdir go/bin && mkdir go/pkg
vi ~/.bashrc
设置环境变量GOPATH
export GOPATH=$HOME/go
source ~/.bashrc

存放fabric源码路径
cd $GOPATH && mkdir -p src/github.com/hyperledger/

存放fabric-samples 路径
cd $GOPATH && mkdir -p example
Goland本地调试peer节点

下载fabric源码 (192.168.5.235 192.168.236)

cd $GOPATH/src/github.com/hyperledger/

git clone -b v2.1.0 https://github.com/hyperledger/fabric.git
此处选用的所示fabric的v2.1.0版本,因为v2.1.1版本中没有first-network的例子,其实和v2.1.1版本的test-network没什么区别,只是当时做的原因。选择哪个版本都无所谓,思路一样。

下载fabric-sample源码、相关镜像、二进制文件(192.168.5.235 192.168.71.130)

cd fabric/scripts && cp bootstrap.sh $GOPATH/example
./bootstrap.sh 下载二进制文件和镜像文件,运行完成如下图
Goland本地调试peer节点
在fabric-samples 中直接存在bin和config文件夹
Goland本地调试peer节点
cd $GOPATH/example/fabric-samples && cp -r ./bin G O P A T H / 在   / . b a s h r c 中 添 加 P A T H 环 境 变 量 P A T H = GOPATH/ 在~/.bashrc 中添加PATH环境变量 PATH= GOPATH/ /.bashrcPATHPATH=PATH:$GOPATH/bin
source ~/.bashrc

docker images 如下图
Goland本地调试peer节点

工作目录准备(192.168.5.235)

cd $GOPATH/
mkdir work_dir && cd work_dir
mkdir peer #用来存放peer拉取的区块文件等信息
cp -r $GOPATH/example/fabric-samples/config ./ #peer进行goland调试时需要的配置文件
cp -r $GOPATH/example/fabric-samples/first-network ./ #容器启动时的yaml文件和脚本
cp -r $GOPATH/example/fabric-samples/chaincode ./ #链码
目录配置如下
Goland本地调试peer节点
直接将work_dir目录拷贝到192.168.5.236机器即可

创建goland 配置 (192.168.5.236)

goland**版参照此链接 goland**版
当时找了很久,很感谢这位大哥 哈哈哈!
新增一个Go build 配置具体如下:
Goland本地调试peer节点

环境变量

Goland本地调试peer节点
Goland本地调试peer节点
Goland本地调试peer节点
FABRIC_LOGGING_SPEC=INFO
CORE_PEER_TLS_ENABLED=true
CORE_PEER_GOSSIP_USELEADERELECTION=true
CORE_PEER_GOSSIP_ORGLEADER=false
CORE_PEER_PROFILE_ENABLED=true
CORE_PEER_TLS_CERT_FILE=…/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
CORE_PEER_TLS_KEY_FILE=…/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
CORE_PEER_TLS_ROOTCERT_FILE=…/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_ID=peer0.org1.example.com
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LISTENADDRESS=0.0.0.0:7051
CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051
CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID=Org1MSP
FABRIC_CFG_PATH=…/config

此处的环境变量都是从docker-compose-cli.yaml base/peer-base.yaml base/docker-compose-base.yaml peer0.org1.example.com 文件中 摘出来的

注意 CORE_VM_ENDPOINT 和CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE 这两个环境变量不要 否则会出错,会在下面说到

修改

$GOPATH/work_dir/config/core.yaml (192.168.5.236)

mspConfigPath: …/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp #此处是给goland中的peer指定msp路径
fileSystemPath: …/peer #peer运行时产生文件路径 区块账本等
Goland本地调试peer节点
Goland本地调试peer节点

配置网络配置(192.168.5.235)

修改$GOPATH/work_dir/first_network/docker-compose-cli.yaml 中 peer(每一个peer节点都需要添加) 和cli 添加extra_hosts(添加自己本地ip) 并屏蔽peer0.org1.example.com 如下所示
Goland本地调试peer节点
Goland本地调试peer节点
Goland本地调试peer节点
Goland本地调试peer节点
Goland本地调试peer节点

修改/etc/hosts

在 /etc/hosts(192.168.5.235) peer0是自己本地IP
Goland本地调试peer节点
/etc/hosts (192.168.5.236)
Goland本地调试peer节点

修改调用链码的脚本

需要修改~/go/work_dir/first-network/scripts/utils.sh,如下图所示 approveForMyOrg commitChaincodeDefinition() checkCommitReadiness() 函数后面都要添加 --singature-policy “OR(‘Org1MSP.member’,‘Org2MSP.member’)” 参数,负责commit时 过不去
approveForMyOrg() 函数
Goland本地调试peer节点
commitChaincodeDefinition() 函数
Goland本地调试peer节点
checkCommitReadiness() 函数
Goland本地调试peer节点

启动网络 (192.168.5.235)

./byfn.sh generate 先生成组织各个节点的证书等
Goland本地调试peer节点
将(192.168.5.235)上的crypto-config和 channel-artifacts 拷贝到(192.168.5.236)~/go/work_dir/first-network/

docker-compose -f docker-compose-cli.yaml up -d
docker-compose -f docker-compose-etcdraft2.yaml up -d
如下 红色是未执行 docker-compose-etcdraft2.yaml raft模式选择orderer leader 启动后就正常
Goland本地调试peer节点

启动Goland(192.168.5.236)

Goland本地调试peer节点
goland直接在cmd/peer/main.go添加断点调试点击红框中的按钮即可
点击F8下一步,F7进入函数内部 alt+shift+F9下一个断点

启动正常 goland控制台输出如下
Goland本地调试peer节点
也可通过 docker logs peer1.org1.example.com 查询 docker中启动的peer1的日志(192.168.5.235)Goland本地调试peer节点
黄色日志是peer0 未启动时日志

遇到的坑

配置Goland的peer节点环境变量时,不要配置 CORE_VM_ENDPOINT 此环境变量 ,如果配置的话会遇到如下图所示Goland本地调试peer节点
此机器第二次启动之前,必须将~/go/work_dir/peer 目录下的文件删除,如果不删除启动goland时,查看(192.168.5.235) docker logs peer1.org1.example.com 时,会出现如下图所示错误Goland本地调试peer节点
goland控制台会出现如下错误Goland本地调试peer节点
在goland中调试源码时,关于虚拟机的环境变量需要删除 ~/go/work_dir/first-network/base/peer-base.yaml
Goland本地调试peer节点
否则peer invoke链码时会遇到下面的错误
Goland本地调试peer节点