Hyperledger Fabric 1.0 上手体验

Hyperledger Fabric 1.0 上手体验_第1张图片
blockchain.jpg

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-peerpeer基础镜像,在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=/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 peercrypto-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了解更多详情

你可能感兴趣的:(Hyperledger Fabric 1.0 上手体验)