内容


Hyperledger Composer 基础,第 1 部分

建模和测试您的区块链网络

在 Hyperledger Composer Playground 中快速轻松地开始使用区块链

Comments

系列内容:

此内容是该系列 1 部分中的第 # 部分: Hyperledger Composer 基础,第 1 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:Hyperledger Composer 基础,第 1 部分

敬请期待该系列的后续内容。

本教程将帮助您开始开发一个区块链网络。我将介绍 Hyperledger Composer 和它的用户界面 Hyperledger Composer Playground,在该用户界面中,您只需使用 Docker 和 Web 浏览器就能建模和测试您的网络。

第 2 部分中,您将学习如何改进和部署区块链网络,在第 3 部分中,您将看到如何在计算机上安装 Hyperledger Fabric,将业务网络部署到本地实例以及与示例网络区块链应用交互。

前提条件

要跟随本教程操作,您应该在计算机上安装以下软件:

Hyperledger Composer 是什么?

Hyperledger Composer 是 The Linux Foundation 主办的一个 Hyperledger 项目,它是一组让构建区块链应用程序变得更容易的工具,它由以下部分组成:

  • 一种名为 CTO 的建模语言(对原始项目名称 Concerto 的致敬)
  • 一个名为 Hyperledger Composer Playground 的用户界面,用于快速配置、部署和测试业务网络
  • 命令行接口 (CLI) 工具,用于将使用 Hyperledger Composer 建模的业务网络与一个正在运行的 Hyperledger Fabric 区块链业务网络实例相集成

在教程系列的这一部分,我将介绍 CTO 建模语言和 Hyperledger Composer Playground。CLI 将留到本系列的第 2 部分进行介绍,届时我将介绍 CLI 的所有方面(以及其他许多特性)。

Hyperledger Composer 建模语言 (CTO)

Hyperledger Composer 拥有自己的建模语言(名为 CTO),用该语言来建模业务网络。在第 1 部分,我将介绍如何使用 CTO 建模样本 Perishable Goods 网络。这个样本业务网络将演示种植者、航运商和进口商如何根据从航运集装箱收到的温度读数来为易腐货物的价格定义合约。

Hyperledger Composer Playground

Hyperledger Composer Playground 是一个基于浏览器的接口,可用来建模您的业务网络:交换哪些有价值的货物(资产),谁参与了货物的交换(参与者),如何保护货物(访问控制),流程中涉及何种业务逻辑(交易),等等。

Hyperledger Composer Playground(下文简称 Playground)使用浏览器的本地存储来模拟区块链网络的状态存储,这意味着您不需要运行真实的验证对等节点网络来使用 Playground。

您将在本教程中完成以下任务:

  • 了解业务网络概念
  • 在计算机上使用 Docker 运行 Playground
  • 熟悉建模语言
  • 使用建模语言来建模或描述业务网络
  • 测试业务网络

在第 2 部分,我将介绍如何安装全套 Hyperledger Composer 开发工具,如何使用 CTO 语言的更多高级特性(包括事件),如何对 JavaScript 智能合约执行单元测试,如何使用命令行接口 (CLI) 与真实的 Hyperledger Fabric 区块链网络进行交互。

在第 3 部分,我将更深入地剖析 Composer:如何使用 Yeoman 生成 REST 接口和 GUI,如何将区块链网络应用程序部署到 IBM Cloud 上的 Bluemix 中。

业务网络概念

大体上讲,业务网络是一组协同实现特定目标的实体。为了实现这些目标,业务网络的成员之间必须就以下方面达成一致意见:

  • 交换的货物和服务
  • 如何进行交换(包括管理支付和惩罚的业务规则)
  • 允许该小组中的哪些成员参与交换,以及何时交换

在下一节,我将介绍常见的业务网络术语。首先,我想介绍您的第一个区块链业务网络将会解决的业务问题:运输易腐货物。更重要的是,如何使用物联网、温度传感器和云来确保易腐货物在理想情况下进行运输(以及如果没有在理想情况下,将会发生什么)。

Perishable Goods 网络

基于物联网 (IoT) 的 Perishable Goods 网络是一个业务网络,它涉及:

  • 易腐货物,比如香蕉、梨和咖啡
  • 业务合作伙伴,比如种植者、航运商和进口商
  • 易腐货物的装运
  • 约定协议条件的业务方之间的协议
  • 货物和服务的接收回执

