使用Hyperledger Fabric和Composer實(shí)現(xiàn)區(qū)塊鏈應(yīng)用程序

目前無(wú)法繞過(guò)技術(shù)領(lǐng)域的是區(qū)塊鏈話題台谢。但除了加密貨幣之外赏胚,還有更多有趣的應(yīng)用程序可以帶來(lái)許多激動(dòng)人心的軟件生態(tài)系統(tǒng)斧吐。這也適用于Hyperledger項(xiàng)目,該項(xiàng)目提供了一個(gè)非常模塊化的區(qū)塊鏈框架冰寻。讓我們看看使用Hyperledger Fabric和Composer實(shí)現(xiàn)區(qū)塊鏈應(yīng)用程序是多么容易须教。

關(guān)于項(xiàng)目Hyperledger

Hyperledger是一個(gè)umbrella項(xiàng)目的名稱,在該項(xiàng)目下開(kāi)源區(qū)塊鏈方法和工具是協(xié)同開(kāi)發(fā)的斩芭。它由Linux基金會(huì)于2015年推出轻腺,并享有IBM,英特爾和富士通等軟件巨頭以及大型社區(qū)的熱烈參與划乖。Hyperledger的GitHub存儲(chǔ)庫(kù)目前比以往更加活躍贬养。任何人都可以參與開(kāi)發(fā)。

在Hyperledger中迁筛,不僅開(kāi)發(fā)了單個(gè)區(qū)塊鏈框架(或平臺(tái))煤蚌。相反,重點(diǎn)是并行采用多種方法细卧,創(chuàng)造協(xié)同效應(yīng)尉桩,可重復(fù)使用的組件和靈活性。從Hyperledger概念的角度來(lái)看贪庙,區(qū)塊鏈網(wǎng)絡(luò)與比特幣或以太網(wǎng)等加密貨幣的代表無(wú)法比較蜘犁。相反,Hyperledger網(wǎng)絡(luò)的節(jié)點(diǎn)分布在參與組織中止邮,這使得私有这橙,許可或聯(lián)盟區(qū)塊鏈網(wǎng)絡(luò)特別有趣奏窑。首先,我們可以忘記公共區(qū)塊鏈的工作證明屈扎,股權(quán)證明和其他共識(shí)機(jī)制埃唯。所涉及的組織從應(yīng)用程序業(yè)務(wù)價(jià)值和所涉及的信任中作為聯(lián)合體驗(yàn)證彼此的交易和利益。這也很大程度上解決了可擴(kuò)展性問(wèn)題(我們從比特幣網(wǎng)絡(luò)中了解到)并且可以實(shí)現(xiàn)高交易吞吐量鹰晨。

image

項(xiàng)目Hyperledger的不同區(qū)塊鏈方法是Fabric墨叛,Burrow,Iroha模蜡,Indy和Sawtooth漠趁。私有,許可和聯(lián)合區(qū)塊鏈可以與所有這些區(qū)塊鏈一起開(kāi)發(fā)忍疾,但每種實(shí)現(xiàn)都遵循不同的方法闯传。

我們將在本文中詳細(xì)介紹Fabric,因?yàn)樗鼡碛凶罨钴S的社區(qū)卤妒,并且是最靈活的變體甥绿。由于其強(qiáng)大的模塊化,fabric是普遍可用的荚孵。 “你可以將Hyperledger Fabric視為類似于Apache Web Server”妹窖,Linux基金會(huì)Hyperledger執(zhí)行董事Brian Behlendorf說(shuō)纬朝。其他方法更多用于在有限的環(huán)境中實(shí)施特殊情況收叶。

Hyperledger Fabric ——靈活的區(qū)塊鏈應(yīng)用平臺(tái)

使用Fabric作為平臺(tái),可以開(kāi)發(fā)完全獨(dú)立的分布式分類帳解決方案共苛。Fabric包含可以盡可能自由實(shí)現(xiàn)的概念判没。區(qū)塊鏈網(wǎng)絡(luò)的基礎(chǔ)是對(duì)所需組織結(jié)構(gòu)的建模。每個(gè)參與者都有固定的身份隅茎,可以通過(guò)頒發(fā)的證書來(lái)識(shí)別自己澄峰。除了身份驗(yàn)證之外,還包括授權(quán)辟犀。使用這種基于角色的系統(tǒng)俏竞,可以獲得許可區(qū)塊鏈中隱私和機(jī)密性的靈活方面。對(duì)于證書和參與者的管理堂竟,可以使用結(jié)構(gòu)證書頒發(fā)機(jī)構(gòu)(1.0版之前的成員服務(wù)提供者)魂毁。

