选择私人区块链技术:Hyperledger Composer

简介:

选择私人区块链技术:Hyperledger Composer

1620

Hyperledger Composer架构

欢迎参加“选择私人区块链技术”系列的第二部分(第1部分在这里)。在每篇文章中,我们都会实现一个简单的用例来概述现有技术的作用以及它如何在企业中发挥作用。

最初,这篇文章本来将是关于Hyperledger Fabric,但是在了解了Hyperledger Composer之后,很显然,首先写出这些内容是有好处的。这将使我们能够更高层次地了解可以在Hyperledger Fabric区块链上构建哪种类型的业务应用程序,并更轻松地理解Fabric本身的用途。

商业用例

让我们先从part1中定义的在金融行业的人工简单用例开始。以下是这个用例中的各部分:

  • 非托管资产管理者(对冲基金):做出投资决策(交易)。非托管意味着他们实际上并不持有客户的钱。相反,交易执行后,他们会发送一些指令给托管人,以便适当地调拨资金。
  • 托管人:通常是一家大型且值得信赖的金融机构,持有客户的资金并代表对冲基金执行转账。托管人需要了解每笔交易以向交易方付款。
  • 客户:投资于对冲基金。每个客户需要在自己的账户中查看交易,而不是其他客户的账户。

让我们看看我们能够如何使用Hyperledger Composer来明确这个用例中的所有参与者,并使他们能够共享适当的信息。

什么是Hyperledger  Composer?

Hyperledger Composer是一个更高级别的工具集和框架,用于在Hyperledger Fabric区块链之上快速构建和运行应用程序。如果Fabric是网络级别,那么Composer是应用程序级别的。我们可以使用它给那些能在Fabric通道内部署和执行的应用程序定义数据模型、业务逻辑和访问控制列表。此类应用程序的用户不必运行本地节点,并如果需要的话可通过RPC或HTTP REST与远程节点交互。

Composer配备了一个出色的网络环境,它允许用户在浏览器中创建应用程序原型而无需设置本地网络。我们将使用这个环境来实施和测试我们的用例。在未来的文章中,我们将导出“商业网络定义”并将其部署到真正的Hyperledger Fabric区块链。

解决方案

解决方案的完整代码可以在这里找到。我们将了解到如何使用Composer Playground逐步配置每一部分。

1.创建网络

选择“部署新的商业网络”并填写所需的信息。在我的情况下,网络的名称是'对冲基金网络',管理卡名称是admin @ hedge-fund-network。选择'空商业网络'模板并点击部署。这将创建一个空的商业网络和一个完全控制它的管理员身份。在创建商业网络后,我们可以通过按'立即连接'连接到它。

2.配置对象模型

Composer有自己的对象建模语言,非常简单易用。有四种类型的资源可以定义:

  • 资产。在应用程序中正在被跟踪的事物。在我们的情况下,我们追踪大量交易的证券块。
  • 参与者。与网络交互的实体。每个人都有自己的权限。
  • 交易。被发送以更新资产或参与者以及执行自定义逻辑。
  • 事件。可以从事务逻辑中发出并由参与者订阅。

现在,让我们创建一个名为'org.acme.mynetwork.cto'的模型文件并添加以下代码。该文件定义了3种参与者类型(交易者,客户,托管人),批次资产,交易交易和NewTrade事件。

/ **
 *我的商品交易网络
 * / 
namespace org.acme.mynetwork
asset Lot identified by lotId {
    o String lotId
    o String securityName
    o Double quantity
    o Double price
    --> Client owner
}
participant Client identified by clientId {
    o String clientId
    o String description
}
participant Custodian identified by custodianId {
    o String custodianId
    o String description
}
participant Trader identified by traderId {
    o String traderId
    o String name
}
transaction Trade {
    --> Trader trader
    --> Client client
    --> Lot lot
}
event NewTradeEvent {
    --> Lot lot
}

3.配置交易逻辑

接下来,我们将实现每次发送交易事务时执行的自定义逻辑。使用下面的代码创建一个名为script.js的新脚本文件。Composer知道基于注释中的@param注释为每个交易交易执行此代码。这段代码做了两件事:更改一个Lot的所有者,并在成功时发出一个NewTrade事件。

