上个月刚入职一家公司从事区块链研发工作,选型采用Hyperledger Fabric作为开发平台。团队的小组成员全部采用的是在VirtualBox上面安装桌面版的Ubuntu 16.04虚拟机,开发工具JetBrains GoLand也就直接在桌面版的虚拟机里面安装。而我因为之前比较习惯使用Vagrant + VirtualBox的方式快速加载我定制版的Ubuntu镜像从而创建Linux开发环境,这样一来的弊端就是我只能通过命令行来进行一切操作而没有桌面可操作,所以我的整个开发IDE就在本机的windows上进行。
我们的Fabric网络是采用的Docker方式启动,作为自己本地的测试环境自然就将网络搭建在Ubuntu虚拟机里面,前期由其它小组成员负责针对Go语言版本的SDK(Hyperledger子项目fabric-sdk-go)进行封装调用并利用Beego作为服务器将相应的API暴露出来,而我负责的便是将他们暴露出来的API进一步封装为标准Go版的SDK,所谓的标准就是对调用者而言无感是调用的区块链。这个时候问题就出现了,在我写SDK的过程中用单元测试对他们的API发起Http请求调用时一脸懵逼,观察Beego服务器打印的日志信息少的可怜几乎没有,以前从来不习惯用断点调试的我这个时候首先想到的便是希望能够在他们的API服务中加入适当的断点以便我这边的SDK发起请求时能够一步步跟踪到底,然而他们的API服务Beego也是部署在Ubuntu虚拟机中,对于他们自己开发来说反正开发工具IDE也在桌面版的Ubuntu中所以天然在IDE中启动断点调试没有丁点儿问题,那我的IDE在本地windows上,所以我需要在我的IDE中Debug运行他们的API服务,这个时候麻烦来了,API服务因为封装了对fabric-sdk-go的调用,也就意味着我需要做一些调整以便能够让他们的API服务能够从我的本地windows连接到虚拟机里面的Fabric网络,只有这样才可以完成从我的SDK发起Http请求到他们的API服务,再由API去通过fabric-sdk-go发起对Ubuntu虚拟机上Fabric网络的操作这样一个完整的流程。
说下我是如何让本地windows的API服务连接到Ubuntu虚拟机里面的Fabric网络的。其实连接Fabric网络是他们API所封装的fabric-sdk-go,那么最关键的配置无疑便是config_fabric.yaml配置文件。在那个配置文件中有一系列要访问Fabric网络所需的crypto,msp,tls等物理路径,所以自然需要将其中${GOPATH}全部替换为本地windows的GOPATH绝对路径。本以为这样就可以完事大吉,可没想到这个时候无论我怎样调用,他们的API始终在初始化fabric sdk的时候报错,无奈只好在初始化的时候打断点往进跟,跟的具体细节(坑也不少)就不展示了,关键部分如下图。
终于明白原来它从fabric_config.yaml中读取到systemCertPool属性的值应该为true,以致于调用了x509.SystemCertPool()方法,最终由于runtime.GOOS == "windows",自然就抛出"crypto/x509: system root pool is not available on Windows"这样的异常信息从而初始化SDK失败。
查看fabric_config.yaml配置文件,果然systemCertPool为true,如下图:
到这里本以为就算搞定了,便从我的SDK发起了一个创建Channel的单元测试,结果虽然没报错但是Ubuntu虚拟机上的Fabric网络后台一行日志都没打印,很显然Fabric网络的创建通道命令并没有被API端的fabric-sdk-go所触发,可是初始化已经成功了,只能再次在创建通道部分进行断点跟踪,发现在创建通道时候需要传递的通道配置文件txFile文件还是之前在Ubuntu虚拟机下的绝对路径,在SDK单元测试创建通道功能的时候将传递的txFile设为本地windows上的tx文件绝对路径,再次运行创建通道单元测试搞定!自此windows跟Ubuntu虚拟机的Fabric网络正式打通,以后便可以在windows上利用IDE以Debug模式启动他们的API服务,我的SDK发起调用时便可以轻松利用断点调试来跟踪底层执行逻辑。
作为一名纯软件工程专业毕业的程序猿,以前总觉得自己的逻辑思维能力够强,靠想象来感觉代码的执行流程,靠感觉来判断问题应该出在哪里,通过这次的经历深刻意识到断点调试的重要性,从今往后遇到bug一定第一时间用debug来执行调试,相信一定会节约不少宝贵的时间从而提高工作效率~
Windows下fabric sdk连接Linux上fabric网络的调试过程的更多相关文章
-
在 Windows 下远程桌面连接 Linux - VNC 篇
VNC是由AT&T试验室开发,是一款优秀的远程控制工具软件,后来以GPL授权的形式开源.经过几年的发展,现在的VNC已经不单指某个软件,而是一类软件的通称.下面介绍Linux下常用的两个VNC ...
-
Windows下Navicat远程连接Linux下MySQL服务器错误1130
今天用Navicat在Windows下连接Linux服务器上的MySQL,显示出错误1130. 当然这是在修改了MySQL的配置文件my.cnf的前提下允许远程访问的基础上的,如果没有修改my.cnf ...
-
windows下Eclipse远程连接linux hadoop远程调试 经验(一)
环境 Windows 7 64bit JDK 1.6.0_45 (i586) JDK 1.7.0_51 (i586) Eclipse Kepler Eclipse -plugin-1.2.1.ja ...
-
在 Windows 下远程桌面连接 Linux - XManager 篇
XManager是一个简单易用的高性能的运行在Windows平台上的X-Server软件,而Gnome和KDE就是X-Client,Linux下的X-Server则为Xorg.它能把远端Unix/Li ...
-
在Windows下使用Navicat连接Linux下的MySql
Linux下的Mysql安装可以参考菜鸟教程:https://www.runoob.com/mysql/mysql-install.html 安装完成后你会发现用Navicat链接MySql会失败,这 ...
-
[方法] Windows 下SSH远程连接Linux
考虑到Linux服务器自带SSH服务,并且SSH服务开机启动. 因此,方法如下: 安装putty 输入Linux服务器IP地址 此外,如果想远程重启Linux服务器,在命令行中输入reboot即可.
-
Windows下使用PSCP从Linux下载或上传文件
1. 先下载putty包,然后解压 https://the.earth.li/~sgtatham/putty/latest/w64/putty.zip 2. 下载Linux文件到当前目录 PSCP.e ...
-
sqlyog连接Linux上的mysql报错误号码2013,错误号码1130的解决办法
sqlyog连接Linux上的mysql报错误号码2013,错误号码1130的解决办法 1.报错误号码2013,可能是端口号不是默认的3306,需要改成对应的,检查命令是: [root@host et ...
-
Dart SDK在Linux上的下载及配置
Dart SDK在Linux上的下载及配置 首先建议想要学习Dart的小伙伴选择Linux开发环境比较好,具体原因就不多说了.如果想要尝试在Window或Mac上安装Dart SDK的话可以参考Ins ...
随机推荐
-
为什么获取的System.Web.HttpContext.Current值为null,HttpContext对象为null时如何获取程序(站点)的根目录
ASP.NET提供了静态属性System.Web.HttpContext.Current,因此获取HttpContext对象就非常方便了.也正是因为这个原因,所以我们经常能见到直接访问System.W ...
-
iOS音频AAC视频H264编码 推流最佳方案
iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1 功能概况 * 实现音视频的数据的采集 * 实现音视频数据的编码,视频编码成 ...
-
SPSS数据分析—非参数检验
统计学的假设检验可以分为参数检验和非参数检验,参数检验都是根据一些假设条件推算而来,当这些假设条件无法满足的时候,参数检验的效能会大打折扣,甚至出现错误的结果,而非参数检验通常是没有假设条件的,因此应 ...
-
内存修改console
#include <stdio.h> #include <windows.h> #include <winuser.h> int main() { int cur_ ...
-
C#Graphics画图
public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { G ...
-
java IO回想小结
java IO原理 IO流用来处理设备之间的传输数据 输入(input):读取外部数据(磁盘.等存储设备)到程序() (内存)中 输出(output):将程序(内存)数据输出到磁盘等存储设备 java ...
-
Installutil.exe的位置和路径
安装程序工具使您得以通过在执行指定程序集中的安装程序组件来安装和卸载服务器资源.此工具与 System.Configuration.Install命名空间中的类一起工作.安转的位置和路径在:C:\WI ...
-
高性能队列Disruptor系列2--浅析Disruptor
1. Disruptor简单介绍 Disruptor是一个由LMAX开源的Java并发框架.LMAX是一种新型零售金融交易平台,这个系统是建立在 JVM 平台上,核心是一个业务逻辑处理器,它能够在一个 ...
-
react 高阶组件的 理解和应用
高阶组件是什么东西 简单的理解是:一个包装了另一个基础组件的组件.(相对高阶组件来说,我习惯把被包装的组件称为基础组件) 注意:这里说的是包装,可以理解成包裹和组装: 具体的是高阶组件的两种形式吧: ...
-
【tomcat启动失败问题】Unable to start embedded Tomcat
启动spring boot 项目后抛出如下异常: org.springframework.context.ApplicationContextException: Unable to start em ...