整个本系列教程都将使用此业务网络作为示例。随着您继续学习本系列,您会注意到,随着我介绍更多的 Hyperledger Composer 概念,并展示它们与区块链和 IBM Cloud 之间的关系,该应用程序会变得越来越复杂。

资产

资产是可以在业务协议中的各方间交换的任何有价值的物品。这意味着资产可以是任何物品。示例包括:

  • 一艘船
  • 一些股票
  • 一栋房子
  • 一箱香蕉
  • 一批香蕉
  • 基于条件 {X, Y, Z},以价格 X 运输 1000 箱香蕉的合约

您想到的任何物品。如果某个物品拥有感知价值,而且可以在各方之间交换,那么它就是资产。在 Perishable Goods 网络中,资产包括易腐货物本身、这些货物的装运,以及管理交换货物期间执行的活动的合约。

参与者

参与者是业务网络的成员。对于 Perishable Goods 网络,参与者包括生产易腐货物的种植者、将它们从种植者那里运输到港口的航运商,以及在港口接收商品的进口商。显然,这个模型过于简化,但它应能让您了解真实的应用程序是如何使用业务网络术语来建模的。

访问控制

在业务网络中,不是所有参与者都能访问所有信息。例如,种植者不能访问航运商与进口商之间的合约。访问控制用于限制谁(在哪些条件下)能访问哪些信息。

交易

“涉及”资产时,这种交互可能影响区块链账本的状态。交互在 Hyperledger Composer 中建模为交易

Perishable Goods 网络中的交易示例包括:

  • 船运集装箱中的 IoT 传感器记录温度读数
  • 进口商收到一批易腐货物
  • IoT GPS 传感器记录船运集装箱的当前位置

交易是系统的业务逻辑(或智能合约)。

事件

事件是一种通知,它由区块链应用程序生成,并以发布/订阅方式由外部实体(比如应用程序)使用。

尽管区块链账本会在系统中的资产发生交换时进行更新,但这是一个内部(系统)流程。但是,在某些时候,外部实体需要获知账本的状态已更改,或者系统中发生了(或者本应发生但没有发生)其他值得注意的事。在这种情况下,区块链应用程序可以使用事件。

Perishable Goods 网络中的事件示例包括:

  • 温度读数超过上限或下限 X 倍(例如,这可能表明船运集装箱本身出了问题)。
  • 一批货物已收到。
  • 一批货物已到达港口(例如,IoT GPS 传感器可能会报告此事件)。

在下一节,我将介绍如何建模由资产、参与者和交易组成的 Perishable Goods 网络。我将介绍访问控制,并将事件留到本系列第 2 部分进行介绍。

在计算机上使用 Docker 运行 Playground

Playground 是什么?

Playground 是一个用于快速构建并测试区块链业务网络的环境。它不需要一个正在运行的区块链网络,所以它降低了定义、验证和测试业务网络的复杂性。

Playground 在 Docker 容器中运行,可以通过两种模式安装到计算机上:

  • 使用 Hyperledger Fabric 验证对等节点网络
  • 在纯浏览器模式下

使用 Hyperledger Fabric 验证对等节点网络

此模式通过 Hyperledger Fabric 验证对等节点网络来安装 Playground,还包括用于 Playground 的 Docker 容器,以及其他所有运行 Hyperledger Fabric 验证对等节点网络的 Docker 容器。

随着更深入地学习第 2 和 3 部分,您将需要一个完整的 Hyperledger Fabric 验证对等节点网络。目前不需要这么做,因为第 1 部分中执行的所有活动都不需要它。

纯浏览器模式

通过使用纯浏览器模式,可以使用一个位于浏览器本地存储中的模拟区块链账本来建模并测试业务网络。

这是我将在第 1 部分中使用的方法。

运行 Playground

从一个终端窗口 (Mac/Linux) 或命令提示符 (Windows) 执行此命令:

                docker run --name composer-playground --publish 8080:8080 hyperledger/composer-playground

这会以交互方式启动 Docker。我喜欢像这样运行 Playground,以便看到向 STDOUT 记录了哪些信息:

$ docker run --name composer-playground --publish 8080:8080 hyperledger/composer-playground
0|composer | PlaygroundAPI            :createServer()            > 8080
0|composer | ConnectionProfileManager :constructor()             Created a new ConnectionProfileManager {"fs":{"constants":{"O_RDONLY":0,"O_WRONLY":1,"O_RDWR":2,"S_IFMT":61440,"S_IFREG":32768,"S_IFDIR":16384,"S_IFCHR":8192,"S_IFBLK":24576,"S_IFIFO":4096,"S_IFLNK":40960,"S_IFSOCK":49152,"O_CREAT":64,"O_EXCL":128,"O_NOCTTY":256,"O_TRUNC":512,"O_APPEND":1024,"O_DIRECTORY":65536,"O_NOATIME":262144,"O_NOFOLLOW":131072,"O_SYNC":1052672,"O_DIRECT":16384,"O_NONBLOCK":2048,"S_IRWXU":448,"S_IRUSR":256,"S_IWUSR":128,"S_IXUSR":64,"S_IRWXG":56,"S_IRGRP":32,"S_IWGRP":16,"S_IXGRP":8,"S_IRWXO":7,"S_IROTH":4,"S_IWOTH":2,"S_IXOTH":1,"F_OK":0,"R_OK":4,"W_OK":2,"X_OK":1},"F_OK":0,"R_OK":4,"W_OK":2,"X_OK":1}}
0|composer | PlaygroundAPI            :createServer()            Playground API started on port 8080 
0|composer | PlaygroundAPI            :createServer()            < 
0|composer | Composer                 :main()                    >

如果您想要分开运行 Playground,只需添加 --detach

                docker run --name composer-playground --publish 8080:8080 --detach hyperledger/composer-playground

现在,打开浏览器并访问 http://localhost:8080,您会看到一个类似图 1 的屏幕:

图 1. Playground 欢迎屏幕
Hyperledger Composer Playground 欢迎屏幕
Hyperledger Composer Playground 欢迎屏幕

运行 Playground 后,交互模式下可以用 ctrl+c 结束该容器。如果在分离模式下运行,可执行此命令:

                docker stop composer-playground

现在清理 Docker 容器(否则在您尝试再次运行该容器时,Docker 会报错):

                    docker rm --force composer-playground

视频:运行 Playground,浏览 UI

在该视频中,我将展示如何使用 Docker 运行 Playground,并引导您了解 Playground UI。

Hyperledger Composer Playground                     导览
Hyperledger Composer Playground 导览

点击查看视频演示查看抄本

Hyperledger Composer 建模语言

在使用 Hyperledger Composer 测试并部署区块链业务网络之前,您需要为它构建一个模型。Hyperledger Composer 拥有完成此工作的自己的建模语言。

好了,又要学习另一种语言,对吧?幸运的是,CTO 建模语言很简单(而且很直观,如果您已经接触过面向对象的概念)。

CTO 建模语言高度专注(用于建模业务网络的)少数几个关键字,所以没有太多东西要学。业务网络的模型位于一个文件中,该文件具有 .cto 文件扩展名,并包含以下元素的定义:

  • 命名空间
  • 资源
  • 从其他命名空间导入(根据需要)

如果您的模型非常大,可以在必要时拥有多个 .cto 模型文件。每个 .cto 模型文件都必须包含一个命名空间和至少一个资源定义。

命名空间

一个命名空间创建一个边界,名称需要在这个边界范围内保持唯一。每个 .cto 模型文件都需要一个命名空间,这意味着 .cto 模型文件中的每个名称都必须是唯一的。

即使没有实现这些命名空间概念,但您已经熟悉了它们。文件系统使用目录作为命名空间,所以同一个目录中的两个文件不能同名。但是,不同目录中的两个文件允许同名,因为它们位于不同的命名空间中。

总结一下:一个 CTO 模型文件(命名空间边界)中的两个资源不能同名。

资源

资源是以下类型之一:

  • 资产 - 一个业务网络资产
  • 参与者 - 一个业务网络参与者
  • 交易 - 业务逻辑
  • 事件 - 系统中发生的重要事情的通知
  • 枚举类型 - 一组指定的值
  • 概念 - 您想建模的不属于其他任何类型的任何对象

每种资源类型对应于与它同名的模型类型(例如 asset 用于建模资产,participant 用于建模参与者,等等)。