/ **
*跟踪交易
* @param {org.acme.mynetwork.Trade}交易 - 将被处理的交易
* @交易
* / 
function tradeCommodity(trade) {
  var factory = getFactory();
  trade.lot.owner = trade.client;
  var result = getAssetRegistry(‘org.acme.mynetwork.Lot’)
  .then(function (assetRegistry) {
    return assetRegistry.update(trade.lot);
  });
  if (result) {
    var newTradeEvent = factory.newEvent(‘org.acme.mynetwork’, ‘NewTradeEvent’);
    newTradeEvent.lot = trade.lot;
    emit(newTradeEvent);
  }
  return result;
}

4.访问控制列表(ACL)

最后,我们需要定义一个访问控制列表来管理每个参与者类型可以执行和查看的内容。我们在这里指定交易者可以执行交易,客户可以查看他们自己的交易,而保管人可以查看所有交易。

/ *管理员* /
rule NetworkAdminUser {
    description: "Grant business network administrators full access to user resources"
    participant: "org.hyperledger.composer.system.NetworkAdmin"
    operation: ALL
    resource: "**"
    action: ALLOW
}
rule NetworkAdminSystem {
    description: "Grant business network administrators full access to system resources"
    participant: "org.hyperledger.composer.system.NetworkAdmin"
    operation: ALL
    resource: "org.hyperledger.composer.system.**"
    action: ALLOW
}
/* Common */





