Goland本地调试peer节点
前提
本教程使用ubuntu 16.04 版本
golang环境安装1.14.10 (我使用的是此版本)
下载tar包
下载链接 https://studygolang.com/dl
点击上图红框版本下载,解压到 /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
如下图所示即可
修改 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
下载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 下载二进制文件和镜像文件,运行完成如下图
在fabric-samples 中直接存在bin和config文件夹
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/在 /.bashrc中添加PATH环境变量PATH=PATH:$GOPATH/bin
source ~/.bashrc
docker images 如下图
工作目录准备(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 ./ #链码
目录配置如下
直接将work_dir目录拷贝到192.168.5.236机器即可
创建goland 配置 (192.168.5.236)
goland**版参照此链接 goland**版
当时找了很久,很感谢这位大哥 哈哈哈!
新增一个Go build 配置具体如下:
环境变量
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运行时产生文件路径 区块账本等
配置网络配置(192.168.5.235)
修改$GOPATH/work_dir/first_network/docker-compose-cli.yaml 中 peer(每一个peer节点都需要添加) 和cli 添加extra_hosts(添加自己本地ip) 并屏蔽peer0.org1.example.com 如下所示
修改/etc/hosts
在 /etc/hosts(192.168.5.235) peer0是自己本地IP
/etc/hosts (192.168.5.236)
修改调用链码的脚本
需要修改~/go/work_dir/first-network/scripts/utils.sh,如下图所示 approveForMyOrg commitChaincodeDefinition() checkCommitReadiness() 函数后面都要添加 --singature-policy “OR(‘Org1MSP.member’,‘Org2MSP.member’)” 参数,负责commit时 过不去
approveForMyOrg() 函数
commitChaincodeDefinition() 函数
checkCommitReadiness() 函数
启动网络 (192.168.5.235)
./byfn.sh generate 先生成组织各个节点的证书等
将(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(192.168.5.236)
goland直接在cmd/peer/main.go添加断点调试点击红框中的按钮即可
点击F8下一步,F7进入函数内部 alt+shift+F9下一个断点
启动正常 goland控制台输出如下
也可通过 docker logs peer1.org1.example.com 查询 docker中启动的peer1的日志(192.168.5.235)
黄色日志是peer0 未启动时日志
遇到的坑
配置Goland的peer节点环境变量时,不要配置 CORE_VM_ENDPOINT 此环境变量 ,如果配置的话会遇到如下图所示
此机器第二次启动之前,必须将~/go/work_dir/peer 目录下的文件删除,如果不删除启动goland时,查看(192.168.5.235) docker logs peer1.org1.example.com 时,会出现如下图所示错误
goland控制台会出现如下错误
在goland中调试源码时,关于虚拟机的环境变量需要删除 ~/go/work_dir/first-network/base/peer-base.yaml
否则peer invoke链码时会遇到下面的错误