Hyperledger-Fabric1.0 开发环境搭建

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=<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 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。笔者就曾因为更新了chaincode,但在启动网路时忘记将原来chaincode名字用现在的chaincode名字替换而造成错误。


版权所有,转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容