内容


使用 IBM Blockchain Starter Plan 将区块链业务网络部署到云端

启动预生产网络并在其上运行首个应用的便捷途径

Comments

在本教程中,将把现有样本业务网络 Car Auction 网络部署到云端,尤其是部署到 IBM Blockchain Platform Starter Plan。部署样本网络之后,您就可以开始在模拟的多组织网络上开发、演示和启动区块链应用。

本教程既不是关于 Hyperledger Fabric,也不是关于 Hyperledger Composer,前者是 IBM Blockchain Platform 的底层实现,而后者则提供快速构建业务网络和应用的现代工具集。Hyperledger Composer 提供一种业务模型,并且摒弃了其中的复杂性。

本教程主要介绍如何将使用 Hyperledger Composer 创建的现有样本业务网络部署到 IBM Cloud 上的 Starter Plan 实例。

学习目标

  • 使用 Cloudant NoSQL 数据库服务在 IBM Cloud 上创建一个钱包。
  • 将 Car Auction 样本网络部署到 IBM Cloud。
  • 启动样本网络。
  • 在云端为部署的样本网络公开 REST API。
  • 生成并运行使用这些 REST API 的 Angular 应用。

完成本教程所需时间

  • 大约 45 分钟。

前提条件

您需要在本地安装以下软件:

让我们开始吧

对于本次练习,我们要将广受欢迎的样本“Car Auction”网络(使用 Hyperledger Composer 构建)部署到 Starter Plan 实例。这张图像显示该样本网络上的参与者、资产以及典型事务。

利用 Hyperledger Composer,您可以快速构建业务网络和应用。要构建业务网络,您需要在 .cto 文件中定义一个业务模型,其中包含以下内容:

  • 参与者
  • 资产
  • 事务

在 Car Auction 网络中,业务模型中的参与者使用 AuctioneerMember 类型来表示,如下所示:

abstract participant User identified by email {
  o String email
  o String firstName
  o String lastName
}

participant Member extends User {
  o Double balance
}

participant Auctioneer extends User {
}

类似地,Car Auction 网络中的资产使用 VehicleVehicleListing 类型来表示,如下所示:

enum ListingState {
  o FOR_SALE
  o RESERVE_NOT_MET
  o SOLD
}

asset Vehicle identified by vin {
  o String vin
  --> Member owner
}

asset VehicleListing identified by listingId {
  o String listingId
  o Double reservePrice
  o String description
  o ListingState state
  o Offer[] offers optional
  --> Vehicle vehicle
}

Car Auction 网络中的事务OfferCloseBidding 类型来表示,如下所示:

transaction Offer {
  o Double bidPrice
  --> VehicleListing listing
  --> Member member
}

transaction CloseBidding {
  --> VehicleListing listing
}

要交换资产所有权,参与者需在业务网络上提交事务。

1

设置本地环境

  1. 如上所述,要将现有 Car Auction 网络部署到 IBM Cloud,您需要在本地安装以下软件:
  2. 如果您已经使用过 Hyperledger Composer,应当先卸载并重装最新版本的 Hyperledger Composer 0.19.5,以便与 Starter Plan 实例兼容,如下所示:
    $ rm -rf ~/.composer
    $ npm uninstall -g composer-cli
    $ npm uninstall -g generator-hyperledger-composer
    $ npm uninstall -g @ampretia/composer-wallet-cloudant
    $ npm install -g composer-cli@0.19.5
    $ npm install -g generator-hyperledger-composer@0.19.5
    $ npm install -g @ampretia/composer-wallet-cloudant
  3. 接下来,您应当克隆 GitHub 存储库,其中包含针对 Car Auction 网络的工件,如下所示:
    $ cd ~/Workdir
    $ git init business-networks
    $ cd business-networks
    $ git remote add -f origin https://github.com/hyperledger/composer-sample-networks
    $ git config core.sparseCheckout true
    $ echo "packages/carauction-network/" >> .git/info/sparse-checkout
    $ git pull origin master

此时,应该可以从 ~/Workdir/business-networks/packages/carauction-network 文件夹中找到针对 Car Auction 网络的工件。该文件夹将作为根文件夹。您将从此位置执行相关命令来构建业务网络,并将其部署到 Starter Plan 实例。