資產(chǎn)的定義(要在區(qū)塊鏈上管理的項(xiàng)目)完全取決于區(qū)塊鏈應(yīng)用程序。這些資產(chǎn)出嘹,例如來(lái)自汽車行業(yè)的引擎塊由JSON和/或二進(jìn)制格式的鍵值對(duì)模型定義席楚。

鏈代碼的概念旨在基于資產(chǎn)及其所有者實(shí)現(xiàn)業(yè)務(wù)邏輯。這可用于實(shí)現(xiàn)Go税稼,Java或Node.js等語(yǔ)言中的規(guī)則烦秩,這些規(guī)則定義讀取權(quán)限或資產(chǎn)修改垮斯。執(zhí)行鏈代碼功能可以讀取和返回資產(chǎn)和/或創(chuàng)建和修改資產(chǎn)并將它們存儲(chǔ)在本地分類帳數(shù)據(jù)庫(kù)中。在節(jié)點(diǎn)上的本地持久性更改之后只祠,將更改提交給網(wǎng)絡(luò)(“認(rèn)可”)并在其他組織接受后插入到區(qū)塊鏈中兜蠕。在以太坊或其他公共區(qū)塊鏈平臺(tái)的背景下,可以將鏈碼與智能合約進(jìn)行比較抛寝。

image

通道用于實(shí)現(xiàn)隱私領(lǐng)域牺氨。在最簡(jiǎn)單的場(chǎng)景中,整個(gè)鏈代碼部署在所有參與者加入的單個(gè)通道上墩剖。但是猴凹,為了創(chuàng)建封裝區(qū)域并僅允許選定的參與者在其中進(jìn)行通信,可以配置具有受限參與者組的通道岭皂。每個(gè)通道可以部署不同的鏈代碼郊霎,從而可以實(shí)現(xiàn)功能隔離。此外爷绘,可以使用AES部分或完全加密通道中的通信书劝。

結(jié)果,在每個(gè)通道中維護(hù)一個(gè)分布式分類帳土至,這可以被想象為鏈接交易的現(xiàn)金簿购对。每個(gè)參與者為他們所屬的每個(gè)通道保留一份分類帳副本。這為網(wǎng)絡(luò)中的每個(gè)現(xiàn)有信道創(chuàng)建了區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)陶因。與區(qū)塊鏈一樣骡苞,交易存儲(chǔ)在塊中,這些塊在單個(gè)連接列表中成為加密鏈楷扬。

但是解幽,為了向客戶端應(yīng)用程序提供分類帳數(shù)據(jù)的單獨(dú)視圖,甚至可以執(zhí)行針對(duì)網(wǎng)絡(luò)的復(fù)雜讀取請(qǐng)求烘苹。由于使用了像CouchDB這樣的面向文檔的數(shù)據(jù)庫(kù)躲株,這是可能的。這為連接到Fabric網(wǎng)絡(luò)的客戶端提供了靈活的數(shù)據(jù)訪問(wèn)镣衡。

使用Composer添加更簡(jiǎn)單的概念

Hyperledger-Composer是Hyperledger生態(tài)系統(tǒng)中的工具之一霜定。你可以將其視為Fabric的框架。如果你想開(kāi)發(fā)廊鸥,構(gòu)建和管理Fabric網(wǎng)絡(luò)望浩,那么即使不是強(qiáng)制性的,也是實(shí)用的黍图。它引入了基于Fabric的進(jìn)一步概念曾雕,以提供精美的抽象概念。

除資產(chǎn)外助被,還可以在Composer建模語(yǔ)言中定義網(wǎng)絡(luò)參與者剖张,交易和事件的方案切诀。每種交易類型的流都通過(guò)JavaScript代碼在簡(jiǎn)單的API上實(shí)現(xiàn)。訪問(wèn)控制文件可用于限制參與者對(duì)某些資源的訪問(wèn)權(quán)限搔弄》牵可以在Composer Query Language中定義對(duì)分類帳中數(shù)據(jù)的常用查詢,這是一種類似SQL的語(yǔ)言顾犹。

