免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

使用Hyperledger Fabric和Composer實現區塊鏈應用程序

2021-03-05    分類: 網站建設

目前無法繞過技術領域的是區塊鏈話題。但除了加密貨幣之外,還有更多有趣的應用程序可以帶來許多激動人心的軟件生態系統。這也適用于Hyperledger項目,該項目提供了一個非常模塊化的區塊鏈框架。讓我們看看使用Hyperledger Fabric和Composer實現區塊鏈應用程序是多么容易。

關于項目Hyperledger

Hyperledger是一個umbrella項目的名稱,在該項目下開源區塊鏈方法和工具是協同開發的。它由Linux基金會于2015年推出,并享有IBM,英特爾和富士通等軟件巨頭以及大型社區的熱烈參與。Hyperledger的GitHub存儲庫目前比以往更加活躍。任何人都可以參與開發。

在Hyperledger中,不僅開發了單個區塊鏈框架(或平臺)。相反,重點是并行采用多種方法,創造協同效應,可重復使用的組件和靈活性。從Hyperledger概念的角度來看,區塊鏈網絡與比特幣或以太網等加密貨幣的代表無法比較。相反,Hyperledger網絡的節點分布在參與組織中,這使得私有,許可或聯盟區塊鏈網絡特別有趣。首先,我們可以忘記公共區塊鏈的工作證明,股權證明和其他共識機制。所涉及的組織從應用程序業務價值和所涉及的信任中作為聯合體驗證彼此的交易和利益。這也很大程度上解決了可擴展性問題(我們從比特幣網絡中了解到)并且可以實現高交易吞吐量。

項目Hyperledger的不同區塊鏈方法是Fabric,Burrow,Iroha,Indy和Sawtooth。私有,許可和聯合區塊鏈可以與所有這些區塊鏈一起開發,但每種實現都遵循不同的方法。

我們將在本文中詳細介紹Fabric,因為它擁有最活躍的社區,并且是最靈活的變體。由于其強大的模塊化,fabric是普遍可用的。 “你可以將Hyperledger Fabric視為類似于Apache Web Server”,Linux基金會Hyperledger執行董事Brian Behlendorf說。其他方法更多用于在有限的環境中實施特殊情況。

Hyperledger Fabric ——靈活的區塊鏈應用平臺

使用Fabric作為平臺,可以開發完全獨立的分布式分類帳解決方案。Fabric包含可以盡可能自由實現的概念。區塊鏈網絡的基礎是對所需組織結構的建模。每個參與者都有固定的身份,可以通過頒發的證書來識別自己。除了身份驗證之外,還包括授權。使用這種基于角色的系統,可以獲得許可區塊鏈中隱私和機密性的靈活方面。對于證書和參與者的管理,可以使用結構證書頒發機構(1.0版之前的成員服務提供者)。

資產的定義(要在區塊鏈上管理的項目)完全取決于區塊鏈應用程序。這些資產,例如來自汽車行業的引擎塊由JSON和/或二進制格式的鍵值對模型定義。

鏈代碼的概念旨在基于資產及其所有者實現業務邏輯。這可用于實現Go,Java或Node.js等語言中的規則,這些規則定義讀取權限或資產修改。執行鏈代碼功能可以讀取和返回資產和/或創建和修改資產并將它們存儲在本地分類帳數據庫中。在節點上的本地持久性更改之后,將更改提交給網絡(“認可”)并在其他組織接受后插入到區塊鏈中。在以太坊或其他公共區塊鏈平臺的背景下,可以將鏈碼與智能合約進行比較。

通道用于實現隱私領域。在最簡單的場景中,整個鏈代碼部署在所有參與者加入的單個通道上。但是,為了創建封裝區域并僅允許選定的參與者在其中進行通信,可以配置具有受限參與者組的通道。每個通道可以部署不同的鏈代碼,從而可以實現功能隔離。此外,可以使用AES部分或完全加密通道中的通信。

結果,在每個通道中維護一個分布式分類帳,這可以被想象為鏈接交易的現金簿。每個參與者為他們所屬的每個通道保留一份分類帳副本。這為網絡中的每個現有信道創建了區塊鏈數據結構。與區塊鏈一樣,交易存儲在塊中,這些塊在單個連接列表中成為加密鏈。

但是,為了向客戶端應用程序提供分類帳數據的單獨視圖,甚至可以執行針對網絡的復雜讀取請求。由于使用了像CouchDB這樣的面向文檔的數據庫,這是可能的。這為連接到Fabric網絡的客戶端提供了靈活的數據訪問。

使用Composer添加更簡單的概念

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鏈代碼應提供以下功能:

  • 1.生產具有唯一序列號的發動機缸體。
  • 2.生產后將發動機缸體傳送給經銷商。
  • 3.跟蹤車輛的序列號。
  • 4.將發動機缸體安裝到注冊車輛中。

