内容


将一个样本应用部署到 IBM Blockchain Platform Starter Plan

使用 Hyperledger Fabric “fabcar” 样本快速启动并运行 Starter Plan

Comments

在本教程中,您将了解如何在 IBM Blockchain Platform Starter Plan 上创建一个网络,在该网络中的节点上安装智能合约(链码),并运行一个样本应用来调用该智能合约。您还将了解如何填充共享账本,以及如何从本地客户端应用执行调用来查询和更新账本,与它进行通信。

IBM Blockchain Platform Starter Plan 是在 IBM Cloud 上运行的完全集成的企业就绪服务。该平台是为加速多机构业务网络的开发、治理和运营而设计的。Starter Plan 专门针对测试和开发场景,而非生产场景。对于生产场景,您应该使用 Enterprise Plan。

本教程中使用的样本应用是一个名为 “fabcar” 的 Hyperledger Fabric 样本,尽管您可以查看该样本并在 Docker 容器中本地运行它,但在本教程中,您将了解如何在 IBM Cloud 上的 IBM Blockchain Platform Starter Plan 上安装并运行它。

请注意,IBM Blockchain Platform 经常更新,本教程中的屏幕截图与您看到的屏幕可能并不完全相同。

学习目标

  • 熟悉 IBM Blockchain Platform Starter Plan
  • 在 Starter Plan 上创建您的第一个网络。
  • 在网络中的节点上安装链码。
  • 运行一个样本应用以调用该链码。
  • 填充、查询并更新共享账本。

完成本教程所需时间

  • 大约 45 到 60 分钟。

前提条件

  • 您将需要创建一个IBM Cloud 帐户(如果还没有的话)。
  • 您将需要在本地机器上安装 git,以便您可以从 GitHub 获得样本链码进行部署。
  • 您需要在本地机器上安装 Node.js 和 npm,以便您可以配置应用。目前支持 Node.js v9.x;您需要使用 v8.9.x。
1

在 IBM Blockchain Platform Starter Plan 上创建一个网络

  1. 登录您的 IBM Cloud 帐户(若还没有帐户,则创建一个帐户)。
  2. 首先打开 Rapidly build with IBM Blockchain Platform 页面,选择 Service Plans。确保您已登录到您的 IBM Cloud 帐户。

    输入 Blockchain-demo 作为服务名称,然后选择 Starter Plan Membership 并单击 Create

    选择服务名称和部署区域
    选择服务名称和部署区域
  3. 您现在可以看到 “Network created!” 面板。单击此面板上的 Launch,查看您的网络的仪表板。 启动您的网络
    启动您的网络
  4. 接下来,您会看到 “Let’s get started!” 欢迎屏幕。完成阅读后单击 Got it欢迎面板
    欢迎面板
  5. 请注意,在左上角处已经为您生成了一个名称。单击该名称并将其更改为 fabcar更改网络名称
    更改网络名称
  6. 更改了名称之后,您将在右上角看到一个弹出几秒钟的对话框,通知您更改成功: 指示您已经成功更改了网络名称
    指示您已经成功更改了网络名称
  7. 在对话框外,您可以看到 Starter Plan 为您创建了一个运行的简单网络。单击 Overview 选项卡,您可以看到自动为您创建的内容: Overview 面板
    Overview 面板

    该网络实际上由两个组织构成:Company A (Org1)Company B (Org2)。默认情况下,您以 Org1 身份登录,因此只能看到由两个组织共享的 Orderer 服务,以及一个认证中心 (CA) 和一个面向 Org1 的 Peer

  8. 单击左侧的 Members 选项卡,更详细地查看这些网络成员: Members 面板
    Members 面板
  9. 单击左侧的 Channels 选项卡,您会看到同时创建了一个名为 defaultchannel 的通道: Channels 面板
    Channels 面板
  10. 在本教程中,为简单起见,我们将使用这个 defaultchannel。单击表中的 defaultchannel 行,查看该通道的更多详细信息: defaultchannel 详细信息
    defaultchannel 详细信息
  11. 请注意,此处通道控制的链上已有 3 个区块。这些区块存储初始配置信息。您可以根据需要选择每一行来查看更多详细信息。