然后倒庵,必須將所有必需文件打包到.bna文件中的BND(業(yè)務(wù)網(wǎng)絡(luò)定義)。然后炫刷,可以將此存檔安裝在現(xiàn)有Fabric網(wǎng)絡(luò)上擎宝。BND的源代碼當(dāng)然可以在我們首選的編輯器中進(jìn)行本地開(kāi)發(fā)和測(cè)試,因此可以通過(guò)Git進(jìn)行版本控制浑玛。對(duì)于原型設(shè)計(jì)和演示目的绍申,有Composer Playground。這提供了一個(gè)現(xiàn)代顾彰,清晰且直觀可用的Web界面极阅,可訪問(wèn)Composer CLI的本地配置。使用Playground涨享,你可以輕松創(chuàng)建筋搏,安裝,測(cè)試厕隧,編輯奔脐,導(dǎo)入和導(dǎo)出BND。

image

在Composer Playground中栏账,你可以以用戶友好的方式安裝帖族,修改和測(cè)試新的業(yè)務(wù)網(wǎng)絡(luò)栈源,而無(wú)需先前的樣本區(qū)塊鏈應(yīng)用知識(shí)(例如車輛生命周期挡爵,汽車拍賣或農(nóng)場(chǎng)動(dòng)物跟蹤)。在設(shè)置工具之后甚垦,可以在本地完成相同的操作茶鹃,這樣我們就可以在短時(shí)間玩游戲后離開(kāi)托管游樂(lè)場(chǎng)。這個(gè)游樂(lè)場(chǎng)非常適合使用原型驗(yàn)證想法并了解底層的Composer和Fabric模型艰亮。

使用案例:引擎塊的供應(yīng)鏈跟蹤

為了使用Hyperledger-Fabric和Composer實(shí)現(xiàn)私有區(qū)塊鏈網(wǎng)絡(luò)闭翩,以汽車行業(yè)的發(fā)動(dòng)機(jī)組跟蹤為例。在這種情況下迄埃,有制造商和經(jīng)銷商作為網(wǎng)絡(luò)參與者疗韵。發(fā)動(dòng)機(jī)及其安裝的車輛顯示為資產(chǎn)。制造商和經(jīng)銷商的公司被引入并被識(shí)別為網(wǎng)絡(luò)中的組織侄非。

Fabric鏈代碼應(yīng)提供以下功能:

  • 1.生產(chǎn)具有唯一序列號(hào)的發(fā)動(dòng)機(jī)缸體蕉汪。
  • 2.生產(chǎn)后將發(fā)動(dòng)機(jī)缸體傳送給經(jīng)銷商流译。
  • 3.跟蹤車輛的序列號(hào)。
  • 4.將發(fā)動(dòng)機(jī)缸體安裝到注冊(cè)車輛中者疤。

下一步是安裝所需的工具和設(shè)置項(xiàng)目福澡。

開(kāi)發(fā)環(huán)境設(shè)置和項(xiàng)目創(chuàng)建

首先,需要安裝文檔中列出的Fabric的所有要求驹马。然后我們安裝Composer和Composer及其相關(guān)工具本身的要求革砸。

然后,最好讓自己熟悉新環(huán)境糯累。如果我們完全按照上一個(gè)鏈接的說(shuō)明操作算利,則fabric-tools現(xiàn)在位于我們的主目錄中。通過(guò)描述的腳本泳姐,我們可以在Docker-Compose中啟動(dòng)一個(gè)簡(jiǎn)單的Fabric網(wǎng)絡(luò)笔时,獲得對(duì)等管理員訪問(wèn)權(quán)限并停止并再次刪除它。首先仗岸,我們下載1.1版的Docker鏡像并啟動(dòng)網(wǎng)絡(luò):

export FABRIC_VERSION=hlfv11 && ./downloadFabric.sh && ./startFabric.sh

