banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.

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

使用超级账本构建了一个 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)。区块链网络更新成功后再通知应用,如图

image

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

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

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

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

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

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

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

image

其中 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 文件中定义了汽车的结构体,如图

image

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

图 6-31 实现 Chaincode()方法

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

image

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

网络启动成功的输出信息

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

2. 创建管理员和新用户

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

image

创建 admin 管理员

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

image

创建 user1 新用户

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

安装 SDK

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

image

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

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

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

image

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

image

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

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

主要代码如下:

image

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

image

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。