2

启动 IBM Cloud 上的 IBM Blockchain Starter Plan 实例

  1. 创建一个 IBM Cloud 帐户(如果还没有的话)。
  2. 拥有帐户之后,启动 Starter Plan 实例,如下所示:
启动 IBM Blockchain Starter Plan 实例
启动 IBM Blockchain Starter Plan 实例
  1. 当 Starter Plan 实例启动并运行之后,您就可以监控为您缺省设置的组织和对等项。通常情况下,您会有两个组织,每个组织都设有认证中心、订购服务以及背书/验证对等项。要查看这些要素,可以使用右上角配置文件图标下的下拉菜单,在两个组织之间进行切换,如下所示:
监控 IBM Blockchain Starter Plan 实例
监控 IBM Blockchain Starter Plan 实例

所产生的事务的分布式账本将存储在每个组织的对等项中。更多详细信息,请参阅 Hyperledger Fabric 文档

  1. 接下来,我们将使用 Company A (org1) 的 Connection Profile。所以,先在右上角选择 Company A,然后再开始后续步骤。
3

下载 Connection Profile

  1. 将 Company A (org1) 的 Connection Profile 下载到本地文件系统,如下所示:
下载 Connection Profile,并复制 enrollSecret
下载 Connection Profile,并复制 enrollSecret
  1. 记录原始 JSON 中 enrollSecret 属性的值。(您也可以通过在编辑器中打开下载的 JSON 文件,然后搜索 enrollSecret,从该文件中获取 enrollSecret 属性的值。)在后续步骤中,您将使用 enrollSecret 值来创建证书等内容。
  2. 重命名下载的 json 文件,并将其复制到前面步骤中设置的根文件夹下,如下所示:
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ mv ~/Downloads/creds_*_org1.json connection-profile.json
4

创建 Cloudant NoSQL DB 服务

既然我们计划在云端为业务网络公开 REST API,那么我们必须使用基于云的钱包来存储我们将使用 Hyperledger Composer 创建的卡。

  1. 为了在云端存储带有卡的钱包,您应当安装 composer-wallet-cloudant 节点模块(如果您在之前的步骤中没有安装),如下所示:
    $ npm install -g @ampretia/composer-wallet-cloudant
  2. 您应当在 ~/Workdir/business-networks/packages/carauction-network 目录下创建一个名为 cardstore-cloudant.json 的文件,其中包含以下内容:
    {
      "composer": {
        "wallet": {
          "type": "@ampretia/composer-wallet-cloudant",
          "options": {
            "database": "composer-wallets",
          }
        }
      }
    }

    请注意 cardstore-cloudant.json 文件中指定的数据库 composer-wallets 的名称。创建下一个数据库时须使用此名称。您可以为数据库选择不同的名称,只要它与 cardstore-cloudant.json 文件中指定的名称相同。

  3. 为了简单起见,要在与 Starter Plan 实例所在的同一区域、组织和空间中创建 Cloudant NoSQL 服务。另外,在 Cloudant NoSQL 服务中创建名为 composer-wallets 的数据库,如下所示:
创建 Cloudant NoSQL DB 服务以存储钱包
创建 Cloudant NoSQL DB 服务以存储钱包
  1. 成功创建 Cloudant NoSQL 服务和数据库之后,创建服务凭证并使用凭证更新 cardstore-cloudant.json,如下所示:
创建 Cloudant 凭证并更新 JSON 文件
创建 Cloudant 凭证并更新 JSON 文件

此时,cardstore-cloudant.json 应包含这些凭证以供 Hyperledger Composer 访问 Cloudant NoSQL DB 服务,并使用将在后续步骤中创建的卡填充 composer-wallets 数据库。

  1. 导出 NODE_CONFIG 环境变量,如下所示:
    $ export NODE_CONFIG=$(cat cardstore-cloudant.json)

从此刻起,所有后续命令都必须在设置了环境变量 NODE_CONFIG 的相同终端窗口/选项卡上执行,以确保基于云的钱包已填入必要的卡。

5