在網(wǎng)絡(luò)運(yùn)行時(shí)允耿,composer-playground web-UI可以通過(guò)composer-playground啟動(dòng)。它使用composer-cli的所有托管配置并訪問(wèn)正在運(yùn)行的Fabric網(wǎng)絡(luò)扒怖。從現(xiàn)在開(kāi)始较锡,我們將Fabric視為可配置的平臺(tái)/基礎(chǔ)架構(gòu),其狀態(tài)通過(guò)合適的工具進(jìn)行更改盗痒。我們不直接使用Fabric概念開(kāi)發(fā)鏈代碼蚂蕴,權(quán)限或任何模型,因?yàn)镃omposer提供了更多優(yōu)勢(shì)俯邓。

實(shí)施功能

現(xiàn)在我們?cè)谖覀冞x擇的目錄中創(chuàng)建我們的BND項(xiàng)目骡楼。對(duì)于Yeoman(使用模板設(shè)置項(xiàng)目的代碼生成器,如Maven Archtypes)稽鞭,有一個(gè)模板(hyperledger-composer:businessnetwork鸟整。但是,我已經(jīng)準(zhǔn)備了一個(gè)存儲(chǔ)庫(kù)朦蕴,我們現(xiàn)在也可以使用JavaScript ES6和一些很好的工具篮条。我們應(yīng)該從開(kāi)始分支“初始”開(kāi)始。master分支具有最終版本和工作版本吩抓。我們首先克隆存儲(chǔ)庫(kù)的初始分支涉茧。

git clone -b initial git@github.com:jverhoelen/fabric-composer-engine-supplychain.git

現(xiàn)在我們?cè)谖覀冞x擇的編輯器中打開(kāi)文件夾。Visual Studio Code非常適合Composer疹娶,因?yàn)樗哂锌砂惭b的語(yǔ)法高亮擴(kuò)展伴栓。稍作修改后你會(huì)發(fā)現(xiàn)它是一個(gè)NPM項(xiàng)目,所以我們從npm install開(kāi)始安裝所有依賴項(xiàng)。使用npm test我們可以運(yùn)行單元測(cè)試钳垮,使用npm run lint我們可以測(cè)試代碼樣式除师,并且使用npm run createArchive我們可以創(chuàng)建the.bna文件,我們以打包格式完成業(yè)務(wù)網(wǎng)絡(luò)定義扔枫。讓我們馬上試試看是否一切正常汛聚。

然后我們熟悉項(xiàng)目結(jié)構(gòu)。lib文件夾包含實(shí)現(xiàn)交易處理器功能的JS文件短荐。當(dāng)然倚舀,我們想測(cè)試這個(gè)業(yè)務(wù)邏輯并將我們的單元測(cè)試存儲(chǔ)在test/文件夾中。模型定義(參與者忍宋,資產(chǎn)痕貌,交易等)在models/中。

我們想首先為所需的區(qū)塊鏈網(wǎng)絡(luò)建模糠排。為此舵稠,我們刪除模型文件的內(nèi)容,并在第一行為其指定一個(gè)新的命名空間:

namespace org.acme.enginesupplychain

我們?yōu)閰⑴c者制造商和經(jīng)銷商建模入宦,并使用Composer建模語(yǔ)言的繼承哺徊。我們還希望每個(gè)參與者除了姓名外還有一個(gè)可選地址。我們將這些屬性放入一個(gè)概念中:

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
}

然后我們介紹我們網(wǎng)絡(luò)的資產(chǎn):引擎塊和稍后安裝引擎的汽車乾闰。在這里落追,我們了解資產(chǎn)和參與者可以互相參考。引用始終指向任何類型的現(xiàn)有資源涯肩。我們以小“o”開(kāi)頭的屬性總是存在于資源本身中轿钠。

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
}

在對(duì)系統(tǒng)建模之后,我們定義了可以在現(xiàn)有資產(chǎn)和參與者之上執(zhí)行的所有可用操作病苗。這些是交易資源疗垛。之后,我們?yōu)橐韵旅總€(gè)交易模型測(cè)試并實(shí)現(xiàn)基礎(chǔ)交易邏輯硫朦。

transaction EngineMerchantTransfer {
    --> Engine engine
    --> Merchant merchant
}
 
transaction EngineCarInstallation {
    --> Engine engine
    --> Car car
}
 
