Title: Hyperledger Fabric 1.0最简区块链系统搭建与智能合约示例 Post by: zaa972 on January 12, 2018, 05:07:15 PM 学过编程的人都知道,几乎任何编程语言的第一次上机实战都是编写一个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?????? 65 Apr 20 23:43 . drwxr-xr-x 5 root root???? 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..... |