Author

Topic: Hyperledger Fabric 1.0最简区块链系统搭建与智能合约示例 (Read 89 times)

member
Activity: 70
Merit: 10
学过编程的人都知道,几乎任何编程语言的第一次上机实战都是编写一个hello-world程序,这样做是为了能够快速理解使用这门编程语言进行开发的步骤流程,以及代码运行方式,例如:编辑代码,编译代码,连接模块,装载程序,生成操作系统进程,开始运行并输出“hello, world”,一步步操作下来,就能对该门语言有初步的、大局面的认识。学习Hyperledger
Fabric 1.0也一样,先搭建一个极其简单的区块链系统,部署几个智能合约,尝试运行一次,这样有助于快速建立对Fabric的整体认识,在心中树立一个全局的架构和流程雏形。官网给出的例子和文档很不错,但是篇幅比较长,有的对方不够精简,有的地方描述的不够,因此我在本文总结一下自己的学习经验,给出一个五脏俱全的小麻雀模型:在同一台虚拟机(VMware)的同一个OS环境下(CentOS7),同时运行Fabric的三类节点:Client,Peer,Orderer,并部署用Go和Java语言编写的示例智能合约链码,发起交易执行链码,并查询合约运行结果。对于Client,并没有独立的APP与之对应,是用Peer的子命令模拟的。

?

在进行本文的操作步骤之前,首选要了解Fabric的基本架构设计,并准备好Fabric源码和编译环境,Docker等等,这些准备工作可以参考官网和我之前写的《Hyperledger
Fabric 1.0架构浅析》以及《Hyperledger Fabric 1.0源码编译—解决网络连接问题》,在此不再赘述。

?

本文描述的示例是Fabric项目自带的,许多数字证书相关的操作已经准备好了,并包含在特定文件目录里了,如果我们从零开始搭建整个区块链系统,必然要涉及成员接入控制、注册证书、交易证书、以及Fabric-CA等内容,待我进一步学习、分析之后,再写一篇文章简述之。

?

先进入到fabric源码目录,利用Makefile生成可执行文件,

make configtxgen ,生成configtxgen可执行文件;

make native,生成peer和orderer可执行文件;

make docker,生成各类Docker镜像文件,因为后续要生成Go智能合约镜像,还要用到Java镜像环境运行Java智能合约。智能合约代码是fabric源码自带的典型示例,就是把一个账户的值减少X,同时把另一个账户的值增加X,这是一个典型的转账操作。

?

可以用ls ./build/bin/ 看一下这些可执行文件有没有生成:

total 68832

drwxr-xr-x 2 root root?Huh??
65 Apr 20 23:43 .

drwxr-xr-x 5 root root?Huh
4096 Apr 17 22:23 ..

-rwxr-xr-x 1 root root 15389704 Apr 17 19:53 chaintool

-rwxr-xr-x 1 root root 13540941 Apr 20 23:34 configtxgen

-rwxr-xr-x 1 root root 19206088 Apr 20 23:43 orderer

-rwxr-xr-x 1 root root 22337864 Apr 20 23:43 peer

?

用docker images 看一下智能合约依赖的各类镜像有没有生成:

docker images | grep hyperledger | awk '{print $1;}' | uniq

执行上面的那个文本过滤器后,应该能看到这些镜像文件相关的输出内容:

hyperledger/fabric-couchdb

hyperledger/fabric-kafka

hyperledger/fabric-zookeeper

hyperledger/fabric-testenv

hyperledger/fabric-buildenv

hyperledger/fabric-orderer

hyperledger/fabric-peer

hyperledger/fabric-javaenv

hyperledger/fabric-ccenv

hyperledger/fabric-baseimage

hyperledger/fabric-baseos

?

现在开始执行具体的操作步骤:

?

1、生成创世区块

进入到fabric源码目录,似乎只能在这个目录下执行以下操作,因为尝试建立了一个mytest子目录,执行
../build/bin/configtxgen -profile SampleSingleMSPSolo
-outputBlock orderer.block, 结果报错,同时也要注意一下Linux操作系统环境下是否已经存在/var/hyperledger目录,若存在,需要将其删除,(执行目录删除操作风险大,最好分步骤执行,小心误删除上级目录)。

cd /var

