目前没法绕过技术领域的是区块链话题。但除了加密货币以外,还有更多有趣的应用程序能够带来许多激动人心的软件生态系统。这也适用于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实现区块链应用程序