2

在通道上安装链码

下一步是将链码部署到通道上。但首先,您需要使用 git clone 从 GitHub 存储库中获取链码。

  1. 请确保您在本地机器上安装了 git
  2. 打开命令行或终端窗口,导航至合适的目录,并创建一个名为 fabcar 的新目录。导航至新的 fabcar 目录,并运行以下命令来克隆 Fabric 样本源:
    git clone https://github.com/hyperledger/fabric-samples.git

    此命令会将所有样本的代码复制到本地机器。 使用 Starter Plan Ui,从左侧边栏选择 Install Code 选项卡以查看 “Install code” 面板:

    Install code 面板
    Install code 面板
  3. 单击名为 Choose-peer... 的下拉菜单,并选择 org1-peer1。现在单击 Install Chaincode 按钮。 Install chaincode 面板
    Install chaincode 面板
  4. 在 “Install chaincode on org1peer1” 对话框中,在 “Chaincode ID” 处输入 fabcar,并在 “Chaincode Version” 处输入 v1

    您可以选择部署 Node.js 或 Golang 版本的 fabcar 链码。二者提供的功能相同,您可以自行选择。在 “Chaincode Type” 处选择 NodeGolang

    最后,在此面板上,单击 Choose files 选择要安装的链码源:

    • 要使用 Go 版本,请在您从 GitHub 下载的 fabric-samples/chaincode/fabcar/go 文件夹中选择单个 fabcar.go 链码文件。 fabcar 链码的 Go 版本
      fabcar 链码的 Go 版本
    • 或者,要使用 Node.js 版本,请在您从 GitHub 下载的 fabric-samples/chaincode/fabcar/node 文件夹中同时选择 fabcar.js 文件和 package.json文件。 fabcar 链码的 Node 版本
      fabcar 链码的 Node 版本

    进行了选择后,单击 Submit 按钮将链码上传至 Starter Plan。

  5. 接下来,您需要实例化链码。单击 Actions 列中的三点图标来查看菜单,并选择 Instantiate安装链码
    安装链码
  6. Instantiate chaincode 对话框中,没有为 fabcar 提供参数,因为它不需要任何参数。但是,您需要从 Channel 下拉菜单中选择 defaultchannel ,并将 “Chaincode Type” 与前面上传代码的语言(NodeGolang)进行匹配。然后,单击 Submit实例化链码
    实例化链码
  7. 完成后,您可以选择 fabcar 行进行查看,确认链码现在已经在 defaultchannel 上实例化: 实例化链码
    实例化链码
  8. 在通道上实例化链码后,选择 Channels 侧边选项卡,并选择 defaultchannel 行来查看其详细信息: defaultchannel 详细信息
    defaultchannel 详细信息

    您现在可以看到通道上有一个额外的区块,它是您执行的上述实例化操作的记录。

  9. 现在,在此面板中选择 Chaincode 选项卡,并选择 fabcar 行将其展开。您现在可以在 fabcar 下看到 2 个按钮:
    • JSON 是包含区块链网络的凭证和节点信息的文件。
    • Delete 用于停止并删除链码实例。
    fabcar 详细信息
    fabcar 详细信息
  10. 最后,单击上面显示的 JSON 按钮,这样将打开一个新选项卡。将此选项卡中显示的所有数据都复制到一个名为 network-profile.json 的新文件中,并将此文件保存在您的机器上的某个位置;稍后,您需要对其进行复制。
3

配置应用以在 IBM Blockchain Platform 上运行

您从 GitHub 下载的 fabcar 应用是硬编码的,用于使用 Hyperledger Fabric 的本地实例。由于我们正在远程使用 IBM Blockchain Platform 上的 Hyperledger Fabric,因此您需要获得新版本的 fabcar 应用,这些应用将使用您刚刚下载并保存的 network-profile.json 配置文件安全地连接到远程平台。