资源具有以下属性:

  • 命名空间,资源是其中定义的
  • 一个名称,必须在命名空间内保持唯一
    • 如果资源是一个 assetparticipant,它必须有一个通过 identified by 后跟字段名称来表示的标识符字段。
  • (可选)它的父类型(超类型),如果适用,由 extends 后跟父类型的名称来表示
  • (可选)abstract 关键字,如果您不想实例化某种资源,而是将它用作该类型的其他资源的超类型

在 Perishable Goods 网络中,将一个 Shipment 资产建模为:

                /**
                  * A business network for shipping perishable goods
                  * The cargo is temperature controlled and contracts
                  * can be negociated based on the temperature
                  * readings received for the cargo
                  */
                namespace org.acme.shipping.perishable
                .
                .
                /**
                 * A shipment being tracked as an asset on the ledger
                 */
                asset Shipment identified by shipmentId {
                  o String shipmentId
                  o ProductType type
                  o ShipmentStatus status
                  o Long unitCount
                  o TemperatureReading[] temperatureReadings optional
                  --> Contract contract
                }

让我们分析一下上面的示例,我会指出一些需要注意的地方。

命名空间是 org.acme.shipping.perishable

asset 关键字指出 Shipment 是一种资产。属性(用小写字母“o”表示)shipmentIdString 类型,而且唯一地标识了一个 Shipment(用 identified by 表示)。

它的每个属性都有一个类型,这可以是基础类型(比如 String)、枚举类型(比如 ProductType)或交易(比如一个 TemperatureReading 数组)。

Contract 的引用(用 --> 表示)被称为一种关系,而且是单向的(不是双向的)。

枚举类型

当某个特定属性可以拥有的一组值是已知值时,应该将该属性建模为枚举类型。这样约束值就会变得更容易,从而让验证变得更简单。

枚举类型的声明方式如下:

               /**
                 * The type of perishable product being shipped
                 */
                enum ProductType {
                  o BANANAS
                  o APPLES
                  o PEARS
                  o PEACHES
                  o COFFEE
                }

概念

如果某个实体存在于您的业务模型中,但它不是资产、参与者、交易或事件,那么可以将它建模为概念

                /**
                 * A concept for a simple street address
                 */
                concept Address {
                  o String city optional
                  o String country
                  o String street optional
                  o String zip optional
                }

Address 是业务模型中的一个重要概念,它无法准确地划分到其他类别中,因此将它建模为一个概念

导入

.cto 模型文件中使用导入来指出该模型文件中的一个实体与来自另一个模型文件的一个实体之间的关系。

本教程不会介绍导入概念,因为您要处理的模型非常小。导入概念与 Java™ 语言中的 import 和 C++ 中的 #include 类似。

CTO 参考资料

了解基本语法后(在大多数情况下,可以通过上下文明显看出),该建模语言应该很容易上手。如果您使用过面向对象的概念,那么使用建模语言会更容易一些。

如果想了解更多信息,推荐您阅读 CTO 建模语言的完整文档

建模业务网络

上一个视频中,我展示了如何使用 Playground 创建一个空业务模型。在本节中,您将在 Playground 中建模 Perishable Goods 网络(别担心,内置的 perishable-network 模板会帮助您)。

删除 localhost 浏览器存储

如果您看到一个类似图 1 的欢迎屏幕,则表明您可以进行下一步了,您可以跳到“在 Playground 中创建新模型”。

在纯浏览器模式中,Hyperledger Composer 仅允许一次使用一个模型。如果加载了另一个模型,可能需要在加载该模型前删除浏览器的本地存储。

Playground 应该能将当前模型替换为新模型。但是,如果您遇到错误,可以删除浏览器的本地存储来“从头”开始。该过程会因为浏览器不同而各不相同。

例如,在 Chrome 中,可以在 Settings > Advanced > Content Settings > Cookies > All cookies and site data > localhost 下,单击垃圾桶图标来删除本地存储。如果使用不同的浏览器,请按照特定于该浏览器的说明进行操作,并删除所有本地存储。

在 Playground 中创建新模型

上一个视频中,我介绍了如何在 Playground 中创建一个新的空业务网络,以及如何使用 Playground 的基础知识,所以在这里不再赘述。如果您没有机会观看该视频,应在尝试后面的操作之前观看一下。

单击 Let's Blockchain 按钮开始(参见图 1)。接下来,利用 perishable-network 模板创建一个新业务网络。将它命名为 perishable-iot-network 并单击 Deploy