rule CommonReadTransactionRegistry {
    description: "Allow all participants to read transaction registry"
    participant: "org.hyperledger.composer.system.Participant"
    operation: READ
    resource: "org.hyperledger.composer.system.TransactionRegistry"
    action: ALLOW
}
rule CommonReadParticipantRegistry {
    description: "Allow all participants to read participant registry"
    participant: "org.hyperledger.composer.system.Participant"
    operation: READ
    resource: "org.hyperledger.composer.system.ParticipantRegistry"
    action: ALLOW
}
rule CommonReadAssetRegistry {
    description: "Allow all participants to read asset registry"
    participant: "org.hyperledger.composer.system.Participant"
    operation: READ
    resource: "org.hyperledger.composer.system.AssetRegistry"
    action: ALLOW
}
rule CommonReadNetwork {
    description: "Allow all participants to read network"
    participant: "org.hyperledger.composer.system.Participant"
    operation: READ
    resource: "org.hyperledger.composer.system.Network"
    action: ALLOW
}
/* 交易人 */
rule TraderManageClient {
    description: "Allow traders to read all clients"
    participant: "org.acme.mynetwork.Trader"
    operation: ALL
    resource: "org.acme.mynetwork.Client"
    action: ALLOW
rule TraderManageOwnTrades {
    description: "Allow traders to manage their trades"
    participant(t): "org.acme.mynetwork.Trader"
    operation: ALL
    resource(tt): "org.acme.mynetwork.Trade"
    condition: (tt.trader.getIdentifier() == t.getIdentifier())
    action: ALLOW
}
rule TraderManageLots {
    description: "Allow traders to read and create lots"
    participant: "org.acme.mynetwork.Trader"
    operation: READ, CREATE
    resource: "org.acme.mynetwork.Lot"
    action: ALLOW
}
rule TraderUpdateLots {
    description: "Allow traders to update lots via Trade transaction"
    participant: "org.acme.mynetwork.Trader"
    operation: UPDATE
    resource: "org.acme.mynetwork.Lot"
    transaction: "org.acme.mynetwork.Trade"
    action: ALLOW
}
rule TraderReadOwnTrader {
    description: "Allow traders to read their own info"
    participant(t): "org.acme.mynetwork.Trader"
    operation: READ
    resource(tt): "org.acme.mynetwork.Trader"
    condition: (tt.getIdentifier() == t.getIdentifier())
    action: ALLOW  
}
rule TraderAddAsset {
    description: "Allow traders to add assets to registry"
    participant: "org.acme.mynetwork.Trader"
    operation: CREATE
    resource: "org.hyperledger.composer.system.AddAsset"
    action: ALLOW  
}
rule TraderCreateHistorianRecord {
    description: "Allow traders to create historian record"
    participant: "org.acme.mynetwork.Trader"
    operation: CREATE
    resource: "org.hyperledger.composer.system.HistorianRecord"
    action: ALLOW  
}
rule TraderReadOwnHistorianRecord {
    description: "Allow traders to read their own historian record"
    participant(t): "org.acme.mynetwork.Trader"
    operation: READ
    resource(hr): "org.hyperledger.composer.system.HistorianRecord"
    condition: (hr.transactionType == "org.acme.mynetwork.Trade" && hr.participantInvoking.getIdentifier() == t.getIdentifier())
    action: ALLOW
}
/ *客户端* /
rule ClientReadOwnTrades {
    description: "Allow clients to view their trades"
    participant(c): "org.acme.mynetwork.Client"
    operation: READ
    resource(t): "org.acme.mynetwork.Trade"
    condition: (t.client.getIdentifier() == c.getIdentifier())
    action: ALLOW
}
rule ClientReadOwnEvents {
    description: "Allow clients to subscribe to NewTrade events"
    participant(c): "org.acme.mynetwork.Client"
    operation: READ
    resource(e): "org.acme.mynetwork.NewTradeEvent"
    condition: (e.lot.owner.getIdentifier() == c.getIdentifier())
    action: ALLOW
}
rule ClientReadOwnLots {
    description: "Allow clients to view lots they own"
    participant(c): "org.acme.mynetwork.Client"
    operation: READ
    resource(s): "org.acme.mynetwork.Lot"
    condition: (s.owner.getIdentifier() == c.getIdentifier())
    action: ALLOW  
}
 rule ClientReadOwnClient {
    description: "Allow clients to view their info"
    participant(c): "org.acme.mynetwork.Client"
    operation: READ
    resource(cc): "org.acme.mynetwork.Client"
    condition: (cc.getIdentifier() == c.getIdentifier())
    action: ALLOW  
}
 
rule ClientReadTraders {
    description: "Allow clients to view traders"
    participant: "org.acme.mynetwork.Client"
    operation: READ
    resource: "org.acme.mynetwork.Trader"
    action: ALLOW
}
rule ClientReadHistorianRecord {
    description: "Allow clients to view their historian records"
    participant(c): "org.acme.mynetwork.Client"
    operation: READ
    resource(hr): "org.hyperledger.composer.system.HistorianRecord"
    condition: (hr.transactionType == "org.acme.mynetwork.Trade" && hr.transactionInvoked.client.getIdentifier() == c.getIdentifier())
    action: ALLOW
}
/ *保管人* /
rule CustodianReadAllTrades {
    description: "Allow custodian to view all trades"
    participant: "org.acme.mynetwork.Custodian"
    operation: READ
    resource: "org.acme.mynetwork.Trade"
    action: ALLOW
}
rule CustodianReadAllLots {
    description: "Allow custodian to view all lots"
    participant: "org.acme.mynetwork.Custodian"
    operation: READ
    resource: "org.acme.mynetwork.Lot"
    action: ALLOW
}
rule CustodianReadAllClients {
    description: "Allow custodian to view all clients"
    participant: "org.acme.mynetwork.Custodian"
    operation: READ
    resource: "org.acme.mynetwork.Client"
    action: ALLOW
}
rule CustodianReadAllEvents {
    description: "Allow custodian to subscribe to NewTrade events"
    participant: "org.acme.mynetwork.Custodian"
    operation: READ
    resource: "org.acme.mynetwork.NewTradeEvent"
    action: ALLOW
}
rule CustodianReadAllTraders {
    description: "Allow custodian to view all traders"
    participant: "org.acme.mynetwork.Custodian"
    operation: READ
    resource: "org.acme.mynetwork.Trader"
    action: ALLOW
}
rule CustodianReadOwnCustodian {
    description: "Allow custodian to view their info"
    participant(c): "org.acme.mynetwork.Custodian"
    operation: READ
    resource(cc): "org.acme.mynetwork.Custodian"
    condition: (cc.getIdentifier() == c.getIdentifier())
    action: ALLOW  
}
rule CustodianReadHistorianRecord {
    description: "Allow custodian to view all trade historian records"
    participant(t): "org.acme.mynetwork.Custodian"
    operation: READ
    resource(hr): "org.hyperledger.composer.system.HistorianRecord"
    condition: (hr.transactionType == "org.acme.mynetwork.Trade")
    action: ALLOW
}

完成所有步骤后,我们可以通过单击左侧的更新来部署应用程序。

如何在Playground进行测试

既然我们有完整的应用程序定义,我们可以使用Composer Playground Test模块进行测试(点击顶部的测试)。

1.创建参与者

首先,让我们用一些参与者创建我们的应用程序。我们可以创建2个客户:托管人和交易人。

1620

2.为每个参与者创建身份

为了能够与商业网络进行交互,参与者需要一个关联的身份。身份可以在ID注册表中创建(打开右上角的用户下拉列表)。我们将通过指定其名称并指向上一步中创建的参与者实例来为每个参与者创建一个身份。至少,我们需要4个身份:2个客户,1个交易员和1个托管人。

1620

3.以交易者身份登录

我们现在可以通过点击列表中每个标识旁边的“立即使用”使用新创建的标识进行登录。首先,我们以交易者身份登录并创建一个不属于任何客户的新Lot(客户ID为空)。

1620

然后,我们通过交易将Lot的所有权分配给客户1。

1620

现在,我们再创建一个Lot,并通过另一个交易将其分配给客户2。

1620
1620

4.以客户身份登录

然后,我们将以客户端和客户2的身份登录,以检查我们是否可以看到我们的Lot。

1620

客户1Lot

1620

客户2Lot

正如你所看到的,每个客户只能看到他们拥有所有权的lot,他们不知道其他客户的交易。

5.以托管人身份登录

我们先以托管人身份登陆,再检查我们是否可以查看所有交易。事实上,这两种交易都是可见的,如下所示:

1620

托管人也可以查看所有交易的历史记录:

1620

分散化的说明

请记住,当交易广播到Hyperledger Fabric网络时,每个配置的对等方都独立执行自定义事务处理逻辑,以确保区块链更新的正确性。这是一个主要的体系结构差异,在许多情况下,这与传统的集中式客户端服务器方法相比具有优势。在传统的方法中,单个组织将负责管理数据并将数据暴露给其他参与者,迫使他人信任数据并使其成为潜在的单点故障。

在区块链方法中,每个对等方负责管理和协调他们自己的数据副本。这使整个网络更加灵活和分散。但是,配置并不是很简单。还有其他隐私问题需要考虑,因为这些数据现在托管在许多地方,从而形成潜在的更大威胁。

结论

希望这可以让你更好地理解Hyperledger Composer是什么以及它如何在多个参与者之间共享信息和跟踪资产和其他概念方面起到作用。随意导出网络的.bna文件,并按照此处的教程将应用程序部署到本地Hyperledger Fabric网络。我们很乐意听取您对Hyperledger  Composer的想法。请在下面留下任何问题或意见。



原文发布时间为:2018-03-12
本文作者:Mr.Crypto
本文来源:腾讯云 云+社区,如需转载请联系原作者。

目录
相关文章
|
3小时前
|
存储 安全 物联网
未来交织:区块链、物联网与虚拟现实的技术融合与应用革新
【5月更文挑战第9天】 随着科技的迅猛发展,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐渗透到我们生活的各个角落。这些技术不仅单独发展,而且越来越多地相互融合,催生出新的应用场景和商业模式。区块链技术以其去中心化和不可篡改的特性,为数据安全提供了坚实的保障;物联网通过智能化连接日常设备,极大地提升了生活和工作效率;而虚拟现实则通过沉浸式体验,改变了人们的娱乐和学习方式。本文将探讨这些技术的发展趋势,并分析它们在不同领域的结合应用,从而描绘出一个由新技术驱动的未来蓝图。
|
3小时前
|
安全 物联网 区块链
未来技术的融合潮流:区块链、物联网与虚拟现实的交汇点
【5月更文挑战第9天】 在数字化时代的浪潮中,新技术不断涌现,重塑着商业模式、社会互动和日常生活。本文聚焦于三项前沿技术——区块链、物联网(IoT)和虚拟现实(VR),探讨它们各自的发展趋势以及如何相互交织,共同构建一个更加智能、安全和沉浸式的未来世界。通过分析每项技术的核心优势和潜在挑战,文章描绘了一个多技术融合的应用蓝图,旨在为读者提供一个关于这些技术如何联合起来改变未来世界的清晰视角。
17 5
|
3小时前
|
存储 安全 物联网
未来技术纵横谈:区块链、物联网与虚拟现实的融合前景
【5月更文挑战第14天】 随着科技不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正逐渐改变我们的生活和工作方式。本文将深入探讨这些技术的发展趋势,并分析它们在不同应用场景中的融合潜力。区块链技术以其不可篡改和去中心化的特性,为数据安全和信息透明度带来了革命性的提升。物联网通过智能设备和传感器的广泛部署,实现了物理世界与数字世界的无缝对接。而虚拟现实技术则通过沉浸式体验,为用户创造了全新的交互空间。这三者的交汇预示着一个更加智能、安全和互动的未来。
10 1
|
3小时前
|
存储 供应链 安全
构建未来:区块链技术在供应链管理中的应用
【5月更文挑战第13天】 随着数字化转型的浪潮席卷全球,区块链技术作为其重要推手之一,正逐步在各行各业中展现其独特价值。特别是在供应链管理领域,区块链不仅重塑了信息流、物流和资金流的传统运作模式,还为增强透明度、提高效率和降低成本提供了前所未有的可能性。本文将深入探讨区块链技术如何在供应链管理中发挥作用,通过一系列实例分析来揭示其在实现端到端透明、提升数据安全性以及促进多方协作方面的潜力与挑战。
|
3小时前
|
供应链 安全 区块链
区块链技术在供应链管理中的应用及挑战
【5月更文挑战第13天】 本文旨在探讨区块链技术在供应链管理中的实际应用及其所面临的挑战。通过分析区块链的核心特性,如去中心化、不可篡改性以及透明度,我们阐述了该技术如何增强供应链的追踪能力、提高流程效率和降低成本。同时,我们也识别了在实施过程中可能遇到的技术、法律和组织文化障碍,并提出了相应的解决策略。
|
3小时前
|
供应链 安全 物联网
未来技术纵横谈:区块链、物联网与虚拟现实的融合革新
【5月更文挑战第11天】 在技术的浪潮中,新兴技术不断涌现,它们以独特的方式重塑着世界。本文聚焦于区块链、物联网(IoT)和虚拟现实(VR)这三项前沿科技,探讨它们的发展动向以及如何在不同的应用场景中交织创新。区块链技术提供了去中心化的数据安全解决方案,物联网将物理世界无缝连接至数字网络,而虚拟现实创造了沉浸式体验的新维度。这三者结合,预示着一个互联、安全且高度互动的未来。
|
3小时前
|
存储 传感器 安全
探索区块链技术在物联网中的应用与前景
随着物联网技术的发展,人们对于数据的安全和可信性要求日益增加。区块链技术以其去中心化、不可篡改等特点,为物联网应用提供了新的解决方案。本文将探讨区块链技术在物联网领域的应用现状、挑战以及未来发展前景。
|
3小时前
|
安全 算法 区块链
区块链系统开发|(成熟技术)/区块链系统开发介绍方案
区块链架构自下而上包括数据层、网络层、共识层、激励层、契约层和应用层。数据层涉及底层区块和基础数据;网络层实现节点间的分布式通信;共识层确保去中心化网络中节点对区块有效性的共识;激励层提供参与区块链安全验证的节点奖励;契约层支持智能合约,实现交易模式的编程;应用层则将区块链技术应用于现实生活场景。激励层、契约层和应用层并非所有区块链应用的必要组成部分。
|
3小时前
|
测试技术 区块链
swap开发/区块链跨链技术系统开发规则
跨链技术通过验证源链状态和中继交易至目标链实现交互,关键组件是跨链桥,用于通证在不同链间的转移。桥通过智能合约锁定/销毁源链通证并在目标链解锁/铸造。简单的跨链桥仅适用于通证传输,而可编程通证桥支持更复杂交互,如交易中的交换、借贷等。任意数据消息传递协议则提供更通用功能,能构建跨链DApp,如跨链DEX、NFT和游戏。
|
3小时前
|
监控 安全 物联网
未来技术纵横谈:区块链、物联网与虚拟现实的融合与创新
【5月更文挑战第9天】 随着科技的不断进步,新兴技术正以前所未有的速度渗透到我们的生活之中。区块链、物联网(IoT)、和虚拟现实(VR)等技术,不仅各自发展迅猛,更在相互交织中激发出新的应用模式和商业机会。本文将深入探讨这些技术的发展趋势,分析它们在不同领域的结合点,以及这种融合如何推动着传统行业的变革与升级。