还记得我在上一篇PutState&GetState理解文章中留下了个疑问,猜测说fabric后台有个守护进程,对chan进行监听什么的。但是只是猜测不行啊,还得从实际来证明。

怎么看呢?首先我们去找几个文件来看。我们都知道,正常启动一个fabric网络的时候,是执行一个脚本文件,把各种配置文件够给挂载进去。。。为了方便,我们就找./examples/e2e_cli下面的文件吧。

network_setup.sh文件

首先,我们都知道,为了启动这个网络,我们通常都是执行

1
./network_setup.sh up

来运行的,通过shell文件我们可以定位到启动主函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
function networkUp () {
    if [ -f "./crypto-config" ]; then
      echo "crypto-config directory already exists."
    else
      #Generate all the artifacts that includes org certs, orderer genesis block,
      # channel configuration transaction
      source generateArtifacts.sh $CH_NAME
    fi

    if [ "${IF_COUCHDB}" == "couchdb" ]; then
      CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH up -d 2>&1
    else
      CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT docker-compose -f $COMPOSE_FILE up -d 2>&1
    fi
    if [ $? -ne 0 ]; then
	echo "ERROR !!!! Unable to pull the images "
	exit 1
    fi
    docker logs -f cli
}

首先是检查crypto-config文件夹是否存在,不存在则根据输入的channel名称生成对应的证书等文件。 * 实际上,在运行之前最好删除下,要不然channel名称不匹配会出错的

具体生成的过程我们稍后再看。 fabric存储区块有两种存储格式,一种是levelDB,一种是couchDB,所以就是一个指定与否的关系。 我们发现,启动服务是这一句话

1
docker-compose -f $COMPOSE_FILE up -d

看来需要看下composefile--compose-cli.yaml文件了。

docker-compose-cli.yaml文件

这个文件与启动脚本在同一个目录下,内容挺多的,我们分开来看。 根据整体的文件结构,一共启动了ordererpeer0.org1peer1.org1peer0.org2peer1.org2cli这几个服务。 除了cli之外,其他全部都是默认继承的base下面的配置文档。我们先看cli吧。 cli中制定了container_name,所使用的镜像,一些系统环境变量,默认工作位置,启动时执行的指令,挂载的卷以及需要依赖的服务等等。 环境这块没有太多奇怪的东西

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

由于fabric是go开发的嘛,所以肯定得指定GOPATH啦,其他的是一些为了安全而使用的cert等等文件,知道存在就好了。 * 这多说一句话,这些就是刚刚那个generateArtifacts.sh文件生成的。

继续往下看执行的指令是

1
/bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'

是在这个目录下执行一个scripts.sh文件。 这个文件是通过volumes挂载进去的

1
2
3
4
5
        - /var/run/:/host/var/run/
        - ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts

可以看到就是在物理目录下的scripts文件夹。 打开之后看了下,就是执行的一个正常的client的操作,安装,查询等等操作。就不再赘述了。

docker-compose-base.yaml

好了,总算看到这个了,又一个非常大的文件,不过我们刚刚看的那几个继承的在这都有了。我们主要看两个,一个orderer,一个peer0.org1,其他的都大同小异。 首先是orderer. 为了占空,显得文章多我就都粘贴上来。 由于好多内容都一样,我们就关注几个核心的点。 一个是command,含简单,只有一句话orderer,工作位置是/opt/gopath/src/github.com/hyperledger/fabric 然后端口映射值外部7050,内部7050. 然后来看peer0.org1. 又来了一个继承的文件peer-base.yaml文件,这个地方主要做了端口映射,目录挂载等操作,没有太复杂的操作。

peer-base.yaml

这个地方我们主要就是关注commandpeer node start,工作位置是/opt/gopath/src/github.com/hyperledger/fabric/peer

总结

通过上面那么多乱七八糟的阅读,我们可以这样来说fabric的启动流程了。 首先通过启动脚本配置一些用户的自定义参数,生成需要的秘钥啦证书等文件,然后找到对应的yaml文件,按照ordererpeercli的顺序启动起来,完成。 通过这个我们就看到了fabric的启动peer node start以及orderer这两条指令,接下来就要看源码了。