建立一个fabric网络2个Orgnizations(每个Org包含2个peer节点)+1个solo ordering service步骤简要解析(以官方的fabric-sample项目为例)

注:官方脚本中为一键部署,文中已经拆解开,主要围绕部署启动的脚本byfn.sh来分析启动的过程中我们到底做了什么。

1. 第一步我们的操作./byfn -m generate即利用官方提供的文件夹中的脚本byfn.sh来进行证书等一些列配置的生成。实际上是执行文件夹中的byfn脚本中的./byfn -m generate中的generateCerts,replacePrivateKey和generateChannelArtifacts方法,利用二进制工具cryptogen读取一个crypto-config.yaml文件生成按照yaml文件中的网络拓扑安排的安全性文件(例如证书)存放在crypto-config文件夹中。

进入文件中观察会发现有两个组织的文件夹,单独存放orderer组织和peer组织涉及的安全证书等信息。利用tree命令可以观察到任意一个子文件夹中的组织结构还是很复杂的。

在生成了组织架构的证书及安全性服务之后我们的第一个方法generateCerts也就执行完了。

(注:如果执行脚本的时候报错,例如找不到cryptogen这个工具之类的错误,可以查看http://blog.csdn.net/mellymengyan/article/details/77671185这篇blog尝试寻找解决方法。)

2. 官方提供的脚本byfn中的generate这个mode其实包含了三个方法按照顺序执行分别是

可见我们已经执行完了第一个方法,随后我们来执行第二个方法replacePrivateKey,其执行的操作是替换docker-cmpose配置文件中的证书密钥的文件夹路径,然后生成新的docker-compose配置文件。其利用docker-compose-e2e-template.yaml这个官方提供的官方样本文件来进行了修改并生成了新的docker-compose-e2e.yaml文件。修改的主要内容是将官方预留的密钥的值换成我们生成的crypto-config中的实际值。在生成的文件夹crypto-config中有一个文件夹ca这个文件夹存放的是根证书和对应的私钥文件。对于ca.org1.example.com-cert.pem文件可以采用命令openssl x509 -in ca.org1.example.com-cert.pem  -noout -text来查看其内容。这个文件是一个根证书文件。另一个文件则是私钥。可以看见replacePrivateKey在脚本中是列出了该私钥的名字,然后替换了脚本中的默认变量。

在docker-compose-e2e-template.yaml这个官方提供的默认配置文件中做了挂载

将文件夹映射至docker内部,然后设置了docker的环境变量

即完成了启动docker时的证书私钥认证问题。

3. 接着我们来执行generateChannelArtifacts方法即第三个方法。该方法同样也是利用了官方提供的工具configxgen,同样也是利用了yaml配置文件,官方的配置文件叫做configtx.yaml。打开配置文件,配置文件顶部Profiles部分有两个唯一的headers。其中TwoOrgsOrderedGenesis用来配置orderer genesis block,TwoOrgChannel用来配置我们的channel。

执行完成后可以看见生成了一个文件夹channel-artifacts文件夹,其中包含了创世块,通道配置信息,和两个组织的锚节点配置信息。

4. 这三个方法执行完成后就可以利用./byfn -m up来启动我们已经配置好的fabric网络实际上是进入了我们最后的启动fabric网络的步骤./byfn -m up执行脚本中的命令,其实际执行的是脚本中的方法networkUp。那我们来详细的来分析一下这个方法。大家可以看见这个方法中是利用docker-compose来启动docker服务来启动整个网络的。

其实际设置了环境变量来指定了docker-compose启动时候读取的文件即docker-compose-cli.yaml。可以看见脚本中还设置了别的环境变量例如CHANNEL_NAME="mychannel"。

在docker-compose-cli.yaml文件中我们可以看见这个配置文件中有一个orderer服务,四个peer服务分别在两个组织中,每个组织各两个peer节点,还有一个cli容器。我们一个一个简单分析一波:

(1)orderer服务和peer服务

可以很清楚的看见extends标签,其作用是基于已有的服务进行扩展。据说其会继承orderer.example.com和peeer服务相关的环境变量,这点存疑。但是可以肯定的是最终启动用到了base/docker-compose-base.yaml文件。即我觉得可以这样理解docker-compose-cli.yaml中的orderer和peer服务配置只是一个壳子,真正有用的文件是base/docker-compose-base.yaml,那我们再来简单分析一下这个文件。

可以看见大量的配置信息都写在了这里。包括启动服务用到的docker镜像,环境变量,启动docker之后的执行命令,由服务器到docker内部的文件映射和端口映射,也很完整,正好是一个orderer服务和四个peer服务。那这样orderer和peer服务启动的过程基本就结束了。然后我们再看最后一个cli容器的启动。

(2)cli容器

这个容器我们可以把它看作客户端或者sdk,这里的概念可能理解的不太对。其基本作用是和链码交互,完成操作动作。

大家可以看见这个cli没什么不同的,重要的是其需要依赖于其余的几个service,cli这个容器要在最后的时候启动。其次很重要的是cli容器启动之后的创建通道等一些列操作,这个操作是利用command标签来完成的。Command标签中的命令是执行./scripts文件夹中的一个script.sh这个脚本,然后就将cli这个容器sleep了。那么script这个脚本就变成了我们的主角了,下面我们来分析一下这个脚本。

(3)script脚本

首先看见一进入脚本就设置了一些参数的获取包括CHANNEL_NAME等参数,并且设置了默认值。可以看见这个脚本按照顺序执行了createChannel,joinChannel,updateAnchorPeers 0,updateAnchorPeers 2,installChaincode 0,installChaincode 2,instantiateChaincode 2,chaincodeQuery 0 100,chaincodeInvoke 0,installChaincode 3,chaincodeQuery 3 90等一系列方法,最后完成之后输出了end的标志,了解了大致的步骤我们来分析一下执行的函数。

createChannel函数:

首先是设置全局变量,根据组织一和组织二的区别来设置环境变量的值。根据CORE_PEER_TLS_ENABLED这个环境变量的值来执行了一条命令,peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx >&log.txt即为没有使用tls通信的方式创建了一个channel,可以看见在启动的时候设置了环境变量为true所以我们启动的时候实际上是执行了下面的那条命令peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt可以看见启动的时候用到了channel.tx这个交易文件并且是验证了msp中的ca证书。该条命令执行完成后就成功的创建了channel。

joinChannel函数:

其中同样包含了根据变量参数来设置环境变量的过程,不过最重要的是调用了joinWithRetry这个方法,而这个方法中调用了这条peer channel join -b $CHANNEL_NAME.block  >&log.txt

的命令来完成加入通道的操作。可以看见是通过一个for循环来区分了组织一和组织二的一共四个节点的。

updateAnchorPeers函数:

同样是通过传入参数来区分组织一和组织二,然后选取不同的tx文件来完成锚节点的更新的。

installChaincode函数:

可以看见这个函数是在安装chaincode利用了peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 >&log.txt这条命令将chaincode_example02这个chaincode成功的安装到了peer上面。

instantiateChaincode函数:

这个函数完成的动作是chaincode的实例化利用了peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')" >&log.txt这条命令可以看见这条命令中间调用了初始化方法的同时指定了背书的策略。

剩下的几个函数就是在查询账户a的余额,然后转账,然后再次查询的操作,都是调用了chaincode来完成的,可以理解为chain code的测试案例。

到此为止,整个网络就启动并且测试完毕了。

综上所述,基本完成了fabric网络的各个步骤的简单分析,才疏学浅,有很多细节的地方可能理解的很不准确,本篇文章主要是记录和整理网络的启动过程,如果有任何问题,欢迎大家指出,我也借此机会多学习学习。文中部分内容及链接引用大神们的blog,在此声明并表示感谢!

关于官方的fabric-sample项目启动案例简单分析相关推荐

  1. mini-uboot 启动过程简单分析

    单片机有最小系统,所谓最小系统,就是单片机能正常工作所需要的最少外设.对于Uboot来说,同样有个最小系统,因为Uboot最主要的功能就是引导内核.下面我们通过一个简单的Mini-Uboot来分析Ub ...

  2. Atmel SAMA5D3 U-Boot 启动流程简单分析

    处理器              ATSAMA5D3x 硬件平台          SAMA5D3x-EK u-boot 版本     u-boot-2012.10 先阅读链接脚本 arch/arm/ ...

  3. springboot项目启动报错-案例情景介绍

    文章目录 摘要 情况1:Nacos报错 情况2:IllegalStateException: Incompatible fallbackFactory instance 情况3:idea编译java文 ...

  4. Hyperledger Fabric的test-network启动过程Bash源码详解

    前言 在基于Debian搭建Hyperledger Fabric 2.4开发环境及运行简单案例中,我们已经完成了Fabric 2.4的环境搭建及fabric-samples/test-network官 ...

  5. 开源项目综合案例https://blog.csdn.net/m0_37700275/article/details/78783049

    开源项目综合案例 置顶 2017年12月12日 16:16:17 杨充 阅读数:473 版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/m0_37700275 ...

  6. python项目开发案例-Python项目开发案例集锦 PDF 全彩超清版

    给大家带来的一篇关于Python案例相关的电子书资源,介绍了关于Python.项目开发.Python案例方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小99.1 MB,明日科技编写,目前 ...

  7. Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源

    在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资 ...

  8. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

  9. Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源

    Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源 在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spri ...

最新文章

  1. linux 统计日志数量总,shell统计日志中时间段内匹配的数量的方法
  2. java用什么编译器_用大白话告诉你,Java到底是什么
  3. 再度冲刺“农村电商第一股”,汇通达还有什么法宝?
  4. python抢票_50 个加速包都抢不到车票,还不如这个 Python 抢票神器!
  5. Python3 From Zero——{最初的意识:007~函数}
  6. 【转】Castle Windsor之组件注册
  7. Java 8:长期支持的堡垒
  8. Spring整合Quartz定时任务 在集群、分布式系统中的应用
  9. 微软发布Silverlight 4新版并更新Silverlight Tools和SDK
  10. 书店智能机器人编程与拼装体验课堂_让人工智能与编程教育走进初中教学课堂...
  11. 科学道德与学风-2021雨课堂答案-第1章
  12. iOS-OC-集成PayPal支付方式
  13. 徕卡 sl android app,相机入魔 徕卡SL DPReview测评结论
  14. sobol灵敏度分析matlab_灵敏度分析_使用MATLAB编写.doc
  15. OpenDrive地图格式解析——案例分析
  16. 2020版KALI安装教程
  17. BUUCTF-web [极客大挑战 2019]PHP1 之 反序列化漏洞
  18. OpenCV4 Viz模块使用学习(一)
  19. 机器学习(上)线性回归、多项式回归、标准差、百分位数、数据分布、散点图
  20. 使用cocos2d-x实现一款类似《Flappy Bird》的游戏

热门文章

  1. 优秀课件笔记旅游资源和旅游地评价 Evaluation of Tourism Resources 4
  2. 共享打印机给同局域网下的其他计算机设置方法
  3. peoplesoft SQR language
  4. Unittest_skipe
  5. 1.19(对象类型判断、复制、in、遍历;深拷贝与浅拷贝;字符串的遍历接口、模板字符串、字符串扩展方法)
  6. 你越牛逼,感情就越纯粹
  7. 电源架构--集中式电源架构/分布式电源架构
  8. UE4打包后视频或者其他资源未打包进去
  9. Python——实现Windows桌面壁纸和bing背景的同步
  10. 微信小程序-OCR信息识别