简述
本文主要内容是使用docker镜像编译Fabric源码,并使用编译生成的程序构建一个只有1个Orderer、1个Peer的简单网络,以此作为后续学习的基础。
本文代码使用fabric v1.0.4、docker镜像是yeasy/hyperledger-fabric:1.0.4,我们可以从 Docker Hub上看到该镜像的信息,基于golang镜像构建,给我们安装好了编译Fabric的环境依赖、gotools等,可以给我们省不少事情。
搭建编译环境、并编译
下载Fabric源码
第一步是下载我们将要进行编译的Fabric源码。在这里说来真是觉得Fabric文档写的很详细。基本上根据文档来都能有所收获。废话少说我们通过以下命令下载源码,并将代码版本切到1.0.4
~$:git clone https://github.com/hyperledger/fabric.git
~$:cd fabric
~/fabric$:git tag
~/fabric$:git checkout v1.0.4
下载yeasy/hyperledger-fabric:1.0.4镜像
这一步没什么说的,需要强调的一点是一定要使用国内的镜像站(如阿里镜像),不然的话镜像下载超慢,你可能在这一步就直接放弃了。
docker pull yeasy/hyperledger-fabric:1.0.4
编译Fabric源代码
事实上在yeasy/hyperledger-fabric镜像当中已经给我们装好了Fabric了(在/go路径下),但我们不直接使用它提供的,而是使用我们在上边下载好的源文件编译重新生成并安装。具体步骤如下:
首先我们需要一个docker-compose配置文件,具体文件内容如下:
version: '2'
services:
compile:
container_name: compile
image: yeasy/hyperledger-fabric:1.0.4
command: /bin/bash -c 'sleep 6000000'
working_dir: /go/src/github.com/hyperledger/fabric
volumes:
- ~/bin:/go/bin
- ~/fabric:/go/src/github.com/hyperledger/fabric
我们将该文件命名为docker-compose-compile.yaml
并将其放在~/
目录下。
启动docker镜像
~$:docker-compose -f ~/docker-compose-compile.yaml up -d
进入docker镜像并编译(以编译orderer模块为例)
~$:docker exec -it compile bash
#进入docker镜像交互界面后
root@dbb634aa44a5:/go/src/github.com/hyperledger/fabric# cd orderer
root@dbb634aa44a5:/go/src/github.com/hyperledger/fabric# go build
root@dbb634aa44a5:/go/src/github.com/hyperledger/fabric# go install
以上步骤成功的话你应该可以在镜像的/go/bin
目录下看到新生成的orderer可执行程序,并且在本机~/bin
目录下也可以看到编译生成的orderer
文件,此外我们还需要生成peer
模块,进入该peer目录go build
,go install
即可
以上方法主要是利用了docker数据卷的功能,我们在本地修改代码后,镜像当中可以立即看到被修改内容,只需要在镜像中重新编译就可以使修改后的代码生效。
搭建简单测试网络
生成配置文件
接下来我们搭建一个仅有一个Orderer和一个Peer的网络。
首先们们需要编译生成两个工具:cryptogen
生成加密证书,configtxgen
生成交易配置(详情请查看官方文档)。
这两个工具在镜像中的目录分别为/go/src/github.com/hyperledger/fabric/common/tools/cryptogen
,/go/src/github.com/hyperledger/fabric/common/configtx/tool/configtxgen
,分别进入其中执行go build
,go install
即可在镜像的/go/bin
目录(对应本机的~/bin
目录)下生成相应的可执行文件。
接下来我们需要准备两个配置文件。
先新建一个目录用于保存我们所有的配置文件
~$:mkdir mynet
~$:cd mynet
在mynet
目录下新建crypto-config.yaml
这是一个生成机构加密证书的配置文件,具体内容如下
OrdererOrgs:
- Name: Orderer
Domain: orderer.com
Specs:
- Hostname: orderer0
PeerOrgs:
- Name: Org1
Domain: peer.com
Template:
Count: 1
Users:
Count: 1
我们可以看到其内容根据字面意思理解就是一个Orderer机构,一个Peer机构,Peer机构里有一个节点(Template.Count:1) 一个用户(Users.Count:1)
我们可以使用~/bin/cryptogen
工具来生成证书如下:
~/mynet$:~/bin/cryptogen generate --config=./crypto-config.yaml
peer.com
在当前目录下可以看到生成了一个crypto-config
文件夹,里面包含两个文件夹分别是ordererOrganizations, peerOrganizations
接下来我们需要使用configtxgen
生成交易的配置。需要一个配置文件configtx.yaml
内容如下
Profiles:
OneOrgsOrdererGenesis:
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Consortiums:
SampleConsortium:
Organizations:
- *Org1
OneOrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
Organizations:
- &OrdererOrg
Name: OrdererOrg
ID: OrdererMSP
MSPDir: crypto-config/ordererOrganizations/orderer.com/msp
- &Org1
Name: Org1MSP
ID: Org1MSP
MSPDir: crypto-config/peerOrganizations/peer.com/msp
AnchorPeers:
- Host: peer0.peer.com
Port: 7051
Orderer: &OrdererDefaults
OrdererType: solo
Addresses:
- orderer0.orderer.com:7050
BatchTimeout: 2s
BatchSize:
MaxMessageCount: 10
AbsoluteMaxBytes: 99 MB
PreferredMaxBytes: 512 KB
Kafka:
Brokers:
- 127.0.0.1:9092
Organizations:
Application: &ApplicationDefaults
Organizations:
建议查看一下官方文档。
执行如下命令
~/mynet$:export FABRIC_CFG_PATH=$PWD
~/mynet$:mkdir channel-artifacts
~/mynet$:~/bin/configtxgen -profile OneOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block #产生创世块
~/mynet$:export CHANNEL_NAME=mychannel
~/mynet$:~/bin/configtxgen -profile OneOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME #产生channel配置
~/mynet$:~/bin/configtxgen -profile OneOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP #机构1 AnchorPeer配置
成功执行以上命令后会在~/mynet/channel-artifacts
目录下生成以下三个文件
channel.tx
genesis.block
Org1MSPanchors.tx
启动Orderer节点
为了更深入的学习我们分别启动Orderer节点和Peer节点,首先是Orderer ,我们需要准备一个docker-compose的配置文件
内容如下
version: '2'
networks:
my_net:
services:
orderer0.orderer.com:
container_name: orderer0.orderer.com
image: yeasy/hyperledger-fabric:1.0.4
environment:
- ORDERER_GENERAL_LOGLEVEL=debug
- ORDERER_GENERAL_LISTENADDRESS=0.0