创建认证中心卡

  1. 使用在前面步骤中记录的 connection-profile.jsonenrollSecret 值,为 Company A (org1) 创建认证中心卡(如下所示),用之前记录的值替换 <your-enrollSecret>
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ composer card create -f ca.card -p connection-profile.json -u admin -s <your-enrollSecret>
  2. 导入新创建的卡,如下所示:
    $ composer card import -f ca.card -c ca
  3. 成功导入包含 enrollSecret 的卡后,从认证中心为管理员请求有效的公共/私有密钥,如下所示:
    $ composer identity request --card ca --path ./credentials

此时,~/Workdir/business-networks/packages/carauction-network/credentials 中应当包含管理员的公共和私有密钥。

6

将证书添加到 Starter Plan 中

最初,Starter Plan 实例在 Members 节点中没有任何证书,如您所见:

确认缺乏证书
确认缺乏证书
  1. 单击左侧的 Channels 节点会看到 Block Height 为 3,说明了到目前为止后台已执行的事务数量。单击 3 浏览查看 GENESIS 块,核查每个调用的详细信息。
  2. 在编辑器中打开位于 ~/Workdir/business-networks/packages/carauction-network/credentials/admin-pub.pem 中的管理员公共密钥,并将其内容复制到剪贴板上。您会将该公共密钥添加到 Starter Plan 实例中,如下所示:
添加证书
添加证书
  1. 添加公共密钥之后,您需要使用 Channels 节点在对等项之间同步证书,如下所示:
同步证书
同步证书
  1. 单击 Submit 按钮,完成证书同步流程。此时,如果返回查看 Channels 节点,您会看到 Block Height 已更新为 4。这说明在不可改变的分布式账本中,环境的每次变更也作为一项事务进行跟踪。
7

为管理员创建并导出业务网络卡

通过在对等项之间同步证书,您可以创建业务网络卡来安装 Hyperledger Composer,然后在 Starter Plan 实例上部署/启动链码或业务网络。

通过通道管理员和对等项管理员角色创建管理员卡,然后导入新创建的卡,如下所示:

$ cd ~/Workdir/business-networks/packages/carauction-network
$ composer card create -f adminCard.card -p connection-profile.json -u admin \
    -c ./credentials/admin-pub.pem -k ./credentials/admin-priv.pem \
    --role PeerAdmin --role ChannelAdmin
$ composer card import -f adminCard.card -c adminCard
8

安装并启动业务网络

在这一步,您将使用前一步创建的 adminCard,通过安装和启动业务网络的特权,将 Car Auction 网络安装到 Starter Plan 实例上。

  1. 为了能够安装和启动业务网络,您首先需要通过打包所需的工件,创建业务网络归档 (.bna) 文件,如下所示:
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ composer archive create -t dir -n .
  2. 其结果将会创建 carauction-network@0.x.y.bna 文件,其中 @0.x.y 表示在 package.json 文件中指定的版本。因为 Starter Plan 实例不接受名称中带有 @ 的文件,所以重命名该文件,如下所示:
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ mv carauction-network@*.bna carauction-network.bna
  3. 将业务网络和 Hyperledger Composer 运行时安装到 Starter Plan 实例上,如下所示:
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ composer network install -c adminCard -a carauction-network.bna
  4. 如果前一步操作失败,请等待几秒钟后重试。
  5. 运行时和业务网络安装成功之后,在 Starter Plan 实例上启动业务网络,如下所示: 将版本号指定为 package.json 文件中指定的版本号,代替 0.2.4
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ composer network start -c adminCard -n carauction-network -V 0.2.4 \
      -A admin -C ./credentials/admin-pub.pem -f delete_me.card

    您可能会遇到偶发性问题,比如 REQUEST_TIMEOUT。再次强调,请等待几秒钟后重试。除了启动业务网络,前一个命令也会使用 -A 开关,指定网络管理员的 ID,该网络管理员将负责为特定网络创建参与者和执行其他记账操作。

  6. 命令成功之后,核查 UI 中 Channels 节点下的 Block Height,您会看到数字已更新为 5,同时也会看到新安装/启动的 Car Auction 网络的详细信息。
  7. 删除冗余的 delete_me.card,它由前一个命令所生成,如下所示:
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ rm delete_me.card
9