最初的 4 个 fabcar 应用分别被称为:

  • enrollAdmin.js
  • registerUser.js
  • invoke.js
  • query.js

获得 fabcar 应用的新版本

这些文件的新版本位于一个名为 fabcar-network 的 GitHub 存储库中。这些新文件均以 Network 一词结尾,表示这些是可以远程访问 fabcar 的新版本:

  • enrollAdminNetwork.js
  • registerUserNetwork.js
  • invokeNetwork.js
  • queryNetwork.js

GitHub repo 中的另一个文件是一个配置文件,它包含了访问远程 fabcar 链码所需的一些额外配置。该文件名为:

  • client-profile.json

要获得这些文件,请在 fabric-samples 文件夹中运行以下命令:

git clone https://github.com/m-g-k/fabcar-network.git

此命令将创建一个名为 fabcar-network 的文件夹,该文件夹与现有 fabcar 文件夹处于同一级别。

下一步是将先前下载并保存的 network-profile.json 文件以及现有的 client-profile.json 文件复制到 fabric-samples/fabcar-network/config 文件夹中。

运行 npm install

fabcar 客户端应用的网络版本是使用 Node.js 编写的。要完成下一步骤,您需要在本地机器上安装 Node.js 和 npm。

  1. 返回至命令行或终端窗口,并在 fabric-samples/fabcar-network 文件夹中运行 npm install 命令:
    npm install

    在 Windows 上,如果遇到构建错误,可能需要安装 Windows Build Tools:

    npm install --global windows-build-tools

    现在已经安装了所有必备的 node 包,以便运行 fabcar 客户端应用。

注册管理员

在 Starter Plan 中创建网络时,每个组织都有一个名为 admin 的管理员用户,该用户会自动注册到认证中心 (CA)。现在,您需要将注册请求发送至 CA 来检索该用户的注册证书 (eCert)。

  1. fabric-samples/fabcar-network 文件夹中运行:
    node enrollAdminNetwork.js

    您会看到类似如下的输出:

    > node enrollAdminNetwork.js
    Found organization: org1 and ca name: org1-ca
    Enrolling using enrollmentId: admin and EnrollmentSecret: 2d87ae1b59
    Successfully enrolled admin user "admin" with msp: “org1"
    Assigned the admin user to the fabric client ::{…}

enrollAdminNetwork.js 应用在其创建的 hfc-key-store 文件夹中创建本地公钥/私钥对,并将证书签名请求 (CSR) 发送至远程 CA,以便 org1 发出 eCert。eCert 和一些元数据也将存储到 hfc-key-store 文件夹中。CA 所在位置的连接详细信息以及与之连接所需的 TLS 证书,都是由应用从您之前下载的 network-profile.json 文件中获取的。

注册新用户

通过使用管理员用户的 eCert,您现在可以在 CA 中注册并登记一个名为 user1 的新用户。您将使用该用户的身份来查询和更新账本。

  1. fabric-samples/fabcar-network 文件夹中运行:
    node registerUserNetwork.js

    您会看到类似如下的输出:

    > node registerUserNetwork.js
    Successfully loaded admin from persistence
    Successfully registered "user1" - with secret:gTYshgoNxoLH
    Successfully enrolled member user "user1" with msp: “org1"
    "user1" was successfully registered and enrolled and is ready to interact with the fabric network

与上一个命令一样,此应用创建了一个新的公钥/私钥对,并向 CA 发送 CSR 请求,以便为 user1 发出 eCert。查看 hlf-key-store 文件夹时,您应该会看到 6 个文件,每个身份 3 个文件。

初始化账本