下一步是安裝所需的工具和設置項目。

開發環境設置和項目創建

首先,需要安裝文檔中列出的Fabric的所有要求。然后我們安裝Composer和Composer及其相關工具本身的要求。

然后,最好讓自己熟悉新環境。如果我們完全按照上一個鏈接的說明操作,則fabric-tools現在位于我們的主目錄中。通過描述的腳本,我們可以在Docker-Compose中啟動一個簡單的Fabric網絡,獲得對等管理員訪問權限并停止并再次刪除它。首先,我們下載1.1版的Docker鏡像并啟動網絡:

  1. 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分支具有最終版本和工作版本。我們首先克隆存儲庫的初始分支。


現在我們在我們選擇的編輯器中打開文件夾。Visual Studio Code非常適合Composer,因為它具有可安裝的語法高亮擴展。稍作修改后你會發現它是一個NPM項目,所以我們從npm install開始安裝所有依賴項。使用npm test我們可以運行單元測試,使用npm run lint我們可以測試代碼樣式,并且使用npm run createArchive我們可以創建the.bna文件,我們以打包格式完成業務網絡定義。讓我們馬上試試看是否一切正常。

然后我們熟悉項目結構。lib文件夾包含實現交易處理器功能的JS文件。當然,我們想測試這個業務邏輯并將我們的單元測試存儲在test/文件夾中。模型定義(參與者,資產,交易等)在models/中。

我們想首先為所需的區塊鏈網絡建模。為此,我們刪除模型文件的內容,并在第一行為其指定一個新的命名空間

  1. namespace org.acme.enginesupplychain

我們為參與者制造商和經銷商建模,并使用Composer建模語言的繼承。我們還希望每個參與者除了姓名外還有一個可選地址。我們將這些屬性放入一個概念中:

  1. participant Member identified by memberId {
  2. o String memberId
  3. o String name
  4. o Address address optional
  5. }
  6. participant Manufacturer extends Member {
  7. }
  8. participant Merchant extends Member {
  9. }
  10. concept Address {
  11. o String country
  12. o String city
  13. o String street
  14. o String streetNo
  15. }

然后我們介紹我們網絡的資產:引擎塊和稍后安裝引擎的汽車。在這里,我們了解資產和參與者可以互相參考。引用始終指向任何類型的現有資源。我們以小“o”開頭的屬性總是存在于資源本身中。

  1. asset Engine identified by engineId {
  2. o String engineId
  3. o EngineProperties data
  4. --> Manufacturer manufacturer
  5. --> Car currentCar optional
  6. --> Merchant merchant optional
  7. }
  8. asset Car identified by carId {
  9. o String carId
  10. o String legalDocumentId
  11. }
  12. concept EngineProperties {
  13. o String brand
  14. o String model
  15. o Double horsePower
  16. o Double cubicCapacity
  17. o Integer cylindersAmount
  18. }

在對系統建模之后,我們定義了可以在現有資產和參與者之上執行的所有可用操作。這些是交易資源。之后,我們為以下每個交易模型測試并實現基礎交易邏輯。

  1. transaction EngineMerchantTransfer {
  2. --> Engine engine
  3. --> Merchant merchant
  4. }
  5. transaction EngineCarInstallation {
  6. --> Engine engine
  7. --> Car car
  8. }
  9. transaction EngineCreation {
  10. --> Manufacturer manufacturer
  11. o EngineProperties data
  12. }
  13. transaction CarCreation {
  14. o String legalIdDocument
  15. }

現在我們已經定義了可能發生的事情,我們可以在提交交易時開始實現它如何影響分類帳狀態。首先,我們致力于創建引擎資產。引擎應該以UUID格式獲得隨機生成的ID,并且應該從一開始就始終屬于制造商。所以我們清空logic.js文件并從頭開始。我們定義常量modelsNamespace和函數uuid,因為我們將更頻繁地需要它們。接下來是createEngineAsset函數。函數上方的文檔塊非常重要,以便Composer可以識別打包代碼時實現的交易類型。

  1. /* global getAssetRegistry getFactory */
  2. const modelsNamespace = 'org.acme.enginesupplychain'
  3. function uuid() {
  4. const s4 = () => Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1)
  5. return `${s4()}${s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`
  6. }
  7. /**
  8. * Creation of a Engine asset triggered by physical production.
  9. * @param {org.acme.enginesupplychain.EngineCreation} tx - the transaction to create an engine
  10. * @transaction
  11. */
  12. async function createEngineAsset(tx) { // eslint-disable-line no-unused-vars
  13. const engineRegistry = await getAssetRegistry(modelsNamespace + '.Engine')
  14. const engine = getFactory().newResource(modelsNamespace, 'Engine', uuid())
  15. const engineData = getFactory().newConcept(modelsNamespace, 'EngineProperties')
  16. engine.data = Object.assign(engineData, tx.data)
  17. engine.manufacturer = tx.manufacturer
  18. await engineRegistry.add(engine)
  19. }