为网络管理员创建相关卡

在前一部分启动业务网络时,我们使用了 -A 命令行参数来指定网络管理员的 ID,该网络管理员将负责通过在网络上向其他参与者发布身份等内容来运行网络。让我们来为网络管理员创建业务网络卡。

  1. 要为网络管理员创建业务网络卡,请使用以下命令:
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ composer card create -n carauction-network -p ./connection-profile.json \
      -u admin -c ./credentials/admin-pub.pem -k ./credentials/admin-priv.pem
  2. 使用以下命令导入该卡:
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ composer card import -f admin@carauction-network.card

此时,业务网络在 Starter Plan 实例上运行。

10

在云端为业务网络公开 REST API。

业务网络在 Starter Plan 实例上运行之后,您可以在云端运行 composer-rest-server 作为 Cloud Foundary 应用程序,从而在云端直接生成并公开 REST API,以供网络和移动/本地应用程序使用。确保已设置 NODE_CONFIG 环境变量,然后执行以下命令以在云端公开 REST API:

$ cf login -a https://api.ng.bluemix.net --sso
$ cf push car-auction --docker-image ibmblockchain/composer-rest-server:0.19.5 \
    -c "composer-rest-server -c admin@carauction-network -n never -w true" \
    -i 1 -m 256M --no-start --no-manifest
$ cf set-env car-auction NODE_CONFIG "${NODE_CONFIG}"
$ cf start car-auction

运行 cf start car-auction 命令需要花费一些时间。 最后,您会在终端看到以下输出:

Starting app car-auction in org Sanjay-Bluemix / space dev as ...
Creating container
....
Successfully destroyed container

0 of 1 instances running, 1 starting
...
1 of 1 instances running
0 of 1 instances running, 1 starting
...
1 of 1 instances running

App started

OK

App car-auction was started using this command `composer-rest-server -c admin@carauction-network -n never -w true`

Showing health and status for app car-auction in org Sanjay-Bluemix / space dev as ...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: car-auction.mybluemix.net
last uploaded: Mon May 21 16:12:14 UTC 2018
stack: cflinuxfs2
buildpack: unknown

     state     since                    cpu     memory           disk         details
#0   running   2018-05-21 09:19:39 AM   16.8%   154.9M of 256M   1.3M of 1G

请注意以上输出中的 URL https://car-auction.mybluemix.net。 您可以将浏览器转至 https://car-auction.mybluemix.net,浏览和练习 REST API,创建新的参与者和资产,然后提交事务,同时会观察到 Channels 节点下的 Block Height 在增加。如果您查看定义 Car Auction 网络业务模型的 auction.cto 文件,将会回想起参与者是由 AuctioneerMember 类型表示的;资产是由 VehicleVehicleListing 类型表示的;事务则是使用 OfferCloseBidding 类型来定义的。

本视频展示如何使用 JSON 有效内容来练习 REST API:

使用部署的业务网络练习 REST API
使用部署的业务网络练习 REST API

在以上视频中,您可以看到创建了下列参与者:

  • 创建 Bobby Da Boss 作为运行拍卖的 Auctioneer,电子邮件地址为 bobby.da.boss@example.com。
  • 创建 James Bond 作为 Member,账户余额为 1000 美元,电子邮件地址为 james.bond@example.com。
  • 创建 Jason Bourne 作为 Member,账户余额为 2000 美元,电子邮件地址为 jason.bourne@example.com。
  • 创建 Bruce Wayne 作为 Member,账户余额为 5000 美元,电子邮件地址为 bruce.wayne@example.com。

创建完所有这些参与者之后,您可以看到 Channels 节点下的 Block Height 在逐渐增加,因为这些变更作为事务记录在了分布式账本中。

在视频中,您还将看到创建了下列资产:

  • 将用 BM_001 标识并由 bruce.wayne@example.com 拥有的 Vehicle 添加到网络中。
  • Bruce Wayne 提供了一辆以 BM_001 标识的蝙蝠车,为了出售,创建了以 L1 标识的 VehicleListing,并要价 500 美元。