最初的 fabcar 样本有一个脚本,可以自动调用 initledger 事务,用 10 个初始的车辆来填充账本,以便快速启动。由于我们没有使用这个脚本,因此需要自己调用这个事务。已经编写了 invokeNetwork.js 命令来直接调用该事务。

  1. fabcar 文件夹中运行:
    node invokeNetwork.js

    您会看到以类似如下内容结束的输出:

    …
    Successfully committed the change to the ledger by the peer

由于链码在单独的链码 docker 容器中运行,因此首次使用时可能需要一些时间来启动此容器。如果出现超时或 “premature execution” 错误,请尝试再次运行该命令。如果在命令成功完成后查看 Channel Overview,您应该会看到账本上现在有一个额外的区块:

查询账本

invokeNetwork.js 命令现在已在账本中填充了 10 辆车的样本数据,让我们查询该账本来查看这些数据。为此,您将运行 queryNetwork.js 命令,用于查询账本上存在的所有车辆。

  1. fabcar 文件夹中运行:
    node queryNetwork.js

    您会看到类似如下的输出:

    > node queryNetwork.js
    Successfully loaded user1 from persistence
    Query has completed, checking results
    Response is  
    [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},
    {"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},
    {"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},
    {"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},
    {"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},
    {"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},
    {"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},
    {"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},
    {"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},
    {"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

更新账本

最后,您可以对账本执行一次更新。为此,您需要对 invokeNetwork.js 命令稍作更改。

  1. 在您选择的编辑器(比如,atom 或 VSCode)中打开 invokeNetwork.js 文件。然后,找到并编辑 request 变量,如下所示,以便使用一组描述要创建车辆的参数来调用 createCar 链码。更改后的 request 变量应该类似如下:
    var request = {
      chaincodeId: ‘fabcar',
      fcn: ‘createCar',
      args: ['CAR10', 'Honda', 'Accord', 'Black', 'Dave'],
      txId: tx_id
    };
  2. 保存文件,并使用 node invokeNetwork.js 运行编辑后的命令。预期输出为:

    …
    Successfully committed the change to the ledger by the peer.

    现在可以做一些试验,使用不同的姓名和车主在账本上创建新车。查看 Channel Overview 时,您应该会看到在创建新车时添加的新区块。

  3. 要更改车辆的所有者,请使用 changeCarOwner 事务在 invokeNetwork.js 中更改 request 变量。例如:
    var request = {
      chaincodeId: ‘fabcar',
      fcn: ‘changeCarOwner',
      args: ['CAR10', 'MGK'],
      txId: tx_id
    };

    保存该文件,并使用 node invokeNetwork.js 再次运行该命令。预期输出为:

    …
    Successfully committed the change to the ledger by the peer

    可以再次运行 queryNetwork.js 命令,查看账本上已更新的车主。可以看到 CAR10 的车主已从 “Dave” 更改为 “MGK”。

    如果想要查询一辆车而不是所有车,可以对 queryNetwork.js 命令中的 request 变量执行以下更改,并再次运行:

    const request = {
      chaincodeId: ‘fabcar',
      fcn: ‘queryCar',
      args: ['CAR10']
    };

    您现在应会看到一辆车的信息:

    > node queryNetwork.js
    Successfully loaded user1 from persistence
    Query has completed, checking results
    Response is 
    {"colour":"Black","make":"Honda","model":"Accord","owner":"MGK"}

结束语

现在,您在 IBM Blockchain Platform Starter Plan 上有了一个正在运行的网络,样本链码也已部署到了节点上,并在通道上进行了实例化。 您还有一个正在运行的应用,可以轻松地在本地使用。 您已在账本中填充了样本数据,而且您的应用现在可以与 IBM Blockchain Platform 上的区块链进行通信(查询和更新)。祝区块链开发愉快!

致谢

感谢 IBM 区块链实验室全球互动团队的 Anthony O’Dowd 在本教程开发过程中给予的专业指导和支持。

后续行动

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

评论

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing
ArticleID=1062598
ArticleTitle=将一个样本应用部署到 IBM Blockchain Platform Starter Plan
publish-date=08082018