transaction EngineCreation {
    --> Manufacturer manufacturer
    o EngineProperties data
}
 
transaction CarCreation {
    o String legalIdDocument
}

現(xiàn)在我們已經(jīng)定義了可能發(fā)生的事情贷腕,我們可以在提交交易時(shí)開(kāi)始實(shí)現(xiàn)它如何影響分類帳狀態(tài)。首先阵幸,我們致力于創(chuàng)建引擎資產(chǎn)花履。引擎應(yīng)該以UUID格式獲得隨機(jī)生成的ID,并且應(yīng)該從一開(kāi)始就始終屬于制造商挚赊。所以我們清空logic.js文件并從頭開(kāi)始。我們定義常量modelsNamespace和函數(shù)uuid济瓢,因?yàn)槲覀儗⒏l繁地需要它們荠割。接下來(lái)是createEngineAsset函數(shù)。函數(shù)上方的文檔塊非常重要,以便Composer可以識(shí)別打包代碼時(shí)實(shí)現(xiàn)的交易類型蔑鹦。

/* 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)
}

通過(guò)這種方式夺克,我們還實(shí)現(xiàn)了其他交易類型EngineMerchantTransferEngineCarInstallationCarCreation嚎朽。

/**
* 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)
}

功能本身的單元測(cè)試相對(duì)簡(jiǎn)單铺纽,如果我們有經(jīng)驗(yàn),我們不需要了解更多哟忍。只有對(duì)此所需的對(duì)象的boostrapping仍然有點(diǎn)超載樣板代碼狡门。測(cè)試首先啟動(dòng)內(nèi)存中的Fabric網(wǎng)絡(luò),在其上安裝業(yè)務(wù)網(wǎng)絡(luò)锅很,然后以默認(rèn)管理員身份對(duì)其進(jìn)行身份驗(yàn)證其馏。因?yàn)檫@個(gè)Composer提供了庫(kù)composer-admincomposer-client爆安,composer-commoncomposer-connector-embedded叛复。在測(cè)試設(shè)置之后,我們現(xiàn)在可以針對(duì)嵌入式網(wǎng)絡(luò)編寫測(cè)試用例扔仓。由于其長(zhǎng)度褐奥,設(shè)置代碼未包含在列表中,但可以在test/EngineSupplychainSpec.js中的主分支上查看和測(cè)試翘簇。

用于測(cè)試交易類型的單元測(cè)試用例通常具有類似的模式抖僵。他們使用其屬性和關(guān)系重新創(chuàng)建交易,針對(duì)網(wǎng)絡(luò)執(zhí)行交易缘揪,然后檢查所涉及的資產(chǎn)和參與者的數(shù)據(jù)狀態(tài)耍群。我們來(lái)看看createEngineAsset的現(xiàn)有測(cè)試用例。

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中實(shí)現(xiàn)業(yè)務(wù)網(wǎng)絡(luò)定義的方法應(yīng)該通過(guò)這些見(jiàn)解變得清晰找筝。此外蹈垢,BND可以為我們定義更多的東西。在permissions.acl中袖裕,你可以使用訪問(wèn)控制語(yǔ)言為給定簡(jiǎn)單條件的參與者定義訪問(wèn)限制曹抬。對(duì)于許多應(yīng)用程序,事件和查詢功能也非常有用和有趣急鳄。

最后谤民,我們來(lái)看看主分支上的解決方案。所有這些要求都已在其中實(shí)施和測(cè)試疾宏。我們現(xiàn)在用npm run createArchive生成完成的.bna文件张足,然后在dist/文件夾中。我們現(xiàn)在可以將它導(dǎo)入到我們?cè)诳刂婆_(tái)中啟動(dòng)的Composer Playground中坎藐,以便在我們的本地Fabric網(wǎng)絡(luò)上進(jìn)行嘗試为牍。通過(guò)Web UI的方式應(yīng)該是不言自明的哼绑,但它也是正式記錄的。

總結(jié)和展望

我們已經(jīng)了解了Hyperledger項(xiàng)目的重要部分碉咆。具體來(lái)說(shuō)抖韩,我們現(xiàn)在知道Fabric作為具有基本概念的區(qū)塊鏈平臺(tái)。Composer添加了許多重要概念疫铜,使開(kāi)發(fā)人員可以非常方便地實(shí)施和管理區(qū)塊鏈網(wǎng)絡(luò)茂浮。通過(guò)實(shí)施的關(guān)于發(fā)動(dòng)機(jī)缸體生產(chǎn)和跟蹤的區(qū)塊鏈應(yīng)用案例,我們了解了一個(gè)簡(jiǎn)單但功能強(qiáng)大的私人/聯(lián)盟區(qū)塊鏈用例壳咕。

最終的區(qū)塊鏈網(wǎng)絡(luò)最初只在本地執(zhí)行席揽。我們還沒(méi)有擴(kuò)展同行組織和訂購(gòu)服務(wù)的配置。但我們可以輕松添加更多組織并通過(guò)多個(gè)主機(jī)分發(fā)對(duì)等節(jié)點(diǎn)囱井。對(duì)于由真正的組織聯(lián)盟跨越的區(qū)塊鏈網(wǎng)絡(luò)驹尼,我們?nèi)匀挥幸恍﹩?wèn)題需要解決:

我們?nèi)绾喂芾斫M織和對(duì)等節(jié)點(diǎn)?組織如何自動(dòng)將新的對(duì)等節(jié)點(diǎn)添加到網(wǎng)絡(luò)中庞呕?我們?nèi)绾潍@得一個(gè)可以抵御失敗的公平和同質(zhì)的網(wǎng)絡(luò)新翎?客戶如何與網(wǎng)絡(luò)通信?

這個(gè)仍然年輕的平臺(tái)已經(jīng)提供了很多功能和舒適性住练。但是地啰,仍有許多任務(wù)需要完成。從開(kāi)發(fā)人員的角度來(lái)看讲逛,單元測(cè)試代碼看起來(lái)仍然非常臃腫亏吝。很快就會(huì)出現(xiàn)庫(kù),通過(guò)它可以更容易地實(shí)現(xiàn)通常的測(cè)試模式盏混。我們迫切希望看到Hyperledger等項(xiàng)目將如何繼續(xù)推動(dòng)業(yè)務(wù)中分布式賬本技術(shù)的適應(yīng)性。

故障排除

確保所有工具都與Fabric 1.1兼容许赃。這意味著必須下載此版本的所有docker鏡像。應(yīng)安裝最新版本的Composer和Composer Playground混聊。目前是v0.19.1。本文中Fabric和Composer文檔的所有鏈接都是故意修復(fù)到Fabric 1.1和最新的Composer版本句喜。

======================================================================

分享一些Hyperledger fabric、以太坊咳胃、比特幣、EOS向图、Tendermint等區(qū)塊鏈相關(guān)的交互式在線編程實(shí)戰(zhàn)教程:

  • Hyperledger Fabric 區(qū)塊鏈開(kāi)發(fā)詳解泳秀,本課程面向初學(xué)者榄攀,內(nèi)容即包含Hyperledger Fabric的身份證書與MSP服務(wù)金句、權(quán)限策略檩赢、信道配置與啟動(dòng)、鏈碼通信接口等核心概念违寞,也包含F(xiàn)abric網(wǎng)絡(luò)設(shè)計(jì)贞瞒、nodejs鏈碼與應(yīng)用開(kāi)發(fā)的操作實(shí)踐,是Nodejs工程師學(xué)習(xí)Fabric區(qū)塊鏈開(kāi)發(fā)的最佳選擇趁曼。
  • Hyperledger Fabric java 區(qū)塊鏈開(kāi)發(fā)詳解军浆,課程面向初學(xué)者,內(nèi)容即包含Hyperledger Fabric的身份證書與MSP服務(wù)挡闰、權(quán)限策略乒融、信道配置與啟動(dòng)、鏈碼通信接口等核心概念摄悯,也包含F(xiàn)abric網(wǎng)絡(luò)設(shè)計(jì)赞季、java鏈碼與應(yīng)用開(kāi)發(fā)的操作實(shí)踐,是java工程師學(xué)習(xí)Fabric區(qū)塊鏈開(kāi)發(fā)的最佳選擇奢驯。
  • java以太坊開(kāi)發(fā)教程申钩,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的web3j詳解。
  • python以太坊瘪阁,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的詳解撒遣。
  • php以太坊,主要是介紹使用php進(jìn)行智能合約開(kāi)發(fā)交互管跺,進(jìn)行賬號(hào)創(chuàng)建义黎、交易、轉(zhuǎn)賬伙菜、代幣開(kāi)發(fā)以及過(guò)濾器和交易等內(nèi)容轩缤。
  • 以太坊入門教程,主要介紹智能合約與dapp應(yīng)用開(kāi)發(fā)贩绕,適合入門火的。
  • 以太坊開(kāi)發(fā)進(jìn)階教程,主要是介紹使用node.js淑倾、mongodb馏鹤、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn)娇哆,適合進(jìn)階勃救。
  • ERC721以太坊通證實(shí)戰(zhàn)蒙秒,課程以一個(gè)數(shù)字藝術(shù)品創(chuàng)作與分享DApp的實(shí)戰(zhàn)開(kāi)發(fā)為主線宵统,深入講解以太坊非同質(zhì)化通證的概念马澈、標(biāo)準(zhǔn)與開(kāi)發(fā)方案痊班。內(nèi)容包含ERC-721標(biāo)準(zhǔn)的自主實(shí)現(xiàn)涤伐,講解OpenZeppelin合約代碼庫(kù)二次開(kāi)發(fā)废亭,實(shí)戰(zhàn)項(xiàng)目采用Truffle豆村,IPFS掌动,實(shí)現(xiàn)了通證以及去中心化的通證交易所粗恢。
  • C#以太坊,主要講解如何使用C#開(kāi)發(fā)基于.Net的以太坊應(yīng)用匙赞,包括賬戶管理涌庭、狀態(tài)與交易坐榆、智能合約開(kāi)發(fā)與交互席镀、過(guò)濾器和交易等豪诲。
  • java比特幣開(kāi)發(fā)教程,本課程面向初學(xué)者焊切,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)刹勃、去中心化共識(shí)機(jī)制荔仁、密鑰與腳本乏梁、交易與UTXO等遇骑,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能落萎,例如創(chuàng)建地址练链、管理錢包媒鼓、構(gòu)造裸交易等途戒,是Java工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程湖员。
  • php比特幣開(kāi)發(fā)教程娜庇,本課程面向初學(xué)者再登,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)梯嗽、去中心化共識(shí)機(jī)制灯节、密鑰與腳本炎疆、交易與UTXO等形入,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能亿遂,例如創(chuàng)建地址蛇数、管理錢包耳舅、構(gòu)造裸交易等挽放,是Php工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程辑畦。
  • c#比特幣開(kāi)發(fā)教程纯出,本課程面向初學(xué)者暂筝,內(nèi)容即涵蓋比特幣的核心概念焕襟,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制务漩、密鑰與腳本饵骨、交易與UTXO等居触,同時(shí)也詳細(xì)講解如何在C#代碼中集成比特幣支持功能,例如創(chuàng)建地址制市、管理錢包息堂、構(gòu)造裸交易等,是C#工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程床未。
  • EOS入門教程薇搁,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開(kāi)發(fā)啃洋,內(nèi)容涵蓋EOS工具鏈宏娄、賬戶與錢包孵坚、發(fā)行代幣、智能合約開(kāi)發(fā)與部署巍杈、使用代碼與智能合約交互等核心知識(shí)點(diǎn)筷畦,最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開(kāi)發(fā)鳖宾。
  • 深入淺出玩轉(zhuǎn)EOS錢包開(kāi)發(fā),本課程以手機(jī)EOS錢包的完整開(kāi)發(fā)過(guò)程為主線帅刊,深入學(xué)習(xí)EOS區(qū)塊鏈應(yīng)用開(kāi)發(fā)赖瞒,課程內(nèi)容即涵蓋賬戶栏饮、計(jì)算資源袍嬉、智能合約伺通、動(dòng)作與交易等EOS區(qū)塊鏈的核心概念罐监,同時(shí)也講解如何使用eosjs和eosjs-ecc開(kāi)發(fā)包訪問(wèn)EOS區(qū)塊鏈弓柱,以及如何在React前端應(yīng)用中集成對(duì)EOS區(qū)塊鏈的支持矢空。課程內(nèi)容深入淺出禀横,非常適合前端工程師深入學(xué)習(xí)EOS區(qū)塊鏈應(yīng)用開(kāi)發(fā)燕侠。
  • tendermint區(qū)塊鏈開(kāi)發(fā)詳解绢彤,本課程適合希望使用tendermint進(jìn)行區(qū)塊鏈開(kāi)發(fā)的工程師,課程內(nèi)容即包括tendermint應(yīng)用開(kāi)發(fā)模型中的核心概念械巡,例如ABCI接口讥耗、默克爾樹(shù)古程、多版本狀態(tài)庫(kù)等雇逞,也包括代幣發(fā)行等豐富的實(shí)操代碼茁裙,是go語(yǔ)言工程師快速入門區(qū)塊鏈開(kāi)發(fā)的最佳選擇晤锥。

匯智網(wǎng)原創(chuàng)翻譯矾瘾,轉(zhuǎn)載請(qǐng)標(biāo)明出處霜威。這里是原文使用Hyperledger Fabric和Composer實(shí)現(xiàn)區(qū)塊鏈應(yīng)用程序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市大猛,隨后出現(xiàn)的幾起案子挽绩,更是在濱河造成了極大的恐慌唉堪,老刑警劉巖唠亚,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡前酿,警方通過(guò)查閱死者的電腦和手機(jī)罢维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門肺孵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悬槽,“玉大人初婆,你說(shuō)我怎么就攤上這事”浊伲” “怎么了敲董?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵腋寨,是天一觀的道長(zhǎng)萄窜。 經(jīng)常有香客問(wèn)我查刻,道長(zhǎng)穗泵,這世上最難降的妖魔是什么火欧? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任赶盔,我火速辦了婚禮于未,結(jié)果婚禮上烘浦,老公的妹妹穿的比我還像新娘。我一直安慰自己萍鲸,他們只是感情好闷叉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脊阴,像睡著了一般握侧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘿期,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天品擎,我揣著相機(jī)與錄音,去河邊找鬼备徐。 笑死秀菱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蓖救。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了香府?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝗柔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嬉橙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斧拍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年昂勉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗓袱。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奇颠,死狀恐怖荆几,靈堂內(nèi)的尸體忽然破棺而出诞吱,到底是詐尸還是另有隱情,我是刑警寧澤暴浦,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布躁锁,位于F島的核電站啄踊,受9級(jí)特大地震影響顿锰,放射性物質(zhì)發(fā)生泄漏淀歇。R本人自食惡果不足惜纳决,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄屡。 院中可真熱鬧,春花似錦挑豌、人聲如沸铐拐。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒙保。三九已至昧互,卻和暖如春茄菊,著一層夾襖步出監(jiān)牢的瞬間辽幌,已是汗流浹背乌企。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捌归。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親炼邀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驻仅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 我們?yōu)橄MM快學(xué)習(xí)Hyperledger fabric 的java工程師上線了一門教程Fabric java 區(qū)塊...
    編程狂魔閱讀 3,467評(píng)論 0 2
  • Hyperledger Hyperledger is an open source collaborative e...
    黑馬程序員小華華閱讀 1,513評(píng)論 1 4
  • ??感賞我的孩子們給我買了生日蛋糕,上面寫著十年育樹(shù)百年育人登渣。我好感動(dòng),第一次當(dāng)班主任和老師毡泻,能收到那么多學(xué)生的愛(ài)...
    幸福萍寶閱讀 214評(píng)論 0 3
  • 它躲在我們每個(gè)人的心里 很多時(shí)候他會(huì)不自覺(jué)的跑出來(lái) 很多人都不敢面對(duì) 不斷逃避 卻發(fā)現(xiàn)它和和我們?cè)絹?lái)越近 孤獨(dú)充滿...
    董輝_e155閱讀 170評(píng)論 0 0
  • 每天堅(jiān)持感恩一切都會(huì)非常美好胜茧,時(shí)刻覺(jué)察自己的意識(shí)。 感恩兒子的脾氣讓我看到我自己對(duì)他的控制欲仇味,現(xiàn)在用六時(shí)書覺(jué)察自己...
    生活就該甜甜蜜蜜閱讀 136評(píng)論 0 0