在 Admin ID 卡上,单击 Connect now 链接。您会看到类似图 2 的界面。

图 2. Perishable Goods 网络
Perishable Goods 网络
Perishable Goods 网络

在 FILES 下,注意以下文件:

  • README.md - 这个 Markdown 文件提供了 Perishable Goods 网络的简要概述
  • models/perishable.cto - 包含业务模型
  • lib/logic.js - 包含业务逻辑(智能合约)代码,该代码包括交易实现

当您选择 FILES 下的一个文件时,该文件会在右侧的编辑器窗口中打开。继续打开模型文件 (perishable.cto),其中包含模型。

Grower 资产的建模方式如下:

                /**
                 * An abstract participant type in this business network
                 */
                abstract participant Business identified by email {
                  o String email
                  o Address address
                  o Double accountBalance
                }
                
                /**
                 * A Grower is a type of participant in the network
                 */
                participant Grower extends Business {
                }

Shipper 类似以下代码:

                /**
                 * A Shipper is a type of participant in the network
                 */
                participant Shipper extends Business {
                }

Contract 资产类似以下代码:

                /**
                 * Defines a contract between a Grower and an Importer to ship using
                 * a Shipper, paying a set unit price.The unit price is multiplied by
                 * a penality factor proportional to the deviation from the min and max
                 * negociated temperatures for the shipment.
                 */
                asset Contract identified by contractId {
                  o String contractId
                  --> Grower grower
                  --> Shipper shipper
                  --> Importer importer
                  o DateTime arrivalDateTime
                  o Double unitPrice
                  o Double minTemperature
                  o Double maxTemperature
                  o Double minPenaltyFactor
                  o Double maxPenaltyFactor
                }

鼓励您熟悉一下该模型,以及各种资源在编辑器中的外观。对 lib/logic.js 执行相同操作并熟悉 JavaScript 代码。

实例化模型

单击屏幕顶部的 Test 选项卡,您会看到类似图 3 的界面。

图 3. perishable-network - Test 选项卡
perishable-network - Test 选项卡
perishable-network - Test 选项卡

请注意,来自模型的 Assets 和 Participants 出现在屏幕左侧,但屏幕中央有一条消息,指出该注册表是空的。怎么回事?

正如我在视频中介绍的,第一次创建业务网络时,Asset 和 Participant 注册表都是空的。您需要创建 Asset 和 Participant 实例,这些实例将放在注册表中。

在下一节中,我将介绍如何实例化并测试该模型。

测试业务网络

模型非常适合用作您将要构建的应用程序的一种蓝图,但除非(在某个时刻)得到某个实际结果,否则事物的模型没什么用。例如,如果您将要建设一栋建筑,那么一栋摩天大楼的一组蓝图就至关重要,但是,除非在某个时刻将它们实际用于建造(实例化)一栋实际建筑,否则它们没多大用处!

返回到业务模型,如果想让该模型变得有用,就需要将其实例化。但这对区块链应用程序意味着什么?

Asset 和 Participant 注册表

之前已经看到了针对 Grower 参与者、Shipment 资产等的模型。现在是时候将这些资源实例化了,它们的实例将位于各自的注册表中。所以资产实例位于 Asset 注册表中,参与者实例位于 Participant 注册表中。

Perishable-network 模型包含一个交易,该交易在 lib/logic.js 模块中实现为一个名为 setupDemo() 的 JavaScript 函数,您可以使用该函数实例化模型,并在 Asset 和 Participant 注册表中创建条目。与手动输入模型相比,这提供了让业务网络更快地利用模板正常运行的一种方法。

我不会在这里介绍 setupDemo() 函数,但我想指出它执行的 3 件事:

  1. 创建模型中的所有资产和参与者的实例
  2. 设置这些实例上的属性值
  3. 将实例存储在它们各自的注册表中

鼓励您在编辑器中打开 lib/logic.js 文件并自行查看它。

实例化模型

要执行 SetupDemo 交易,请单击 Submit Transaction 按钮,一个类似图 4 的模态对话框将会出现。

图 4. SubmitTransaction - SetupDemo
SubmitTransaction - SetupDemo
SubmitTransaction - SetupDemo

确保 SetupDemo 显示在 Transaction Type 下拉列表中,然后单击 Submit 按钮。成功执行交易后,您会看到一条告知您结果的简短通知消息。

