hyperledger fabric 源码调试(orderer)环境搭建教程
前言
接触hyperledger fabric有一段时间了,看文档搭集群写链码都做过,但要深入理解还是通过源码比较直观,遂决定部署起来。同多机器部署一样,官文对源码调试的描述较少,网上有些前辈已经写过但少有明确每一步的原因,本系列文尝试依据个人理解来描述构建fabric源码调试环境的步骤,去掉docker这层障碍,并给出思考过程。
之前有写过一篇hyperledger fabric 多机部署的教程,基于first-network示例,这次也是以它为基准,以便在遇到问题的时候更容易从官方文档找到解决方案。需要先走通first-network的搭建,有些配置项需要参考它。
官文链接:https://hyperledger-fabric.readthedocs.io/en/release-1.4/build_network.html
分析
fabric模块划分比较细,采用docker是为了简化部署,同时在官方提供的文档中也大量采用shell脚本来引导,需要先大致明确几个概念:
docker:
应用容器工具,可以将应用运行所需要的一些环境打包进去,方便移植。
docker-compose:
用来运行一组docker实例,在first-network中,有一个orderer和4个peer,还有一个cli,在dockker-compose-cli.yaml中配置了各实例的环境变量,它又依赖./base/peer-base.yaml和./base/docker-compose-base.yaml,后续配置过程将主要围绕这几个文件展开。
shell脚本:
byfn.sh 中包含了整个first-network的启动和测试,有兴趣可以阅读一下,启动debug调试的过程中可能会从中参考运行参数。
工具 & 环境 & 前提
系统:mac OS 。windows最好弄个虚拟机或双系统。
IDE: goland2019.2 下载地址 https://www.jetbrains.com/go/ 我用的
假设您已经调试好官方文档里的first-netwotk,下述描述到“cd fabric-samples“都是指该示例相关的路径,不是在fabric源码中。
代码拉取
采用release-1.4的代码(如果使用其他版本代码,可能目录结构有差异,但本文重在理解解决思路,可参照着探索)
# 提前需确保gopath已经配置好,go的安装配置这里不赘述 cd <gopath>/src/github.com/hyperledger/ git clone https://github.com/hyperledger/fabric.git cd fabric git checkout release-1.4 git pull
拉取完成后,用Goland -> file -> Open ->选中fabric目录打开结构如下:
image-20191218143827726.png
工作目录准备
在工程目录下创建目录
cd fabric mkdir work_dir && cd work_dir # 类似于fabric-samples目录,以下都参考fabric-samples的目录结构 mkdir bin # 用来放源码编译可执行程序 mkdir orderer # 放置orderer程序运行产生的文件 # 拷贝first-network必要的配置 cp <fabric-samples path>/config/* ./config/ cp <fabric-samples path>/first-network ./ cp -r <fabric-samples path>/chaincode ./ # 运行一下验证拷贝过来的配置是能用的 cp <fabric-samples path>/bin/* ./bin/ # 先用下载下来的bin测试,待源码编译的时候会自动将其替换掉 cd first-network ./byfn down ./byfn up # 结果打印应该提示成功,略
接下来的工作就是一步步将first-network中提供的配置移植到goland中实现源码调试。
orderer
一、Run/Debug Configuration,添加一个Go build 配置,具体如下:
name: orderer Run kind: Package Package path: <Project Dir>/work_dir/bin #最好都使用绝对路径 Output directory: <Project Dir>/work_dir/bin Working directory: <Project Dir>/work_dir/orderer
二、环境变量(还是Run/Debug Configuration)
在first-network的示例中有如下三个yaml文件:
cd fabric-samples/first-network tree # 打印结果省略其他文件 ├── docker-compose-cli.yaml └── base ├── docker-compose-base.yaml └── peer-base.yaml
这三个文件配置了orderer,peer,cli实例的环境变量,现在只关注其中orderer的部分,它的环境变量配置都在base/peer-base.yaml中,将其environment部分全拷贝出来放到一个文本文档里:
orderer-base: image: hyperledger/fabric-orderer:$IMAGE_TAG environment: - FABRIC_LOGGING_SPEC=INFO - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 - ORDERER_GENERAL_GENESISMETHOD=file - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block - ORDERER_GENERAL_LOCALMSPID=OrdererMSP - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp # enabled TLS - ORDERER_GENERAL_TLS_ENABLED=true - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1 - ORDERER_KAFKA_VERBOSE=true - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] working_dir: /opt/gopath/src/github.com/hyperledger/fabric command: orderer
docker有自己的文件目录结构,通过volumes配置映射到本地,我们要抛开docker直接在ide里运行就需要上述涉及到路径的都替换成本地路径,先找到orderer相关的volumes配置项(在base/docker-compose-base.yaml中):
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls - orderer.example.com:/var/hyperledger/production/orderer
其中,冒号左边是本地路径,右边是docker路径,对照这几项把前边的环境变量替换过来,另外注意稍微有一点改动(加上了first-network前缀,这是因为可能用脚本启动时的当前路径不一样,需要做些修正,或者也可以直接补全绝对路径):
FABRIC_LOGGING_SPEC=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] ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1 ORDERER_KAFKA_VERBOSE=true ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key ORDERER_GENERAL_CLUSTER_ROOTCAS=[../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt] FABRIC_CFG_PATH=../config/
注意最后一行,这是加上的,yaml文件中没有:
FABRIC_CFG_PATH=../config/
这是告诉程序启动的时候去./config找orderer.yaml文件(在官方文档里只在使用configtxgen生成初始数据的时候提到要配置这个环境变量,可能该工具内部又做了处理并设置进了docker容器中)。这一行如果不加会报错:
failed to parse config: Error reading configuration: Unsupported Config Type ""
复制上述配置好的环境变量,打开Run/Debug Configuration -> Environment, 点击文本框右侧按钮后粘贴进去(若直接站在文本框里需要手动用;号隔开):
image-20191218171625107.png
三、config配置修改
vi work_dir/config/orderer.yaml #找到FileLedger -> Location, 修改 Location: /var/hyperledger/production/orderer 修改为 Location: <fabric path>/work_dir/orderer
不改的话程序启动时会尝试创建/var/hyperledger/production/orderer,可能报Permission denied。
四、启动debug
1.因为一会要配合网络调试,先清理掉之前启动的网络并重新准备数据(否则可能出错):
cd work_dir/first-network ./byfn.sh down # 清理orderer的FileLedger目录,以后每次网络重置都需要做这步,./byfn.sh down脚本无法照顾到IDE启动的 # orderer rm -rf ../orderer/* ./byfn generate
2.在源码目录 fabric/orderer/main.go中 打个断点,确认debug configuration为之前设置的orderer,然后点击debug标志,编译完成后可以看到断点生效:
image-20191218173424308.png
五、配合网络调试
fabric只启动一个orderer没法调试,因为整个区块链需要多个模块共同协作,所以还需要启动first-network的其他几个orderer和模块,为了简单起见这几个模块就用docker启动,需要做些修改,在docker-compose-cli.yaml中禁掉orderer.example.com:
# docker-compose-cli.yaml ... volumes: # orderer.example.com: ... services: # orderer.example.com: # extends: # file: base/docker-compose-base.yaml # service: orderer.example.com # container_name: orderer.example.com # networks: # - byfn ...
然后需要在剩下的各容器配置中都添加orderer外部ip映射
... networks: - byfn # 注意与networks平级 extra_hosts: - "orderer.example.com:127.0.0.1" ...
最后启动这几个容器(如果对docker-compose熟悉就会知道,不熟悉可以从byfn.sh或build your fist network的手动调试说明中中找到):
cd work_dir/first-network #启动网络,加-d参数后台运行 docker-compose -f docker-compose-cli.yaml up -d
测试
现在Goland中的orderer和docker管理的其他几个模块都起来了,可以在源码中打断点调试交互过程,简单起见,选用官文build your first network中的[Create & Join Channel]来测。
先在fabric/orderer/common/server/server.go的 func (dmt *deliverMsgTracer) Recv()第一行打上断点,然后F9让程序跳过之前Main函数处的断点,等待接收消息。
然后利用cli容器发送channel创建消息:
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
可以看到程序在断点处停下来:
image-20191219111722411.png
成功!
后续其他节点的调试也可以照葫芦画瓢来做。
(完)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
CopyTranslator 9.0.0“寒渐”发布,复制即翻译的外文辅助阅读翻译解决方案
欢迎反馈关于翻译格式,翻译效果不一致的问题。 本版本更新内容丰富,请务必查看更新日志以及新的使用指南 mac版本会延迟若干天更新 更新内容 增强: 删除点按复制功能,增加了更易使用的拖拽复制功能,并对拖拽复制触发时可能导致的问题作了说明。(拖拽复制使用说明详见使用指南) 全异步化remote操作使整体性能得到明显提升,页面加载/切换速度前所未有的快 在全局快捷键之外添加了一些局部快捷键(仅当焦点在copytranslator时才能使用),可用性仍待测试 按需打包Element UI,安装包体积减小,加载速度加快 添加悬浮提示,尚未完善 #126 Electron从3.0 升级到6.0安装包变大(这是我没有料到的) 分离查词引擎与翻译引擎。 增加引擎按钮以快速切换翻译引擎并指示当前主引擎 整合不同引擎,聚合物查词引擎及化合物翻译引擎会使用所有引擎查询,并缓存不同引擎的查询结果,让你在不同引擎切换时更快。 左键单击任务栏图标以强制显示窗口,如果你突然找不着窗口,可以试下。 可选的关闭即退出,关闭即退出默认打开,如果关闭,则只能通过任务栏图标右键菜单退出程序。 增加了复制按钮,左键单击复制译...
- 下一篇
运维编排场景系列-----一键批量重置实例密码
当需要在页面上就可以实现批量选择实例,并输入实例需要重置的密码,简便化重置多台实例密码。此时使用OOS服务可以实现此功能。 前提条件 实例状态为启动中(Starting)时,无法重置实例密码 被安全控制的ECS实例的OperationLocks不能标记为"LockReason" : "security"。 模版说明: 本模版主要功能为: 获取实例 检查实例运行状态是否符合修改密码 修改密码 重启ECS实例 FormatVersion: OOS-2019-06-01 Description: en: Reset ECS instance password and reboot instance. zh-cn: 重置实例密码,并重启ECS实例。 name-en: ResetPasswordAndRebootInstance name-zh-cn: 重置实例密码及重启实例 Parameters: Targets: Type: Json AssociationProperty: Targets AssociationPropertyMetadata: ResourceType: ALIYUN:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群