通過這種方式,我們還實現了其他交易類型EngineMerchantTransfer,EngineCarInstallation和CarCreation。

  1. /**
  2. * An engine is transfered to a merchant.
  3. * @param {org.acme.enginesupplychain.EngineMerchantTransfer} tx - the engine transfer transaction
  4. * @transaction
  5. */
  6. async function transferEngineToMerchant(tx) { // eslint-disable-line no-unused-vars
  7. const engineRegistry = await getAssetRegistry(modelsNamespace + '.Engine')
  8. tx.engine.merchant = tx.merchant
  9. await engineRegistry.update(tx.engine)
  10. }
  11. /**
  12. * An engine is installed in a car.
  13. * @param {org.acme.enginesupplychain.EngineCarInstallation} tx - the engine into car installation transaction
  14. * @transaction
  15. */
  16. async function installEngineToCar(tx) { // eslint-disable-line no-unused-vars
  17. const engineRegistry = await getAssetRegistry(modelsNamespace + '.Engine')
  18. if (tx.car) {
  19. tx.engine.currentCar = tx.car
  20. await engineRegistry.update(tx.engine)
  21. } else {
  22. return Promise.reject('No target car was set on the transaction!')
  23. }
  24. }
  25. /**
  26. * A car is created.
  27. * @param {org.acme.enginesupplychain.CarCreation} tx - transaction to create a new car
  28. * @transaction
  29. */
  30. async function createCar(tx) { // eslint-disable-line no-unused-vars
  31. const carRegistry = await getAssetRegistry(modelsNamespace + '.Car')
  32. const factory = getFactory()
  33. const carId = uuid()
  34. const car = factory.newResource(modelsNamespace, 'Car', carId)
  35. car.legalDocumentId = tx.legalIdDocument
  36. await carRegistry.add(car)
  37. }

功能本身的單元測試相對簡單,如果我們有經驗,我們不需要了解更多。只有對此所需的對象的boostrapping仍然有點超載樣板代碼。測試首先啟動內存中的Fabric網絡,在其上安裝業務網絡,然后以默認管理員身份對其進行身份驗證。因為這個Composer提供了庫composer-admin,composer-client,composer-common和composer-connector-embedded。在測試設置之后,我們現在可以針對嵌入式網絡編寫測試用例。由于其長度,設置代碼未包含在列表中,但可以在test/EngineSupplychainSpec.js中的主分支上查看和測試。

用于測試交易類型的單元測試用例通常具有類似的模式。他們使用其屬性和關系重新創建交易,針對網絡執行交易,然后檢查所涉及的資產和參與者的數據狀態。我們來看看createEngineAsset的現有測試用例。

  1. describe(‘EngineSupplychainSpec’, () => {
  2. // setup is done in the before and beforeEach hook
  3. // results are the bnc (BusinessNetworkConnection), target namespace
  4. // as well as test assets, participants and required registries
  5. describe('createEngineAsset', () => {
  6. it('should create an Engine by submitting a valid EngineCreation transaction', async () => {
  7. const factory = bnc.getBusinessNetwork().getFactory()
  8. const engineCreationTrans = factory.newTransaction(namespace, 'EngineCreation')
  9. engineCreationTrans.data = factory.newConcept(namespace, 'EngineProperties')
  10. engineCreationTrans.data.brand = 'Audi'
  11. engineCreationTrans.data.model = 'Fancy engine model'
  12. engineCreationTrans.data.horsePower = 400
  13. engineCreationTrans.data.cubicCapacity = 4000
  14. engineCreationTrans.data.cylindersAmount = 10
  15. const manufacturerRegistry = await bnc.getParticipantRegistry(namespace + '.Manufacturer')
  16. await manufacturerRegistry.addAll([])
  17. engineCreationTrans.manufacturer = factory.newRelationship(namespace, 'Manufacturer', testManufacturer.$identifier)
  18. await bnc.submitTransaction(engineCreationTrans)
  19. const allEngines = await engineRegistry.getAll()
  20. allEngines.length.should.equal(2)
  21. })
  22. })
  23. })

在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和Composer實現區塊鏈應用程序
當前網址:http://m.newbst.com/news26/104326.html

成都網站建設公司_創新互聯,為您提供靜態網站商城網站虛擬主機域名注冊企業網站制作關鍵詞優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設