选择私人区块链技术: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 lotIdo String securityNameo Double quantityo Double price--> Client owner
}
participant Client identified by clientId {o String clientIdo String description
}
participant Custodian identified by custodianId {o String custodianIdo String description
}
participant Trader identified by traderId {o String traderIdo 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: ALLresource: "**"action: ALLOW
}
rule NetworkAdminSystem {description: "Grant business network administrators full access to system resources"participant: "org.hyperledger.composer.system.NetworkAdmin"operation: ALLresource: "org.hyperledger.composer.system.**"action: ALLOW
}
/* Common */rule CommonReadTransactionRegistry {description: "Allow all participants to read transaction registry"participant: "org.hyperledger.composer.system.Participant"operation: READresource: "org.hyperledger.composer.system.TransactionRegistry"action: ALLOW
}
rule CommonReadParticipantRegistry {description: "Allow all participants to read participant registry"participant: "org.hyperledger.composer.system.Participant"operation: READresource: "org.hyperledger.composer.system.ParticipantRegistry"action: ALLOW
}
rule CommonReadAssetRegistry {description: "Allow all participants to read asset registry"participant: "org.hyperledger.composer.system.Participant"operation: READresource: "org.hyperledger.composer.system.AssetRegistry"action: ALLOW
}
rule CommonReadNetwork {description: "Allow all participants to read network"participant: "org.hyperledger.composer.system.Participant"operation: READresource: "org.hyperledger.composer.system.Network"action: ALLOW
}
/* 交易人 */
rule TraderManageClient {description: "Allow traders to read all clients"participant: "org.acme.mynetwork.Trader"operation: ALLresource: "org.acme.mynetwork.Client"action: ALLOW
rule TraderManageOwnTrades {description: "Allow traders to manage their trades"participant(t): "org.acme.mynetwork.Trader"operation: ALLresource(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, CREATEresource: "org.acme.mynetwork.Lot"action: ALLOW
}
rule TraderUpdateLots {description: "Allow traders to update lots via Trade transaction"participant: "org.acme.mynetwork.Trader"operation: UPDATEresource: "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: READresource(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: CREATEresource: "org.hyperledger.composer.system.AddAsset"action: ALLOW
}
rule TraderCreateHistorianRecord {description: "Allow traders to create historian record"participant: "org.acme.mynetwork.Trader"operation: CREATEresource: "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: READresource(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: READresource(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: READresource(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: READresource(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: READresource(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: READresource: "org.acme.mynetwork.Trader"action: ALLOW
}
rule ClientReadHistorianRecord {description: "Allow clients to view their historian records"participant(c): "org.acme.mynetwork.Client"operation: READresource(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: READresource: "org.acme.mynetwork.Trade"action: ALLOW
}
rule CustodianReadAllLots {description: "Allow custodian to view all lots"participant: "org.acme.mynetwork.Custodian"operation: READresource: "org.acme.mynetwork.Lot"action: ALLOW
}
rule CustodianReadAllClients {description: "Allow custodian to view all clients"participant: "org.acme.mynetwork.Custodian"operation: READresource: "org.acme.mynetwork.Client"action: ALLOW
}
rule CustodianReadAllEvents {description: "Allow custodian to subscribe to NewTrade events"participant: "org.acme.mynetwork.Custodian"operation: READresource: "org.acme.mynetwork.NewTradeEvent"action: ALLOW
}
rule CustodianReadAllTraders {description: "Allow custodian to view all traders"participant: "org.acme.mynetwork.Custodian"operation: READresource: "org.acme.mynetwork.Trader"action: ALLOW
}
rule CustodianReadOwnCustodian {description: "Allow custodian to view their info"participant(c): "org.acme.mynetwork.Custodian"operation: READresource(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: READresource(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的想法。请在下面留下任何问题或意见。

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

选择私人区块链技术:Hyperledger Composer相关推荐

  1. 如何选择靠谱的区块链技术服务商?佰忆科技有秘籍

    伴随着央行发行数字货币.比特币减半等热点事件的影响,以及将区块链纳入新基建等国家政策的扶持,区块链技术浪潮正在涌起,众多企业机构纷纷加入区块链阵营,希望借助区块链技术实现质的飞跃,着手构建自己的区块链 ...

  2. 弘康人寿借助区块链技术公开全部理赔结果

    你买的保险能得到理赔吗?某家保险公司以往的理赔率有多少?消费者对于理赔情况的关注,现在有了答案. <证券日报>记者从弘康人寿保险股份有限公司(下称弘康人寿)了解到,10月25日,该公司正式 ...

  3. 区块链技术的未来前景与发展趋势

    随着数字时代的到来,区块链技术已经成为最为热门的技术之一.区块链技术以其去中心化.安全.透明等特点,成为了解决许多传统领域存在的问题的理想选择.区块链技术的应用不仅仅局限于金融.货币领域,也可以用于物 ...

  4. 区块链学习培训如何学?怎样能高效且快速掌握区块链技术呢?

    全球对于区块链人才的需求量从2015年开始出现增长,并且在2016-2017年经历了大规模爆发.行业发展引起人才需求变化,对人才的供需两侧及相关多方都会造成更多不确定性.多方数据显示,目前区块链人才市 ...

  5. 社会共治大命题下,区块链技术究竟有何魔力?

    健康码互认.绿色行为+碳交易.诚信积分.链上社区,区块链在社会治理上发挥的作用远超你想象. 文 | Azuma  运营 | 盖遥  编辑 | 郝方舟 出品 | Odaily星球日报(ID:o-dail ...

  6. 基于区块链技术的超级账本(Hyperledger) - 从理论到实战

    什么是区块链?简单来说区块链就是一个分布式的记账本,或者分布式的数据库. 区块链的数据结构是一个链表,交易数据被存储到链表的区块中,区块链的第一个区块叫创世区块,除了创世块以外,每个区块还包含前一个区 ...

  7. Hyperledger Fabric 超级账本 区块链技术 概述 优点

    超级账本概述 区块链的第一个也是最被广泛认可的应用是比特币,另一种加密货币以太坊采取了不同的方法,它集成了许多与比特币相同的特征,添加了智能合约来创建分布式应用程序的平台.比特币和以太坊属于区块链,我 ...

  8. 一文揭示DisCO的内幕,区块链技术才是创造未来价值的最好选择?

    作者:DisCO.coop 翻译 | 火火酱,责编 | 晋兆雨 出品 | 区块链大本营 头图 | 付费下载于视觉中国 前情提要 在上一次的推送代表未来?自动化.区块链和知识经济你怎么看中提到,技术从来 ...

  9. HyperLedger Fabric区块链技术形成(1.2)

    在比特币诞生之时,没有区块链技术概念,当人们看到比特币在无中心干预的前提下,还能安全.可靠的运行,比特币网络打开了人们的想象空间:技术专家们开始研究比特币的底层技术,并抽象提取出来,形成区块链技术,或 ...

最新文章

  1. 人工智能正在激活互联网类脑系统,2018年,云脑将成为新热点
  2. Java数字字符串如何转化为数字数组
  3. .NET Core项目部署到linux(Centos7)
  4. 仪表盘刻度调整_惊艳了我的仪表盘 那些年我遇到最美的“面孔”
  5. 虚拟机和linux系统整理??
  6. Android系统性能优化(71)---关于Bitmap图片资源优化的小事
  7. Python——腾讯在线编程题(2018)
  8. [转帖]Docker save and load镜像保存
  9. 关于Nginx的一些优化(突破十万并发)。
  10. JS des加密解密
  11. Acrobat DC安装教程
  12. 利用爬虫大量抓取网页图片
  13. 工程师应用计算机考试题型,IE工程师考试试题
  14. win7休眠 计算机管理,Win7休眠功能怎么关闭?
  15. 【微信红包封面】最新!最全!
  16. 枚举类中获取枚举值的几种方法
  17. Qt+大恒相机+OpenCV+MinGW界面开发
  18. IPRAN 网络结构图
  19. proteus仿真里面的LCD1602液晶屏初始化
  20. 01 【初识Django】

热门文章

  1. JS简单粗暴地实现浅克隆
  2. RISC-V单片机集成开发环境(IDE) MounRiver Studio软件介绍(一)
  3. excel生成图表_Excel图表比较高分和低分
  4. 【Unity--头顶UI 人物头顶UI】特别简单的实现人物头顶UI显示跟随
  5. 考研复试之考前准备(上)
  6. PLGA纳米粒负载环丙沙星Ciprofloxacin-PLGA|甲硝唑修饰PLGA纳米粒PLGA-Metronidazole
  7. python类似于java的重写toString方法
  8. 2022圣诞代码合集(圣诞树+圣诞老人)
  9. { ok : 0.0, errmsg : Authentication failed., code : 18, codeName : AuthenticationFailed
  10. debian挂载光驱、软驱、usb(转)