rm –rf hyperledger

cd $GOPATH/src/github.com/hyperledger/fabric

./build/bin/configtxgen -profile SampleSingleMSPSolo
-outputBlock orderer.block

?

输出如下信息:

2017/04/23 23:06:35 Loading configuration

2017/04/23 23:06:35 Looking for configtx.yaml in:
/opt/gopath/src/github.com/hyperledger/fabric/common/configtx/tool

2017/04/23 23:06:35 Found configtx.yaml there

2017/04/23 23:06:35 Checking for MSPDir at: .

2017/04/23 23:06:35 Checking for MSPDir at: .

2017/04/23 23:06:35 Generating genesis block

2017/04/23 23:06:35 Writing genesis block

可以在fabric目录下看到新生成了orderer.block文件

?

2、启动order节点

注意这是一条命令,在同一行运行,只是一行显示不全,才展现为两行,程序运行后,不要退出本窗口,后续操作步骤,按需要新起shell窗口。

ORDERER_GENERAL_GENESISMETHOD=file
ORDERER_GENERAL_GENESISFILE=./orderer.block ./build/bin/orderer

输出如下信息:

2017-04-23 23:08:26.906 CST [orderer/multichain] NewManagerImpl
-> INFO 001 Starting with system channel testchainid and orderer type solo

2017-04-23 23:08:26.906 CST [orderer/main] NewServer -> INFO
002 Starting orderer

2017-04-23 23:08:26.906 CST [orderer/main] main -> INFO 003
Beginning to serve requests

?

3、生成channel配置信息

./build/bin/configtxgen -profile SampleSingleMSPSolo
-outputCreateChannelTx channel.tx -channelID foobarchannel

输出如下信息:

2017/04/23 23:16:08 Loading configuration

2017/04/23 23:16:08 Looking for configtx.yaml in: /opt/gopath/src/github.com/hyperledger/fabric/common/configtx/tool

2017/04/23 23:16:08 Found configtx.yaml there

2017/04/23 23:16:08 Checking for MSPDir at: .

2017/04/23 23:16:08 Checking for MSPDir at: .

2017/04/23 23:16:08 Generating new channel configtx

2017/04/23 23:16:08 Creating no-op MSP instance

2017/04/23 23:16:08 Obtaining default signing identity

2017/04/23 23:16:08 Creating no-op signing identity instance

2017/04/23 23:16:08 Serialinzing identity

2017/04/23 23:16:08 signing message

2017/04/23 23:16:08 signing message

2017/04/23 23:16:08 Writing new channel tx

?

可以在fabric目录下看到新生成了channel.tx文件

?

4、启动peer节点

启动peer节点,这时peer还未加入任何通道,处于”无链模式”, 程序运行后,不要退出本窗口,后续操作步骤,按需要新起shell窗口。

./build/bin/peer
node start --peer-defaultchain=false

?

输出如下信息:

2017-04-23
23:18:45.215 CST [ledgermgmt] initialize -> INFO 001 Initializing ledger
mgmt

2017-04-23
23:18:45.215 CST [kvledger] NewProvider -> INFO 002 Initializing ledger
provider

。。。。。。此处略过许多输出信息。。。。。。。

2017-04-23
23:18:45.243 CST [nodeCmd] serve -> INFO 022 Started peer with
ID=[name:"jdoe" ], network ID=[dev], address=[0.0.0.0:7051]

?

5、创建通道

./build/bin/peer
channel create -o 127.0.0.1:7050 -c foobarchannel -f channel.tx

?

输出如下信息:

2017/04/23
23:21:07 proto: textWriter unindented too far

Received
block:? header: INFO 001 Exiting.....

?

在orderer运行的那个窗口也可以看到如下输出信息:

2017-04-23
23:21:05.922 CST [orderer/multichain] newChain -> INFO 004 Created and
starting new chain foobarchannel

也可以在fabric目录下看到新生成了foobarchannel.block文件。

?

6、加入通道

这时候,peer节点脱离了”无链模式”,接入了新建立的通道。

./build/bin/peer
channel join -b foobarchannel.block

?

输出如下信息:

Peer
joined the channel!

2017-04-23
23:32:46.119 CST [main] main -> INFO 001 Exiting.....
Jump to: