使用超級賬本構建了一個 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 的 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,如圖所示。
安裝完成以後通過 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 查看所有汽車信息,如圖