在左侧 ASSETS 窗格中选择 Grower,它的所有实例都将出现在右侧(图 5)。其他资源也是如此(请自行试验!)。

图 5. 一个 Grower 资产实例
一个 Grower 资产实例
一个 Grower 资产实例

既然已经定义了一个业务网络,以及各自注册表中的资产和参与者,现在可以测试您的网络了。

交易是什么?

在本节中,目前我已经介绍了资产和参与者,但业务模型中的交易是什么?它们显示在何处?

首先回答第一个问题:交易表示应用程序的业务逻辑(智能合约或链代码)。setupDemo() 生成的智能合约所执行的业务逻辑规定了以下条件:

  1. 船运集装箱内的温度始终保持在 6 摄氏度。如果货物的温度超出商定的范围(+/- 5 度),那么每下降一度,货物的单价(0.50 美元)就会减少 0.20 美元,每上升一度,则减少 0.10 美元。
  2. 如果货物延迟送达,Grower 不会收到货款。

那么这些交易显示在何处呢?交易不会自行实例化,而在 lib/logic.js 中显示为 JavaScript 代码。

图 6 显示了执行合约中的第二条规定(货物延迟则不付款)的智能合约代码(来自 lib/logic.js)。

图 6. 智能合约:货物延迟处罚
智能合约:货物延迟处罚
智能合约:货物延迟处罚

如何实现访问控制?

访问控制由模型中的一个名为 permissions.acl 的文件管理。在业务网络概念部分,我将访问控制作为一个主要概念进行了介绍。在第 2 和第 3 部分中,我会更详细地介绍这个非常重要的主题,还会介绍如何控制对区块链应用程序的访问。

让我们看看您的模型的 Define 选项卡中的 permissions.acl。perishable-network 模板包含一个类似下面文件的访问控制列表 (ACL) 文件:

                /**
                 * Sample access control list.
                 */
                rule Default {
                    description: "Allow all participants access to all resources"
                    participant: "ANY"
                    operation: ALL
                    resource: "org.acme.shipping.perishable.*"
                    action: ALLOW
                }
                
                rule SystemACL {
                  description:  "System ACL to permit all access"
                  participant: "org.hyperledger.composer.system.Participant"
                  operation: ALL
                  resource: "org.hyperledger.composer.system.**"
                  action: ALLOW
                }

ACL 文件包含用于控制对区块链应用程序中的资源的访问的规则。一言以蔽之,Hyperledger Composer 在实施安全保护时已考虑到了您,我将在本教程系列后面详细介绍这个主题。

就现在而言,上面定义的访问控制规则授予了完全开放的访问权,这暂时没有问题,因为您刚开始使用 Hyperledger Composer。

测试模型

既然已经将模型实例化,是时候测试它了,这意味着要运行代码!在本例中,这意味着运行 lib/logic.js 中的 JavaScript 代码。

在设置测试之前,让我们检查一下合约(已在 setupDemo() 函数中实例化),了解一下其中的条款。图 7 给出了用于实例化合约资产的 JavaScript 代码:

图 7. 智能合约:条款和条件
智能合约:条款和条件
智能合约:条款和条件

现在您已准备好测试智能合约。在浏览器中运行 Playground,单击 Playground UI 顶部的 Test 选项卡。

让我们测试一下以下场景:

  1. IoT 温度传感器提供了以下读数(单位为摄氏度):
    1. 5
    2. 7
    3. 1
    4. 4
  2. 货物已收到。

让我们逐个查看此场景的组成部分,先从温度传感器数据开始。

在真实的应用程序中,IoT 温度传感器会将此数据发送到 IBM Cloud,在这里会针对区块链来调用智能合约代码,以便记录这些交易。

在 Playground 中,区块链是在浏览器的本地存储中维护的,但无论区块链位于何处,执行的交易代码都是相同的(这使得 Playground 成为了一个完美的测试场所,对吧?)。

