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

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

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个客户:托管人和交易人。

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

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

3.以交易者身份登录

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

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

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

4.以客户身份登录

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

客户1Lot

客户2Lot

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

5.以托管人身份登录

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

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

分散化的说明

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

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

结论

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

本文的版权归 Mr.Su 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏区块链入门

第二十五课 如何开发自己的BANCOR去中心化交易平台?1,摘要2,BancorNetwork网络的文件框架和功能3,2个连接器通证兑换测试场景4,CLB(一种ERC20)和ETH兑换测试场景4,总结

《第二十四课 基于以太坊的交易所BANCOR算法实现-转换算法框架》 讲解了以太坊solidity实现的BancorConverter转换主合约的逻辑和代码,但...

671
来自专栏SAP最佳业务实践

SAP最佳业务实践:SD–贷项凭证处理(204)-2业务处理

1.1 VA01输入销售订单 客户将收到仅税收贷项,或用于错误收费的贷项。 1. 在 创建销售订单:初始屏幕屏幕上,输入以下内容: 字段名称用户操作和值...

2554
来自专栏WindCoder

Time-locked Wallets:一个以太坊智能合约的教程

本次推荐的是一篇关于通过以太坊了解区块链的教程,能力有限,本身没接触过,各位尽量看原文吧。

732
来自专栏SAP最佳业务实践

SAP最佳业务实践:FI–应收帐款(157)-19 FD32信用

4.19 FD32设置信用限额 您可以为客户设置信用限额,并控制所使用的信用限额或超出的金额。 如果使用系统组件 SAP LO-SD,则在超过信用限额时系统会阻...

3868
来自专栏张善友的专栏

IISWeb应用防火墙WAF

随着Web应用的爆炸式成长,传统的IDS设备对于应用层尤其是HTTP应用层就显得越来越力不从心了。2008年,大规模SQL自动注入让Web安全越来越被人们所关注...

2245
来自专栏圆方圆学院精选

【许晓笛】EOS 的世界里可能再也没有小偷了

EOS 有可能会强制要求所有账户的 Owner 权限必须使用多签名,也就是说 Owner 权限列表里要有至少两个私钥或其他账户,这样就减少了因为单个私钥泄露而导...

1022
来自专栏SAP最佳业务实践

SAP最佳业务实践:FI–现金管理(160)-20银企对账-供应商付款-转账-FF67手动输入银行对帐单

4.6.3 FF67手动输入银行对帐单 收到银行对账单,执行对供应商的付款,形成财务凭证如下: 借:银行结算(中间科目) 贷:银行现金 1. 输入一张...

3496
来自专栏区块链大本营

《以太坊攻略》,小白如何逆袭成为技术大咖?要学的全在这里了

ConsenSys产品经理认为,区块链新手和经验丰富的区块链开发人员,需要共享工具、开发模式和组件。

753
来自专栏YouMeek

1.7 Elasticsearch 锁相关介绍

课程环境 CentOS 7.3 x64 JDK 版本:1.8(最低要求),主推:JDK 1.8.0_121 Elasticsearch 版本:5.2.0 相关软...

2699
来自专栏美团技术团队

关于刘海打理这种事儿,美团点评的iOS工程师早就有经验了,不信你看!

背景 iPhone X 刘海机于9月13日发布,给科技小春晚带来一波高潮。作为开发人员却多出来一份忧虑,iPhone X 怎么适配?我们 App 的脑袋会不会也...

3147

扫码关注云+社区