浅析Hyperledger Fabric应用开发原理
准备工作
开发环境:mac parallels ubuntu 16。04 .4个lts(虚拟机操作系统)
1安装curl
$ sudo安装curl
$ curl-v
2安装连接此
超级分类帐结构系统需要将多个模块分离部署在不同节点上,为了方便演示,通过码头工模拟各个节点,因此,需要安装码头工以及相关组件。
对接此安装方法:339份文件。码头工人。com/install/Linux/docker-ce/Ubuntu/#升级docker-ce
3增加一个码头工非根(根)用户
$ sudo groupadd?docker
$ sudo用户模块-ag docker $用户
$ docker运行你好蓑衣网小编2023-世界
4安装码头工人?合成的组件
$ sudo apt更新
$ sudo apt安装docker-合成
$ docker-版本-合成
5版本安装节点。js
$ curl-sl 339 deb。nodesource。com/setup _ 10。x | sudo-e bashsudo apt-get install-y nodejs
6。"安装Go语言
$ sudo curl你呢?339号仓库。谷歌API。com/golang/go 1。9 .2 .Linux-amd64。焦油。gz
$ sudo tar-xvf go 1。9 .2 .Linux-amd64。焦油。gz$ sudo mv go/usr/local$ echo ' export path=$ path:/usr/local/go/bin ' ~/.配置文件$ source ~/.配置文件$ go版本
安装超级分类帐结构坞站镜像
$ curl-SSL
339 raw。githubusercontent。com/hyperledger/fabric/master/scripts/bootstrap。嘘?| bash -s 1.1.0
注意:如果上述命令执行失败或者卡住,可以先按照下面方式将引导程序。嘘脚本下载到本地后执行。
$ curlo 339 raw。githubusercontent。com/hyperledger/fabric/master/scripts/bootstrap。sh
$ sudo bash引导。shs 1。1 .0
$ docker?图像
下载超总帐结构示例工程
$导出路径=$ pwd/bin:$ path$吗?git克隆?github街339号。com/hyperledger/fabric samples。git(或者:git克隆339 Gerrit。超级账本。org/r/fabric samples$ CD fabric samples/first-network启动超总帐结构测试网络超总帐结构安装完成后,通过码头工镜像构建一个简单的测试网络,包含两个组织,每个组织(组织)包含两个同伴们节点,然后共用一个订购服务节点(仅限模式页:1。 1、创建网络节点./byfn。sh生成为通道为"我的频道"且硬币指示器(coin-levelindicator的缩写)命令行界面(Command Line Interface for batch scripting)超时为"10"的生成证书和生成块是否继续?[是/否] y程序./Users/XXX/dev/fabric-samples/bin/cryptogen?# # # # # # # # # # # # # # # # # # # # # # # # # # # org1.example.com 2017-06-12 21:01:37.334美国东部时间[bccsp]获取默认值-WARN 001在使用BCCSP之前,请调用InitFactories().回退到bootBCCSP ./Users/XXX/dev/fabric-samples/bin/config txgen # # # # # # # # # # # # # # # # # # # # # # #?正在生成订单生成块# # # # # # # # # # # # # # # # # # # # # # # 2017-06-12 21:01:37.558 EDT[common/configtx/tool]main-INFO 001正在加载配置2017-06-12 21:01:37.562美国东部时间[MSP]getMspConfig-INFO 002中间证书文件夹未找到跳绳.stat/Users/XXX/dev/byfn/crypto-config/order organizations/example。com/MSP/中级证书:没有这样的文件或目录].2017-06-12 21:01:37.588美国东部时间[common/configtx/tool]doOutputBlock-INFO 00b生成创世纪块2017-06-12 21:01:37.590美国东部时间[common/configtx/tool]doOutputBlock-INFO 00c写创世纪块?# # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #生成通道配置事务渠道。tx ' # # # # # # # # # # # # # # # # # # # 2017-06-12 21:01:37.634 EDT[common/configtx/tool]main-INFO 001加载配置2017-06################################################################# #######?正在为Org1MSP生成锚点对等更新?# # # # # # # # # # # # # # # # # # # # # # # # 2017-06-12 21:01:37.674 EDT[common/configtx/tool]main-INFO 001加载配置2017-06-12 21:01:37.678美国东部时间[common/configtx/tool]doOutputAnchorPeersUpdate-INFO 002生成锚点对等体################################################################# #######?正在为Org2MSP生成锚点对等更新?# # # # # # # # # # # # # # # # # # # # # # # # 2017-06-12 21:01:37.700 EDT[common/configtx/tool]main-INFO 001加载配置2017-06-12 21:01:37.704美国东部时间[common/configtx/tool]doOutputAnchorPeersUpdate-INFO 002生成锚点对等体运行测试网络
./byfn.sh up
启动容器测试网络,然后运行一些基本的测试用例,包括创建渠道、加入渠道、部署智能合约、调用智能合约等步骤,具体代码实现细节可以参考:
https://github。com/hyperledger/fabric-samples/blob/release-1.2/first-network/scripts/script。sh
启动成功后的日志如下:
用例运行结束后的日志,说明所有用例执行成功:最后,关闭测试网络并清理环境:美元./byfn.sh向下
开发一个简单的应用程序
在织物样品中有一个法布卡尔应用程序,模拟了一个简单的车辆管理系统,包括创建车辆、交易车辆等操作。应用程序通过智能合约接口和账本交互,然后将信息结果呈现在用户界面(例如Linux操作系统终端).
1、法布卡尔目录结构:法布卡尔应用程序由5个文件组成,每个文件完成一个独立的功能模块,后面会详细解释。
# cd fabric-samples/fabcar?lsenrollAdmin.js?invoke.jspackage.jsonquery.js?注册用户。jsstartfabric.sh2。安装应用客户端
首先安装nodejs开发依赖库。在这个过程中,可能会出现一些依赖库安装失败的情况,可能是因为系统中缺少一些基础库,可以通过单独安装来解决。
$ npm安装3。启动区块链网络。该脚本将首先初始化各种网络实体(认可对等体、订购服务、提交对等体等)。)并创建相关通道。然后,部署智能合约并调用初始化方法来插入一些车辆信息。StartFabric.sh完成了区块链系统的初始化。
$。/startFabric.sh4。注册admin用户
首先向CA服务器发送注册请求,然后获取一个认证证书(包括一组公钥和私钥),然后使用该证书创建一些普通用户。js脚本执行后,项目根目录下会生成hfc-key-store
目录(类似于以太坊的keystore文件),其中包含证书信息。
$ node enrolladmin.js5。注册用户1
继续通过管理员的eCert证书向CA服务器发送注册请求,并创建一个新的用户1。
$ node registerUser.js6。查询账簿信息
车辆信息以key-value的形式保存在账簿中,其中key是CAR0,CAR1…的车号,value是具体的车辆属性。通过js脚本找到10条车辆信息。
# node query . js成功loaded user1 from persistence Query has completed, checking results Response is[{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1",?? "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]查询过程只是通过APIs获取账本中的数据,并不改变区块链状态,也不会产生新的区块。所以,整个过程不需要endorsing peers、ordering service和committing peers参与。?query.js脚本通过调用fabcar智能合约的queryAllCars方法,完成查询动作。// queryCar chaincode function - requires 1 argument, ex: args: ['CAR4'],// queryAllCars chaincode function - requires no arguments , ex: args: [''],const request = {//targets : --- letting this default to the peers assigned to the channel?? chaincodeId: 'fabcar',fcn: 'queryAllCars',args: ['']};
// send the query proposal to the peerreturn channel.queryByChaincode(request);
fabcar.go智能合约中的queryAllCars函数查询从startKey到endKey范围的value,并打印出来。
func (s *SmartContract) queryAllCars(APIstub shim.ChaincodeStubInterface) sc.Response {
resultsIterator, err := APIstub.GetStateByRange(startKey, endKey)
…
}
fabcar.go智能合约中包含所有车辆信息管理接口,例如创建车辆(createCar)、更新车辆颜色(updateCarColor)等等:
7、更新账本信息更新账本的过程会改变区块链状态,需要ordering节点将交易信息打包成区块,然后发给committing peers节点写入区块链。
通过invoke.js脚本调用智能合约的createCar函数创建一辆车,在执行脚本之前需要按照注释内容修改一下具体调用的函数,具体如下:// createCar chaincode function - requires 5 args, ex: args: ['CAR12', 'Honda', 'Accord', 'Black', 'Tom'],// changeCarOwner chaincode function - requires 2 args , ex: args: ['CAR10', 'Barry'], // must send the proposal to endorsing peers var request = {???????? //targets: let default to the peer assigned to the client???????? chaincodeId: 'fabcar',???????? fcn: 'createCar',???????? args: ['CAR12', 'Honda', 'Accord', 'Black', 'Tom'],???????? chainId: 'mychannel',???????? txId: tx_id};运行脚本后,即可创建一条车辆信息,然后通过query.js脚本可以查询到。$ node invoke.js
总结
通过这个简单的车辆信息管理程序,我们可以很直观的感受到上层应用是怎么样通过智能合约与区块链数据库交互的。首先,最上层的业务逻辑调用智能合约函数接口,然后,智能合约通过协议层的SDK接口与区块链服务层交互,进行查询、更新操作,最后,上层应用将处理结果呈现到用户界面。其实,本质上,底层的区块链系统就是一个黑盒分布式数据库,同时提供防篡改、数据加密、权限控制等功能。