检查 lib/logic.js 中的 temperatureReading() 函数:

                /**
                 * A temperature reading has been received for a shipment
                 * @param {org.acme.shipping.perishable.TemperatureReading} temperatureReading - the TemperatureReading transaction
                 * @transaction
                 */
                function temperatureReading(temperatureReading) {
                
                    var shipment = temperatureReading.shipment;
                
                    console.log('Adding temperature ' + temperatureReading.centigrade + ' to shipment ' + shipment.$identifier);
                
                    if (shipment.temperatureReadings) {
                        shipment.temperatureReadings.push(temperatureReading);
                    } else {
                        shipment.temperatureReadings = [temperatureReading];
                    }
                
                    return getAssetRegistry('org.acme.shipping.perishable.Shipment')
                        .then(function (shipmentRegistry) {
                            // add the temp reading to the shipment
                            return shipmentRegistry.update(shipment);
                        });
                }

在真实的应用程序中,当船运集装箱中的 IoT 传感器想要发送读数时,它会(通过货船的网络)将读数发送到云端,在 OpenWhisk 中运行的一个无服务器函数(它将调用 temperatureReading() 函数)会在云中获取该读数。

要在 Playground 中模拟此过程:

  1. 单击 Submit Transaction 按钮(就像调用 setupDemo() 函数时所做的一样)。
  2. 确保 TemperatureReading 出现在 Transaction Type 下拉列表中。
  3. JSON Data Preview 窗口中,将“centigrade”读数从 0 更改为 5(我们想要发送的第一个读数)。
  4. 确保货物 ID 设置为 SHIP_001。
  5. 单击 Submit
  6. 对剩余 3 个读数重复此过程。

要在真实应用程序中接收货物,在进口商的手持设备上运行的应用程序能向在 IBM Cloud 中运行的应用程序(或 OpenWhisk 中运行的无服务器函数)表明货物已收到,后者随后会计算要汇给种植者的款项。

要在 Playground 中模拟货物接收,可在 Playground 中运行 ShipmentReceived 交易,确保提供了货物的 ID,并单击 Submit

视频:测试模型,查看交易

我知道,我们已经覆盖了很多地方。但是不用担心:在下面的视频中,我将展示如何测试模型,并查看您在浏览器的 JavaScript 控制台中运行的所有交易的结果。

Hyperledger Composer Playground -                     创建并测试区块链网络
Hyperledger Composer Playground - 创建并测试区块链网络

点击查看视频演示查看抄本

处理模型

您已有了这个很棒的区块链业务网络。现在该做什么?

导出模型

假设您想让模型可供团队的其他成员使用,或者需要导出模型,以便将它部署到生产中的一个真实区块链网络(第 2 部分将介绍如何实现此目的)。

Playground 有一个导出特性,该特性允许您创建可以共享的业务网络归档 (BNA) 文件。要导出模型,请在 Define 选项卡中,单击屏幕左下角的 Export 链接,Playground 会生成一个业务网络归档 (BNA) 文件,然后将它下载到您的计算机。

导入模型

假设您有一个业务网络归档 (BNA) 文件(或许它是一个团队成员提供给您的),而且您想在 Playground 中使用它。

如何将 BNA 文件导入 Playground 中?首先,确保 Playground 在正常运行。然后,在 Define 选项卡下,选择 Import/Replace。在 Import/Replace Network 屏幕上,单击 Drop here to upload or browse,使用浏览对话框找到并选择想要导入的 BNA 文件,并选择 Open。然后单击 Import,确认您想将当前模型替换为想要导入的模型。

备注:如果在导入 BNA 文件时遇到麻烦,可能需要清除浏览器的本地存储,然后尝试再次导入。请参阅本教程前面的“删除 localhost 浏览器存储”,了解有关的更多信息。

第 1 部分小结

本教程系列的第 1 部分展示了如何使用 Docker 运行 Playground,介绍了 Hyperledger Composer 建模语言 (CTO) 的基础知识。您还通过基于 Playground Docker 映像所提供的 perishable-network 模板创建一个新业务网络,查看了简单的业务网络模型在 Playground 中的外观。

然后,该教程展示了如何通过将各种温度读数交易存储到区块链来测试该模型,以及智能合约如何使用这些交易在收到货物时处理合约的条款。

最后,我展示了如何分别通过在 Playground 中导出和导入模型,与同事和其他人共享模型。

现在请参阅第 2 部分,我将向您展示如何构建和优化现有业务网络,并对其进行单元测试并将其部署到 IBM Cloud。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing
ArticleID=1058911
ArticleTitle=Hyperledger Composer 基础,第 1 部分: 建模和测试您的区块链网络
publish-date=04192018