目前沒法繞過技術領域的是區塊鏈話題。但除了加密貨幣以外,還有更多有趣的應用程序能夠帶來許多激動人心的軟件生態系統。這也適用於Hyperledger項目,該項目提供了一個很是模塊化的區塊鏈框架。讓咱們看看使用Hyperledger Fabric和Composer實現區塊鏈應用程序是多麼容易。java
Hyperledger是一個umbrella項目的名稱,在該項目下開源區塊鏈方法和工具是協同開發的。它由Linux基金會於2015年推出,並享有IBM,英特爾和富士通等軟件巨頭以及大型社區的熱烈參與。Hyperledger的GitHub存儲庫目前比以往更加活躍。任何人均可以參與開發。node
在Hyperledger中,不只開發了單個區塊鏈框架(或平臺)。相反,重點是並行採用多種方法,創造協同效應,可重複使用的組件和靈活性。從Hyperledger概念的角度來看,區塊鏈網絡與比特幣或以太網等加密貨幣的表明沒法比較。相反,Hyperledger網絡的節點分佈在參與組織中,這使得私有,許可或聯盟區塊鏈網絡特別有趣。首先,咱們能夠忘記公共區塊鏈的工做證實,股權證實和其餘共識機制。所涉及的組織從應用程序業務價值和所涉及的信任中做爲聯合體驗證彼此的交易和利益。這也很大程度上解決了可擴展性問題(咱們從比特幣網絡中瞭解到)而且能夠實現高交易吞吐量。git
項目Hyperledger的不一樣區塊鏈方法是Fabric,Burrow,Iroha,Indy和Sawtooth。私有,許可和聯合區塊鏈能夠與全部這些區塊鏈一塊兒開發,但每種實現都遵循不一樣的方法。github
咱們將在本文中詳細介紹Fabric,由於它擁有最活躍的社區,而且是最靈活的變體。因爲其強大的模塊化,fabric是廣泛可用的。 「你能夠將Hyperledger Fabric視爲相似於Apache Web Server」,Linux基金會Hyperledger執行董事Brian Behlendorf說。其餘方法更多用於在有限的環境中實施特殊狀況。web
使用Fabric做爲平臺,能夠開發徹底獨立的分佈式分類賬解決方案。Fabric包含能夠儘量自由實現的概念。區塊鏈網絡的基礎是對所需組織結構的建模。每一個參與者都有固定的身份,能夠經過頒發的證書來識別本身。除了身份驗證以外,還包括受權。使用這種基於角色的系統,能夠得到許可區塊鏈中隱私和機密性的靈活方面。對於證書和參與者的管理,可使用結構證書頒發機構(1.0版以前的成員服務提供者)。docker
資產的定義(要在區塊鏈上管理的項目)徹底取決於區塊鏈應用程序。這些資產,例如來自汽車行業的引擎塊由JSON和/或二進制格式的鍵值對模型定義。數據庫
鏈代碼的概念旨在基於資產及其全部者實現業務邏輯。這可用於實現Go,Java或Node.js等語言中的規則,這些規則定義讀取權限或資產修改。執行鏈代碼功能能夠讀取和返回資產和/或建立和修改資產並將它們存儲在本地分類賬數據庫中。在節點上的本地持久性更改以後,將更改提交給網絡(「承認」)並在其餘組織接受後插入到區塊鏈中。在以太坊或其餘公共區塊鏈平臺的背景下,能夠將鏈碼與智能合約進行比較。npm
通道用於實現隱私領域。在最簡單的場景中,整個鏈代碼部署在全部參與者加入的單個通道上。可是,爲了建立封裝區域並僅容許選定的參與者在其中進行通訊,能夠配置具備受限參與者組的通道。每一個通道能夠部署不一樣的鏈代碼,從而能夠實現功能隔離。此外,可使用AES部分或徹底加密通道中的通訊。編程
結果,在每一個通道中維護一個分佈式分類賬,這能夠被想象爲連接交易的現金簿。每一個參與者爲他們所屬的每一個通道保留一份分類賬副本。這爲網絡中的每一個現有信道建立了區塊鏈數據結構。與區塊鏈同樣,交易存儲在塊中,這些塊在單個鏈接列表中成爲加密鏈。網絡
可是,爲了向客戶端應用程序提供分類賬數據的單獨視圖,甚至能夠執行鍼對網絡的複雜讀取請求。因爲使用了像CouchDB這樣的面向文檔的數據庫,這是可能的。這爲鏈接到Fabric網絡的客戶端提供了靈活的數據訪問。
Hyperledger-Composer是Hyperledger生態系統中的工具之一。你能夠將其視爲Fabric的框架。若是你想開發,構建和管理Fabric網絡,那麼即便不是強制性的,也是實用的。它引入了基於Fabric的進一步概念,以提供精美的抽象概念。
除資產外,還能夠在Composer建模語言中定義網絡參與者,交易和事件的方案。每種交易類型的流都經過JavaScript代碼在簡單的API上實現。訪問控制文件可用於限制參與者對某些資源的訪問權限。能夠在Composer Query Language中定義對分類賬中數據的經常使用查詢,這是一種相似SQL的語言。
而後,必須將全部必需文件打包到.bna文件中的BND(業務網絡定義)。而後,能夠將此存檔安裝在現有Fabric網絡上。BND的源代碼固然能夠在咱們首選的編輯器中進行本地開發和測試,所以能夠經過Git進行版本控制。對於原型設計和演示目的,有Composer Playground。這提供了一個現代,清晰且直觀可用的Web界面,可訪問Composer CLI的本地配置。使用Playground,你能夠輕鬆建立,安裝,測試,編輯,導入和導出BND。
在Composer Playground中,你能夠以用戶友好的方式安裝,修改和測試新的業務網絡,而無需先前的樣本區塊鏈應用知識(例如車輛生命週期,汽車拍賣或農場動物跟蹤)。在設置工具以後,能夠在本地完成相同的操做,這樣咱們就能夠在短期玩遊戲後離開託管遊樂場。這個遊樂場很是適合使用原型驗證想法並瞭解底層的Composer和Fabric模型。
爲了使用Hyperledger-Fabric和Composer實現私有區塊鏈網絡,以汽車行業的發動機組跟蹤爲例。在這種狀況下,有製造商和經銷商做爲網絡參與者。發動機及其安裝的車輛顯示爲資產。製造商和經銷商的公司被引入並被識別爲網絡中的組織。
Fabric鏈代碼應提供如下功能:
下一步是安裝所需的工具和設置項目。
首先,須要安裝文檔中列出的Fabric的全部要求。而後咱們安裝Composer和Composer及其相關工具自己的要求。
而後,最好讓本身熟悉新環境。若是咱們徹底按照上一個連接的說明操做,則fabric-tools如今位於咱們的主目錄中。經過描述的腳本,咱們能夠在Docker-Compose中啓動一個簡單的Fabric網絡,得到對等管理員訪問權限並中止並再次刪除它。首先,咱們下載1.1版的Docker鏡像並啓動網絡:
export FABRIC_VERSION=hlfv11 && ./downloadFabric.sh && ./startFabric.sh
在網絡運行時,composer-playground web-UI能夠經過composer-playground
啓動。它使用composer-cli的全部託管配置並訪問正在運行的Fabric網絡。從如今開始,咱們將Fabric視爲可配置的平臺/基礎架構,其狀態經過合適的工具進行更改。咱們不直接使用Fabric概念開發鏈代碼,權限或任何模型,由於Composer提供了更多優點。
如今咱們在咱們選擇的目錄中建立咱們的BND項目。對於Yeoman(使用模板設置項目的代碼生成器,如Maven Archtypes),有一個模板(hyperledger-composer:businessnetwork。可是,我已經準備了一個存儲庫,咱們如今也可使用JavaScript ES6和一些很好的工具。咱們應該從開始分支「初始」開始。master
分支具備最終版本和工做版本。咱們首先克隆存儲庫的初始分支。
git clone -b initial git@github.com:jverhoelen/fabric-composer-engine-supplychain.git
如今咱們在咱們選擇的編輯器中打開文件夾。Visual Studio Code很是適合Composer,由於它具備可安裝的語法高亮擴展。稍做修改後你會發現它是一個NPM項目,因此咱們從npm install
開始安裝全部依賴項。使用npm test
咱們能夠運行單元測試,使用npm run lint
咱們能夠測試代碼樣式,而且使用npm run createArchive
咱們能夠建立the.bna
文件,咱們以打包格式完成業務網絡定義。讓咱們立刻試試看是否一切正常。
而後咱們熟悉項目結構。lib
文件夾包含實現交易處理器功能的JS文件。固然,咱們想測試這個業務邏輯並將咱們的單元測試存儲在test/
文件夾中。模型定義(參與者,資產,交易等)在models/
中。
咱們想首先爲所需的區塊鏈網絡建模。爲此,咱們刪除模型文件的內容,並在第一行爲其指定一個新的命名空間:
namespace org.acme.enginesupplychain
咱們爲參與者製造商和經銷商建模,並使用Composer建模語言的繼承。咱們還但願每一個參與者除了姓名外還有一個可選地址。咱們將這些屬性放入一個概念中:
participant Member identified by memberId { o String memberId o String name o Address address optional } participant Manufacturer extends Member { } participant Merchant extends Member { } concept Address { o String country o String city o String street o String streetNo }
而後咱們介紹咱們網絡的資產:引擎塊和稍後安裝引擎的汽車。在這裏,咱們瞭解資產和參與者能夠互相參考。引用始終指向任何類型的現有資源。咱們以小「o」開頭的屬性老是存在於資源自己中。
asset Engine identified by engineId { o String engineId o EngineProperties data --> Manufacturer manufacturer --> Car currentCar optional --> Merchant merchant optional } asset Car identified by carId { o String carId o String legalDocumentId } concept EngineProperties { o String brand o String model o Double horsePower o Double cubicCapacity o Integer cylindersAmount }
在對系統建模以後,咱們定義了能夠在現有資產和參與者之上執行的全部可用操做。這些是交易資源。以後,咱們爲如下每一個交易模型測試並實現基礎交易邏輯。
transaction EngineMerchantTransfer { --> Engine engine --> Merchant merchant } transaction EngineCarInstallation { --> Engine engine --> Car car } transaction EngineCreation { --> Manufacturer manufacturer o EngineProperties data } transaction CarCreation { o String legalIdDocument }
如今咱們已經定義了可能發生的事情,咱們能夠在提交交易時開始實現它如何影響分類賬狀態。首先,咱們致力於建立引擎資產。引擎應該以UUID格式得到隨機生成的ID,而且應該從一開始就始終屬於製造商。因此咱們清空logic.js
文件並從頭開始。咱們定義常量modelsNamespace
和函數uuid
,由於咱們將更頻繁地須要它們。接下來是createEngineAsset
函數。函數上方的文檔塊很是重要,以便Composer能夠識別打包代碼時實現的交易類型。
/* global getAssetRegistry getFactory */ const modelsNamespace = 'org.acme.enginesupplychain' function uuid() { const s4 = () => Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1) return `${s4()}${s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}` } /** * Creation of a Engine asset triggered by physical production. * @param {org.acme.enginesupplychain.EngineCreation} tx - the transaction to create an engine * @transaction */ async function createEngineAsset(tx) { // eslint-disable-line no-unused-vars const engineRegistry = await getAssetRegistry(modelsNamespace + '.Engine') const engine = getFactory().newResource(modelsNamespace, 'Engine', uuid()) const engineData = getFactory().newConcept(modelsNamespace, 'EngineProperties') engine.data = Object.assign(engineData, tx.data) engine.manufacturer = tx.manufacturer await engineRegistry.add(engine) }
經過這種方式,咱們還實現了其餘交易類型EngineMerchantTransfer
,EngineCarInstallation
和CarCreation
。
/** * An engine is transfered to a merchant. * @param {org.acme.enginesupplychain.EngineMerchantTransfer} tx - the engine transfer transaction * @transaction */ async function transferEngineToMerchant(tx) { // eslint-disable-line no-unused-vars const engineRegistry = await getAssetRegistry(modelsNamespace + '.Engine') tx.engine.merchant = tx.merchant await engineRegistry.update(tx.engine) } /** * An engine is installed in a car. * @param {org.acme.enginesupplychain.EngineCarInstallation} tx - the engine into car installation transaction * @transaction */ async function installEngineToCar(tx) { // eslint-disable-line no-unused-vars const engineRegistry = await getAssetRegistry(modelsNamespace + '.Engine') if (tx.car) { tx.engine.currentCar = tx.car await engineRegistry.update(tx.engine) } else { return Promise.reject('No target car was set on the transaction!') } } /** * A car is created. * @param {org.acme.enginesupplychain.CarCreation} tx - transaction to create a new car * @transaction */ async function createCar(tx) { // eslint-disable-line no-unused-vars const carRegistry = await getAssetRegistry(modelsNamespace + '.Car') const factory = getFactory() const carId = uuid() const car = factory.newResource(modelsNamespace, 'Car', carId) car.legalDocumentId = tx.legalIdDocument await carRegistry.add(car) }
功能自己的單元測試相對簡單,若是咱們有經驗,咱們不須要了解更多。只有對此所需的對象的boostrapping仍然有點超載樣板代碼。測試首先啓動內存中的Fabric網絡,在其上安裝業務網絡,而後以默認管理員身份對其進行身份驗證。由於這個Composer提供了庫composer-admin
,composer-client
,composer-common
和composer-connector-embedded
。在測試設置以後,咱們如今能夠針對嵌入式網絡編寫測試用例。因爲其長度,設置代碼未包含在列表中,但能夠在test/EngineSupplychainSpec.js
中的主分支上查看和測試。
用於測試交易類型的單元測試用例一般具備相似的模式。他們使用其屬性和關係從新建立交易,針對網絡執行交易,而後檢查所涉及的資產和參與者的數據狀態。咱們來看看createEngineAsset
的現有測試用例。
describe(‘EngineSupplychainSpec’, () => { // setup is done in the before and beforeEach hook // results are the bnc (BusinessNetworkConnection), target namespace // as well as test assets, participants and required registries describe('createEngineAsset', () => { it('should create an Engine by submitting a valid EngineCreation transaction', async () => { const factory = bnc.getBusinessNetwork().getFactory() const engineCreationTrans = factory.newTransaction(namespace, 'EngineCreation') engineCreationTrans.data = factory.newConcept(namespace, 'EngineProperties') engineCreationTrans.data.brand = 'Audi' engineCreationTrans.data.model = 'Fancy engine model' engineCreationTrans.data.horsePower = 400 engineCreationTrans.data.cubicCapacity = 4000 engineCreationTrans.data.cylindersAmount = 10 const manufacturerRegistry = await bnc.getParticipantRegistry(namespace + '.Manufacturer') await manufacturerRegistry.addAll([]) engineCreationTrans.manufacturer = factory.newRelationship(namespace, 'Manufacturer', testManufacturer.$identifier) await bnc.submitTransaction(engineCreationTrans) const allEngines = await engineRegistry.getAll() allEngines.length.should.equal(2) }) }) })
在Hyperledger Composer中實現業務網絡定義的方法應該經過這些看法變得清晰。此外,BND能夠爲咱們定義更多的東西。在permissions.acl
中,你可使用訪問控制語言爲給定簡單條件的參與者定義訪問限制。對於許多應用程序,事件和查詢功能也很是有用和有趣。
最後,咱們來看看主分支上的解決方案。全部這些要求都已在其中實施和測試。咱們如今用npm run createArchive
生成完成的.bna
文件,而後在dist/
文件夾中。咱們如今能夠將它導入到咱們在控制檯中啓動的Composer Playground中,以便在咱們的本地Fabric網絡上進行嘗試。經過Web UI的方式應該是不言自明的,但它也是正式記錄的。
咱們已經瞭解了Hyperledger項目的重要部分。具體來講,咱們如今知道Fabric做爲具備基本概念的區塊鏈平臺。Composer添加了許多重要概念,使開發人員能夠很是方便地實施和管理區塊鏈網絡。經過實施的關於發動機缸體生產和跟蹤的區塊鏈應用案例,咱們瞭解了一個簡單但功能強大的私人/聯盟區塊鏈用例。
最終的區塊鏈網絡最初只在本地執行。咱們尚未擴展同行組織和訂購服務的配置。但咱們能夠輕鬆添加更多組織並經過多個主機分發對等節點。對於由真正的組織聯盟跨越的區塊鏈網絡,咱們仍然有一些問題須要解決:
咱們如何管理組織和對等節點?組織如何自動將新的對等節點添加到網絡中?咱們如何得到一個能夠抵禦失敗的公平和同質的網絡?客戶如何與網絡通訊?
這個仍然年輕的平臺已經提供了不少功能和溫馨性。可是,仍有許多任務須要完成。從開發人員的角度來看,單元測試代碼看起來仍然很是臃腫。很快就會出現庫,經過它能夠更容易地實現一般的測試模式。咱們迫切但願看到Hyperledger等項目將如何繼續推進業務中分佈式帳本技術的適應性。
確保全部工具都與Fabric 1.1兼容。這意味着必須下載此版本的全部docker鏡像。應安裝最新版本的Composer和Composer Playground。目前是v0.19.1。本文中Fabric和Composer文檔的全部連接都是故意修復到Fabric 1.1和最新的Composer版本。
分享一些Hyperledger fabric區塊鏈相關的交互式在線編程實戰教程:
- Hyperledger Fabric 區塊鏈開發詳解,本課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啓動、鏈碼通訊接口等核心概念,也包含Fabric網絡設計、nodejs鏈碼與應用開發的操做實踐,是Nodejs工程師學習Fabric區塊鏈開發的最佳選擇。
- Hyperledger Fabric java 區塊鏈開發詳解,課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啓動、鏈碼通訊接口等核心概念,也包含Fabric網絡設計、java鏈碼與應用開發的操做實踐,是java工程師學習Fabric區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裏是原文使用Hyperledger Fabric和Composer實現區塊鏈應用程序