再次强调,完成每次操作之后,Channels 节点下的 Block Height 都会增加。

最后,在视频中,您还将看到提交了下列事务:

  • 以 James Bond 的名义提出 800 美元的 Offer
  • 以 Jason Bourne 的名义提出 1200 美元的 Offer

最后,拍卖人 Bobby Da Boss 将会提交 CloseBidding 事务。您会看到蝙蝠车的所有权从 bruce.wayne@example.com 变更为 jason.bourne@example.com。您也会看到 Bruce Wayne 的余额增加了 1200 美元。Jason Bourne 的余额则减少了 1200 美元。

参与者提交事务以及交换资产之后,您也将看到 Block Height 逐步增加。每个变更都作为事务记录在分布式账本中,存储在两个组织的对等项上。在进行更改之后,您可以观察到 Block Height 在增加,正如以上视频所示。

11

为业务网络生成 Angular 应用

您可以通过使用 Yeoman 生成器生成的 Angular 应用,练习前一步中生成的 REST 端点。

  1. 安装 generator-hyperledger-composeryo,如下所示:
    $ npm install -g generator-hyperledger-composer
    $ npm install -g yo
  2. 您应当在包含 connection-profile.json 的根目录下生成 Angular 应用。此外,您应当将 URL https://car-auction.mybluemix.net 用作 REST 服务器地址,将 443 用作 REST 服务器端口号,如下所示:
    $ cd ~/Workdir/business-networks/packages/carauction-network
    $ yo hyperledger-composer:angular
    
    Welcome to the Hyperledger Composer Angular project generator
    ? Do you want to connect to a running Business Network? Yes
    ? Project name: angular-app
    ? Description: Hyperledger Composer Angular project
    ? Author name: foo
    ? Author email: foo@example.com
    ? License: Apache-2.0
    ? Name of the Business Network card: admin@carauction-network
    ? Do you want to generate a new REST API or connect to an existing REST API?  Connect to
    an existing REST API
    ? REST server address: https://car-auction.mybluemix.net
    ? REST server port: 443
    ? Should namespaces be used in the generated REST API? Namespaces are not used
    Created application!

    这将在 angular-app 文件夹中生成应用。

12

运行 Angular 应用

要运行生成的 Angular 应用,请执行以下操作:

$ cd ~/Workdir/business-networks/packages/carauction-network
$ cd angular-app
$ npm start

将编译该应用,您最后可以通过将浏览器指向 http://localhost:4200,与该应用交互。本视频展示了先前部分涉及的 VehicleVehicleListing 资产,这些资产是直接使用 REST API 来创建和更新的。

运行 Angular 应用
运行 Angular 应用

结束语

现在,您已知道如何在 IBM Cloud 上的 Starter Plan 中使用区块链即服务。您已准备好利用部署自己的业务网络的优势,因此可以大胆尝试。一旦您感到满意,就可以将部署无缝转移到 Enterprise Plan。

后续行动

  • 既然您已部署了样本网络,就可以阅读由 Steve Perry 编写的热门系列 Hyperledger Composer 基础知识,学习如何使用 Hyperledger Composer 从头开始创建业务网络。
     
  • 查阅许多 Code Pattern,它们为解决区块链技术中遇到的复杂问题提供了路线图,并包括架构图、代码存储库和其他阅读材料。
     
  • 访问区块链开发人员中心。可以在这里获得开发和部署商业区块链解决方案的免费工具和教程,以及代码和社区支持。

作者简介

Sanjay Saxena 是 IBM 高级技术人员兼 IBM Cloud 开发大使。他目前主攻区块链、IoT、AR/VR 以及 Jupyter/Spark 等新兴技术。Sanjay 拥有二十多年的系统开发经验,包括基于 MVC 的元数据驱动应用开发框架、实时通信以及在 Java、C#、Objective-C 和 JavaScript 之间发布/订阅消息传递。Sanjay 已婚,且育有两个孩子,他喜欢滑雪、STEM 以及混合各种调味料和酒精调制出完美的鸡尾酒。


评论

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing
ArticleID=1061717
ArticleTitle=使用 IBM Blockchain Starter Plan 将区块链业务网络部署到云端
publish-date=07102018