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

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

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

 

1. 第一步我们的操作./byfn -m generate即利用官方提供的文件夹中的脚本byfn.sh来进行证书等一些列配置的生成。实际上是执行文件夹中的byfn脚本中的./byfn -m generate中的generateCertsreplacePrivateKeygenerateChannelArtifacts方法,利用二进制工具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 blockTwoOrgChannel用来配置我们的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.compeeer服务相关的环境变量,这点存疑。但是可以肯定的是最终启动用到了base/docker-compose-base.yaml文件。即我觉得可以这样理解docker-compose-cli.yaml中的ordererpeer服务配置只是一个壳子,真正有用的文件是base/docker-compose-base.yaml,那我们再来简单分析一下这个文件。

 

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

 

(2)cli容器

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

 

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

 

3script脚本

首先看见一进入脚本就设置了一些参数的获取包括CHANNEL_NAME等参数,并且设置了默认值。可以看见这个脚本按照顺序执行了createChanneljoinChannelupdateAnchorPeers 0updateAnchorPeers 2installChaincode 0installChaincode 2instantiateChaincode 2chaincodeQuery 0 100chaincodeInvoke 0installChaincode 3chaincodeQuery 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,在此声明并表示感谢!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值