# 超级账本开发实例2——fabcar区块链应用

By [leaf](https://paragraph.com/@leaf-6) · 2022-12-06

---

使用超级账本构建了一个Fabric网络，并通过CLI命令行与这个Fabric网络进行交互。在这一节中将会学习Fabric Samples中的另一个示例——fabcar。fabcar是一个基于NODE SDK、并带有智能合约的示例（其中NODE\_SDK是超级账本官方提供的JavaScript软件开发工具包，开发者可以通过NODE\_SDK与Fabric网络进行交互，这是除了CLI之外的另一种交互方式），通过这个示例的学习，我们可以了解NODE SDK的使用方法，以及如何在页面中基于NODE SDK和Fabric网络进行交互。

在进入这个示例的开发之前，再来总结一下一个区块链应用与区块链网路之间的交互过程。

在Fabric网络中，一个应用（Application）首先需要通过开发者证书（Application Developer Identity）的确认，通过确认后执行智能合约（Run smart contracts），智能合约可以查询和更新区块链网络（Receive ledger updates）。区块链网络更新成功后再通知应用，如图

![](https://storage.googleapis.com/papyrus_images/bc8c67bb8278915f40946f15103e262ea430fc761a9b15f290395e16d7386254.png)

fabcar实现了汽车数据管理的功能，里面包含了两种角色，一是管理员，用来更新和管理汽车数据，二是普通用户，可以查询所有的汽车数据。该示例实现的具体功能以下：

●定义一个Car的结构体，用来存储汽车的数据和所有者信息。

●初始化并启动一个测试网络。

●具有注册和登记管理员的功能。

●具有注册新用户的功能。

●可以查询和更新汽车的信息。

进入fabcar文件夹可以看到一个shell脚本和几个js文件，如图

![](https://storage.googleapis.com/papyrus_images/94770ff3d8aedaecc8d27140d6bdb55fddf6afeba3997f39bf00c87580639959.png)

其中package.json定义了这个项目所需要的JavaScript模块，以及项目的配置信息（比如名称、版本、许可证等）。执行npm install命令时会根据这个配置文件自动下载所需的模块，也就是配置项目所需的运行和开发环境。startFabric.sh这个脚本用来初始化Fabric网络、启动结点、创建通道和实例化Chaincode，并且把汽车的初始信息写入区块链。enrollAdmin.js用来注册管理员。registerUser.js用来注册新用户。query.js可以查询所有汽车的信息。invoke.js用来调用Chaincode，执行其中的功能。

下面开始开发和部署这个fabcar应用

fabcar的开发和部署
------------

在这个示例中会先启动并初始化一个Fabric网络，然后创建一个管理员和一个新用户用于测试，接着通过NODE SDK与网络进行交互并将NODE SDK集成到一个网页中，用户可以通过这个交互页面操作超级账本。

1.启动网络和初始化数据

第1步是执行fabcar文件夹下的startFabric.sh脚本文本，这个脚本文件的作用是先启动这个基础网络，然后启动CLI容器、实例化Chaincode和加载汽车初始信息，如图

![在上面的过程中比较重要的是Chaincode的功能。下面来具体了解一下Chaincode的实现细节。Chaincode的代码放在fabric-samples/chaincode/fabcar/go文件夹下面，这个fabcar.go文件中定义了汽车的结构体，如图](https://storage.googleapis.com/papyrus_images/a54e91b7ca9f24fc6c6bef88aa487ba5cd2aebbc22ed7c2084add0de356b4921.png)

在上面的过程中比较重要的是Chaincode的功能。下面来具体了解一下Chaincode的实现细节。Chaincode的代码放在fabric-samples/chaincode/fabcar/go文件夹下面，这个fabcar.go文件中定义了汽车的结构体，如图

![](https://storage.googleapis.com/papyrus_images/e09c222c5c10173d06a619d07000d2f1644de398a3e1907bb78186c01093f3db.png)

在Chaincode代码中还需要实现Chaincode的Init（）方法和Invoke（）方法。在Init（）方法中实现了Chaincode的初始化操作，以及针对查询汽车信息（queryCar）、初始化账本（initLedger）、新建汽车信息（createCar）、查询所有汽车信息（queryAllcars）、更新汽车所有者（changeCarOwner）等不同事件实现了对应的处理逻辑，如图6-31所示。

图6-31 实现Chaincode（）方法

其中在Invoke（）方法支持调用queryCar（查询汽车信息）、initLedger（初始化账本）、createCar（新建汽车信息）、queryAllCars（查询所有汽车信息）、changeCarOwner（更新汽车所有者）的功能。

![](https://storage.googleapis.com/papyrus_images/ef6c3b6ba7160aeab4440b381442db74adcdbe6814bdeb5d873948039a49549b.png)

使用startFabric.sh启动网络后，若一切顺利可以看到成功的输出信息、整个启动消耗的时间和一些帮助信息，如图所示。

网络启动成功的输出信息

成功启动网络后还需要创建一个管理员和新用户。

2.创建管理员和新用户

创建管理员使用enrollAdmin.js，在这个文件中调用SDK创建一个用户名为admin的管理员，如图

![](https://storage.googleapis.com/papyrus_images/57f821580533bdc77c9fc5937acb6fdb95ef2c2681cad912ab3c6513e2952156.png)

创建admin管理员

创建管理员使用registerUser.js，在这个文件中调用SDK创建一个用户名为user1的新用户，如图

![](https://storage.googleapis.com/papyrus_images/0ddc8136e6bedc40f62caa372e77368795c9c225f0da0e23206e8ed6d96b48bd.png)

创建user1新用户

在执行这两个脚本执行需要先使用npm install命令安装SDK，如图所示。

![安装SDK](https://storage.googleapis.com/papyrus_images/9041417e66fb6ec0157a3f7db82f261614d4339426dbce66c281c299da5cf7d5.png)

安装SDK

安装完成以后通过node enrollAdmin.js和node registerUser注册管理员和新用户，如图

![](https://storage.googleapis.com/papyrus_images/19f44920cb5b644c752b78598417fe8dfed9411dc25eec1253fa998efc14576f.png)

再查询某一辆汽车（如CAR3）的信息，修改query.js，如图6-38所示。

再执行命令“node query.js”，可以看到返回了CAR3的信息如图6-39所示。

接着再尝试调用Chaincode更新超级账本的内容，在invoke.js中调用Chaincode中的createCar新建一辆汽车信息，如图所示。

![](https://storage.googleapis.com/papyrus_images/b0b966c0d81fe38e623199aa50b841708dc588dc8bbf6da3a977961af3adc90e.png)

执行node invoke.js命令，如图所示。然后在查询所有汽车信息就可以看到多了一辆汽车，

![](https://storage.googleapis.com/papyrus_images/d96e34065a714ccb1c90751958e18f76e9e18faa510862863cf55996a01c6ace.png)

最后将NODE SDK集成到一个网页中，使用户可以直接通过网页与Fabric网络进行交互，进行超级账本的查询操作。这里使用express框架开发一个简单的页面来展示和调用SDK。Express是一个简洁而灵活的node.js Web应用框架，它提供一系列强大的特性，帮助用户创建各种Web和移动设备应用。

网站实现的功能是访问首页时返回所有汽车信息，访问对应汽车页面则返回汽车详情页面。先在终端中执行npm install express安装express框架，然后新建一个名为server.js的文件。在这个文件中加载并新建一个express应用并监听3000端口，当访问这个3000端口时查询得到在1.启动网络和初始化数据一部分中加载的所有汽车信息并返回。

主要代码如下：

![](https://storage.googleapis.com/papyrus_images/a5b7c7d886bee376392c6cd5449855239e2ccdc611c92c39089ad48a28dca965.png)

完成代码后在终端中执行node app.js命令运行应用。运行后可在浏览器中访问127.0.0.1：3000查看所有汽车信息，如图

![](https://storage.googleapis.com/papyrus_images/9ac77c8335b1a6968a61d0c410d24ca140026e467661e71a4ac689491179a71a.png)

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/2-fabcar)*
