Fabric 是如何运行的?
docker container!Fabric把什么都做成了docker 镜像,无论是系统模块还是智能合约(Fabric里叫chaincode)都是作为一个docker容器来运行的。比如:
- 系统模块
Fabric1.0提供了9组系统模块,它们对应docker镜像名称分别是:
hyperledger/fabric-tools
hyperledger/fabric-couchdb
hyperledger/fabric-kafka
hyperledger/fabric-zookeeper
hyperledger/fabric-orderer
hyperledger/fabric-peer
hyperledger/fabric-javaenv
hyperledger/fabric-ccenv
hyperledger/fabric-ca
其中,fabric-ca
负责Fabric MemberShip
的管理以及相关证书的管理,每一个新加入channel
的成员都需要使用ca
模块备案;fabric-peer
为peer
基础镜像,在channel
创建时,一般会有多个peer
,都是在此镜像基础上进行构建。更多关于Fabric images
的介绍可以浏览Fabric官方Docker Hub页面。
- chaincode
我们知道以太坊为了运行智能合约专门开发了EVM,而Fabric直接使用了Docker 容器技术。要运行一个Fabric chaincode(这里指通过命令行而非SDK)需要使用peer chaincode install
命令将chaincode安装到指定peer(也是一个运行的容器)然后再使用peer chaincode instantiate
实例化chaincode。最后便可以使用peer chaincode invoke
命令调用chaincode里指定函数。
下载Fabric镜像和命令行工具
上文提到Fabric是基于docker容器构建的,所以首先需要执行下面的命令下载Fabric docker镜像和对应平台下的命令行工具(在这之前你需要在你的机器上安装docker、docker-compose、go,详细信息请浏览这里获取)。
curl -sSL https://goo.gl/iX9dek | bash
下载完成后我们可以发现当前目录多了一个bin目录,执行ls bin/
将看到下面几个可执行文件:
configtxgen configtxlator cryptogen get-byfn.sh get-docker-images.sh orderer peer
你可以将bin目录路径加入PATH:
export PATH=<path to download location>/bin:$PATH
上面的命令也会自动下载所有fabric docker镜像,下载Fabric docker镜像会花费很长的时间,下载完成后执行docker images | grep x86_64-1.0.0
将看到如下输出:
hyperledger/fabric-tools x86_64-1.0.0 0403fd1c72c7 2 weeks ago 1.32GB
hyperledger/fabric-couchdb x86_64-1.0.0 2fbdbf3ab945 2 weeks ago 1.48GB
hyperledger/fabric-kafka x86_64-1.0.0 dbd3f94de4b5 2 weeks ago 1.3GB
hyperledger/fabric-zookeeper x86_64-1.0.0 e545dbf1c6af 2 weeks ago 1.31GB
hyperledger/fabric-orderer x86_64-1.0.0 e317ca5638ba 2 weeks ago 179MB
hyperledger/fabric-peer x86_64-1.0.0 6830dcd7b9b5 2 weeks ago 182MB
hyperledger/fabric-javaenv x86_64-1.0.0 8948126f0935 2 weeks ago 1.42GB
hyperledger/fabric-ccenv x86_64-1.0.0 7182c260a5ca 2 weeks ago 1.29GB
hyperledger/fabric-ca x86_64-1.0.0 a15c59ecda5b 2 weeks ago 238MB
下载Fabric sample
Fabric sample提供了几个官方demo用以测试,将sample code从github上clone到指定目录,执行
git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples
启动Fabric运行环境
我们以first-network
这个例程为例讲解:
first-network为我们提供了一个基本的Fabric运行环境。该网络内包含一个channel,channel下有一个Orderer Org和两个Peer Org,分别为Org1和Org2。每个Peer Org包含两个peer节点分别为peer0和peer1。同时会运行位于fabric-samples/chaincode/chaincode_example02目录下的chaincode,该chaincode在账本上新建了两个账户a和b。然后可以调用chaincode提供的接口在两者之间进行转账查询等操作。
如果你对Fabric的peer、org、channel这些概念不是很清楚,可以参考我写的这篇文章:《Hyperledger-关于Fabric的peer、org 和 channel》。
进入first-network
目录,可以看到目录下有一些列的docker-compose 文件和几个脚本文件。其中 configtx.yaml
文件主要用于生成创始区块genesis.block、channel配置文件channel.tx
、以及每个Org的anchor peer
。crypto-config.yaml
主要用于生成每个Org需要的证书。
脚本byfn.sh
已经为我们做了所有需要我们手动做的事:生成证书、启动网络、关闭网络等。
- 生成证书和channel相关配置文件。
Fabric提供了严格的权限控制机制,大到新节点加入channel小到执行一次chaincode调用,都要求持有正确的凭证。执行以下脚本生成对应证书和配置文件:
./byfn.sh -m generate
执行ls crypto-config
查看生成的相关凭证:
ordererOrganizations peerOrganizations
执行ls channel-artifacts/
查看生成的相关配置文件:
channel.tx genesis.block Org1MSPanchors.tx Org2MSPanchors.tx
- 启动Fabric运行网路。
执行以下脚本启动Fabric网络:(其中byfn.sh
脚本会使用docker-compose
命令启动docker-compose-cli.yaml
文件里配置的docker网络环境,然后在所有docker容器运行起来后,该文件会执行位于scripts
目录下的script.sh
脚本来执行默认的chaincode。)
./byfn.sh -m up
这时,通过docker ps
可以看到Fabric网络运行所需容器已经全部启动:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d871fde1609f hyperledger/fabric-ccenv:x86_64-1.0.0 "/bin/sh -c 'GOPAT..." 15 seconds ago Up 14 seconds heuristic_kalam
a9f56f9ab824 dev-peer0.org2.example.com-mycc-1.0 "chaincode -peer.a..." 19 seconds ago Up 18 seconds dev-peer0.org2.example.com-mycc-1.0
eb3635624da2 hyperledger/fabric-tools "/bin/bash -c './s..." About a minute ago Up About a minute cli
9fc0b67c56bc hyperledger/fabric-peer "peer node start" About a minute ago Up About a minute 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
5a03fc5c3a8e hyperledger/fabric-peer "peer node start" About a minute ago Up About a minute 0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp peer1.org2.example.com
887fc33305e3 hyperledger/fabric-orderer "orderer" About a minute ago Up About a minute 0.0.0.0:7050->7050/tcp orderer.example.com
28b188910dae hyperledger/fabric-peer "peer node start" About a minute ago Up About a minute 0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp peer1.org1.example.com
3c3877448909 hyperledger/fabric-peer "peer node start" About a minute ago Up About a minute 0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp peer0.org2.example.com
我们可以看到除了peer节点和orderer节点容器,还有一个名为dev-peer0.org2.example.com-mycc-1.0
的容器,这就是Fabric为我们生成的chaincode的运行容器;还有一个名为cli
的容器,它扮演者一个Fabric Client
的角色,我们可以进入此容器通过命令行执行chaincode调用。
执行chaincode
scripts/script.sh
脚本已经对chaincode进行了install和instantiate,并且已经执行了一些列转账和查询操作。现在执行以下命令进入cli
容器:
docker exec -it cli bash
可以看到我们当前位于的目录/opt/gopath/src/github.com/hyperledger/fabric/peer
。其中该目录下的所有文件和文件夹都是通过在docker-compose-cli.yaml里配置volumes
挂载的本地文件夹:
volumes:
- /var/run/:/host/var/run/
- ./../chaincode/:/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
下面我们可以进行几个简单的操作:
- 查看当前peer节点已经加入了到了哪些channel,执行:
peer channel list
你将看到如下返回信息(显示该peer节点加入的channel为:mychannel
):
.........
2017-07-29 11:55:46.180 UTC [channelCmd] list -> INFO 006 Channels peers has joined to:
2017-07-29 11:55:46.180 UTC [channelCmd] list -> INFO 007 mychannel
2017-07-29 11:55:46.180 UTC [main] main -> INFO 008 Exiting.....
- 查询账户
a
的余额我们可以执行:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
你将看到如下返回信息(显示账户a
当前余额为90
):
..........
Query Result: 90
2017-07-29 12:00:48.055 UTC [main] main -> INFO 007 Exiting.....
到这里Fabric1.0的开发环境已经搭建完成,并且你已经知道如何通过进入cli
容器来进行chaincode的调用。查看这里可以获取更多关于first-network
的介绍以及Fabric的运行原理。
注意事项
我们已经了解到,Fabric将我们的chaincode也一样做成了Docker image,所以当我们废弃一个chaincode时,不仅需要kill掉chaincode对应的容器,还需要删除对应的chaincode image。
版权所有,转载请注明出处。
链萌区块链致力于打造领先的商业区块链业务支撑系统。链萌区块链将业务逻辑模块化,比如提供数字资产融通、供应链溯源等业务场景的合约模板和操作接口。用户可以控制台在线快速搭建并部署自己的区块链业务网络。
访问https://nilmo.org了解更多详情