# 超级账本开发实例2——fabcar区块链应用 **Published by:** [leaf](https://paragraph.com/@leaf-6/) **Published on:** 2022-12-06 **URL:** https://paragraph.com/@leaf-6/2-fabcar ## Content 使用超级账本构建了一个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)。区块链网络更新成功后再通知应用,如图fabcar实现了汽车数据管理的功能,里面包含了两种角色,一是管理员,用来更新和管理汽车数据,二是普通用户,可以查询所有的汽车数据。该示例实现的具体功能以下: ●定义一个Car的结构体,用来存储汽车的数据和所有者信息。 ●初始化并启动一个测试网络。 ●具有注册和登记管理员的功能。 ●具有注册新用户的功能。 ●可以查询和更新汽车的信息。 进入fabcar文件夹可以看到一个shell脚本和几个js文件,如图其中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文件中定义了汽车的结构体,如图在Chaincode代码中还需要实现Chaincode的Init()方法和Invoke()方法。在Init()方法中实现了Chaincode的初始化操作,以及针对查询汽车信息(queryCar)、初始化账本(initLedger)、新建汽车信息(createCar)、查询所有汽车信息(queryAllcars)、更新汽车所有者(changeCarOwner)等不同事件实现了对应的处理逻辑,如图6-31所示。 图6-31 实现Chaincode()方法 其中在Invoke()方法支持调用queryCar(查询汽车信息)、initLedger(初始化账本)、createCar(新建汽车信息)、queryAllCars(查询所有汽车信息)、changeCarOwner(更新汽车所有者)的功能。使用startFabric.sh启动网络后,若一切顺利可以看到成功的输出信息、整个启动消耗的时间和一些帮助信息,如图所示。 网络启动成功的输出信息 成功启动网络后还需要创建一个管理员和新用户。 2.创建管理员和新用户 创建管理员使用enrollAdmin.js,在这个文件中调用SDK创建一个用户名为admin的管理员,如图创建admin管理员 创建管理员使用registerUser.js,在这个文件中调用SDK创建一个用户名为user1的新用户,如图创建user1新用户 在执行这两个脚本执行需要先使用npm install命令安装SDK,如图所示。安装SDK安装完成以后通过node enrollAdmin.js和node registerUser注册管理员和新用户,如图再查询某一辆汽车(如CAR3)的信息,修改query.js,如图6-38所示。 再执行命令“node query.js”,可以看到返回了CAR3的信息如图6-39所示。 接着再尝试调用Chaincode更新超级账本的内容,在invoke.js中调用Chaincode中的createCar新建一辆汽车信息,如图所示。执行node invoke.js命令,如图所示。然后在查询所有汽车信息就可以看到多了一辆汽车,最后将NODE SDK集成到一个网页中,使用户可以直接通过网页与Fabric网络进行交互,进行超级账本的查询操作。这里使用express框架开发一个简单的页面来展示和调用SDK。Express是一个简洁而灵活的node.js Web应用框架,它提供一系列强大的特性,帮助用户创建各种Web和移动设备应用。 网站实现的功能是访问首页时返回所有汽车信息,访问对应汽车页面则返回汽车详情页面。先在终端中执行npm install express安装express框架,然后新建一个名为server.js的文件。在这个文件中加载并新建一个express应用并监听3000端口,当访问这个3000端口时查询得到在1.启动网络和初始化数据一部分中加载的所有汽车信息并返回。 主要代码如下:完成代码后在终端中执行node app.js命令运行应用。运行后可在浏览器中访问127.0.0.1:3000查看所有汽车信息,如图 ## Publication Information - [leaf](https://paragraph.com/@leaf-6/): Publication homepage - [All Posts](https://paragraph.com/@leaf-6/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@leaf-6): Subscribe to updates