引言
- 启动一个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 "{\"function\":\"initLedger\",\"Args\":[\"\"]}"" />
<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 "{\"function\":\"CreateCar\",\"Args\":[\"CAR9\",\"BYD\",\"唐dm\",\"Red\",\"Pld\"]}"" />
<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 "{\"function\":\"QueryAllCars\",\"Args\":[\"\"]}"" />
<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查看链码容器是否启动