由于这个活儿前段时间自己过了一遍,当时发现网上资料很少,所以特地写一篇给大家分享一下,帮助大家踩一些坑。
Hyperledger Fabric是由IBM公司主导开发的一个面向企业级客户的开源项目。与比特币和以太坊这类公有链不同,Hyperledger Fabric网络中的节点必须经过授权认证后才能加入,从而避免了POW资源开销,大幅提高了交易处理效率,满足企业级应用对处理性能的诉求。同时,为了满足灵活多变的应用场景,Hyperledger Fabric采用了高度模块化的系统设计理念,将权限认证模块(MSP)、共识服务模块(Ordering Service)、背书模块(Endorsing peers)、区块提交模块(committing peers)等进行分离部署,使开发者可以根据具体的业务场景替换模块,实现了模块的插件式管理(plug-in/plug-out)。所以,Hyperledger Fabric是一个私有链/联盟链的开发框架,而且系统的运行不需要token支持。
本文主要是根据Hyperledger Fabric Sample中的Commercial paper tutorial改编,来实现一个简单的Blockchain Bookstore App。
Commercial paper tutorial参考文档:
0x01_需求
我们需要实现一个简单的区块链书店,这里面首先必须得有智能合约,然后还需要包含一些书店交易环节的基本的功能,比如购买,退货等。同时也要保证退货的时候,款项退款正确。实现这些简单的需求,可以参考Commercial paper tutorial代码。
0x02_读教程
既然可以参考Commercial paper tutorial的代码,那么我们就先去:
https://hyperledger-fabric.readthedocs.io/en/release-1.4/tutorial/commercial_paper.html复制代码
去看一下这个教程都有些什么内容。
这个教程比较长,而且都是英文,所以皮爷在这里就给大家简单总结一下:
- 首先在这个框架里面,有三个组织,分别是MagnetoCrop, Digibank和PaperNet。
- MagnetoCorp负责发行债券和赎回债券。
- DigitBank负责购买债券,然后再赎回债券。
- PaperNet则是负责记录一切的区块链区间。
- 首先需要安装我们的智能合约PaperContract,然后再将合约扩散到PaperNet上面。
- MagnetoCrop首先会通过issue()来发放债券。
- 然后DigitBank则会购买那些已经发放出来的债券。
- 最后DigitBank通过redeem()来赎回自己的本金。
那么长的英文其实就讲的是这些东西而已,整个流程其实和书店的环节很像:
- 书店其实就是MagnetoCrop,负责发布书籍,然后买书,退书。
- DigitBank则是有点像消费者,他们可以买书,退货。
0x03_环境准备
这里其实有点坑,之前我一直尝试着在Mac上面做,但是做到一半,发现有个“mkdir xxxxxx permission deny”始终过不去,网上找了好多好多好多好多方法,都不行,这个问题整整困扰了我两天!实实在在的两天,一个周末。天哪,一个美好的周末,两天,就在搜索怎样解决这个问题。最后还是解决不了,所以我就干脆直接在我的
因为文章都是涉及到服务器的,所以福利就要写在最前面:
皮爷这里就有上千元的阿里云和腾讯云的优惠券给你使用(每一款优惠只要点击优惠链接,进入即可领取):阿里云部分:
【阿里云新人1888元云产品通用代金券】:
promotion.aliyun.com/ntms/yunpar…【阿里云爆款云主机,2折优惠券】:
promotion.aliyun.com/ntms/act/qw…【阿里云企业级服务器2折优惠券】:
promotion.aliyun.com/ntms/act/en…腾讯云:
【新客户无门槛领取总价值高达2775元代金券,每种代金券限量500张,先到先得】:
cloud.tencent.com/redirect.ph…【腾讯云服务器、云数据库特惠,3折优惠券】:
cloud.tencent.com/redirect.ph…
有了云服务器,下一步就是准备环境了:
- 腾讯云服务器一台
- node v10.15.3
- Docker version 18.09.6, build 481bc77156
- go
0x05_启动网络
首先我们得启动整个网络,启动网络则是 /fabric-samples/basic-network/
里面,直接运行 . start.sh
然后我们可以从 docker ps
里面看到,成功启动了四个image
接着,我们需要启动 cliBookStore 的image,则需要cd /fabric-samples/commercial-paper/organization/bookstore/configuration/cli/
,然后通过命令:docker-compose -f docker-compose.yml up -d cliBookStore
启动。
接下来我们还需要去启动消费者的cliDigiBank。目录/fabric-samples/commercial-paper/organization/digibank/configuration/cli/
,命令:docker-compose -f docker-compose.yml up -d cliDigiBank
则能启动起来:
为了更好的观察网络中的数据变化,我们可以启动一个监控image来检测全部网络。目录是/fabric-samples/commercial-paper/organization/bookstore/configuration/cli/
,通过命令./monitordocker.sh net_basic to start a new docker image to monionter basic_net
启动。
0x06_安装智能合约
既然我们是BookstoreApp,那么我们的只能合约就叫做bookcontract
。合约在/fabric-samples/commercial-paper/organization/bookstore/contract/
目录下,安装合约,则通过命令:docker exec cliBookStore peer chaincode install -n bookcontract -v 0 -p /opt/gopath/src/github.com/contract -l node
之后我们需要将合约发布出去,通过命令:docker exec cliBookStore peer chaincode instantiate -n bookcontract -v 0 -l node -c '{"Args":["org.papernet.digitbook:instantiate"]}' -C mychannel -P "AND ('Org1MSP.member')"
0x07_书店的使用场景
每一个组织的应用程序,都在他对应的/application/
目录地下。所以,书店的应用程序也在这个目录下。
首先,需要把书店的钱包添加到网络里:
然后,我们可以调用 issue 程序,将《LEARNING JAPANESE》这本书,按照编号00001发布出去:
此时,可以调用一个query程序,来看一下书籍的信息:
因为这本书已经发售了,所以书店的人是有权利来读取这本书的内容的。
目前,图书的状态指示issued,如果书店想要卖这本书,那么他还需要把这本书publish出来,所以调用publish程序:
因为此时图书状态是处在待卖的状态,归属Digibank的两个人是没有权限来读取书中内容的:
今天的文章我们就先说到这里,还剩下
代码我已经在公众号里面分享了,想要获取源码的同学,可以关注公号『皮爷撸码』,回复『代码』即可找到,记住对应的代码编号是『HF001』,代码编号是『HF001』,代码编号是『HF001』。
最后给小程序打个广告,摇一摇,来不来?