5.2 Hyperledger Fabric – 教程 – 商业票据 (Commercial Paper)

5.2 Hyperledger Fabric – 教程 – 商业票据 (Commercial Paper)

教程 - 商业票据 (Commercial Paper) 本教程将向你展示如何安装和使用商业票据 (Commercial Paper) 示例应用程序和智能合约。这是一个面向任务的主题,因此强调了以上概念中的过程。当你想更详细地了解这些概念时,可以阅读 开发应用程序 主题。 image 在本教...

教程 – 商业票据 (Commercial Paper)

本教程将向你展示如何安装和使用商业票据 (Commercial Paper) 示例应用程序和智能合约。这是一个面向任务的主题,因此强调了以上概念中的过程。当你想更详细地了解这些概念时,可以阅读 开发应用程序 主题。

image

在本教程中,MagnetoCorp 和 DigiBank 这两个组织使用 Hyperledger Fabric 区块链网络 PaperNet 彼此进行商业票据交易。

建立基本网络后,你将担任 MagnetoCorp 员工 Isabella 的代表,他将代表该公司发行商业票据。然后,你将转而担任 DigiBank 员工 Balaji 的角色,他将购买此商业票据,保留一段时间,然后与 MagnetoCorp 赎回以获取少量利润。

你将分别在不同的组织中充当开发人员,终端用户和管理员的角色,执行以下步骤旨在帮助你了解作为两个不同的组织独立工作,但要根据 Hyperledger Fabric 网络中共同商定的规则进行协作。

  • 设置网络并下载示例
  • 创建一个网络
  • 了解智能合约的结构
  • 作为组织 MagnetoCorp 来安装和实例化智能合约
  • 了解 MagnetoCorp 应用程序的结构,包括其依赖项
  • 配置和使用钱包和身份
  • 运行 MagnetoCorp 应用程序以发行商业票据
  • 了解第二家组织 Digibank 如何在其应用程序中使用智能合约
  • 作为 Digibank,运行购买和赎回商业票据的应用程序

本教程已经在 MacOS 和 Ubuntu 上进行了测试,并且可以在其他 Linux 发行版上使用。Windows 版本正在开发中。

1. 先决条件

在开始之前,你必须安装本教程所需的一些必备技术。我们将这些限制降至最低,以便你可以快速上手。

你必须安装以下技术:

  • Node 8.9.0 或更高版本。Node 是一个 JavaScript 运行时,可用于运行应用程序和智能合约。建议你使用 Node 的长期支持 (Long Term Support, LTS) 版本。在 此处 安装 Node。
  • Docker 18.06 或更高版本。Docker 帮助开发人员和管理员创建用于构建和运行应用程序和智能合约的标准环境。Hyperledger Fabric 是作为一组 Docker 镜像提供的,PaperNet 智能合约将在 Docker 容器中运行。在 此处 安装 Docker。

你会发现安装以下技术会有所帮助:

  • 源代码编辑器,例如 Visual Studio Code 1.28 或更高版本。VS Code 将帮助你开发和测试你的应用程序和智能合约。在 此处 安装 VS Code。

提供了许多出色的代码编辑器,包括 AtomSublime TextBrackets

随着对应用程序和智能合约开发的经验越来越丰富,安装以下技术可能会有所帮助。初次运行本教程时,无需安装它们:

  • Node 版本管理器。NVM (Node Version Manager) 可帮助你轻松地在不同版本的 Node 之间切换 – 如果你同时从事多个项目,这将非常有用。在 此处 安装 NVM。

2. 下载示例

商业票据教程是 Hyperledger Fabric 示例 之一,该示例存储在公共 GitHub 仓库中,称为 fabric-samples。在你的计算机上运行教程时,你的第一个任务是下载 fabric-samples 仓库。

image

将 fabric-samples GitHub 仓库下载到本地计算机。

GOPATH 是 Hyperledger Fabric 中的重要环境变量;它标识要安装的根目录。无论你使用哪种编程语言,正确安装都非常重要!打开一个新的终端窗口,并使用 env 命令检查GOPATH 是否已设置:

$ env
...
GOPATH=/Users/username/go
NVM_BIN=/Users/username/.nvm/versions/node/v8.11.2/bin
NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
...

如果未设置 $GOPATH,请使用以下 指令

现在,你可以创建一个相对于 $GOPATH 的目录,将在其中安装 fabric-samples:

$ mkdir -p $GOPATH/src/github.com/hyperledger/
$ cd $GOPATH/src/github.com/hyperledger/

使用 git clone 命令将 fabric-samples 仓库复制到以下位置:

$ git clone https://github.com/hyperledger/fabric-samples.git

随时检查 fabric-samples 的目录结构:

$ cd fabric-samples
$ ls

CODE_OF_CONDUCT.md    balance-transfer            fabric-ca
CONTRIBUTING.md       basic-network               first-network
Jenkinsfile           chaincode                   high-throughput
LICENSE               chaincode-docker-devmode    scripts
MAINTAINERS.md        commercial-paper            README.md
fabcar

请注意 commercial-paper 目录,这是我们的示例所在的目录!

你现在已经完成了教程的第一阶段!在继续操作时,你将打开多个命令窗口,这些窗口将为不同的用户和组件打开。例如:

  • 代表 Isabella 和 Balaji 运行应用程序,他们将彼此进行商业票据交易
  • 代表 MagnetoCorp 和 DigiBank 的管理员发出命令,包括安装和实例化智能合约
  • 显示对端节点,交易排序器和 CA 日志输出

我们将在你应该从特定命令窗口运行命令时明确说明,例如:

(isabella)$ ls

表示你应该在 Isabella 的窗口中运行 ls 命令。

3. 创建网络

本教程当前使用基础网络。它将很快更新为更好地反映 PaperNet 的多组织结构的配置。目前,该网络足以向你展示如何开发应用程序和智能合约。

image

Hyperledger Fabric 基础网络包括一个对端节点及其账本数据库,一个交易排序器和一个证书颁发机构 (Certificate Authority, CA)。这些组件中的每一个都作为 docker 容器运行。

对端节点,帐本,交易排序器和 CA 均在各自的 docker 容器中运行。在生产环境中,组织通常使用与其他系统共享的现有 CA。它们不是专用于 Fabric 网络的。

你可以使用 fabric-samplesbasic-network 目录中包含的命令和配置来管理基础网络。让我们使用 start.sh shell 脚本在本地计算机上启动网络:

$ cd fabric-samples/basic-network
$ sudo ./start.sh

docker-compose -f docker-compose.yml up -d ca.example.com orderer.example.com peer0.org1.example.com couchdb
Creating network "net_basic" with the default driver
Pulling ca.example.com (hyperledger/fabric-ca:)...
latest: Pulling from hyperledger/fabric-ca
3b37166ec614: Pull complete
504facff238f: Pull complete
(...)
Pulling orderer.example.com (hyperledger/fabric-orderer:)...
latest: Pulling from hyperledger/fabric-orderer
3b37166ec614: Already exists
504facff238f: Already exists
(...)
Pulling couchdb (hyperledger/fabric-couchdb:)...
latest: Pulling from hyperledger/fabric-couchdb
3b37166ec614: Already exists
504facff238f: Already exists
(...)
Pulling peer0.org1.example.com (hyperledger/fabric-peer:)...
latest: Pulling from hyperledger/fabric-peer
3b37166ec614: Already exists
504facff238f: Already exists
(...)
Creating orderer.example.com ... done
Creating couchdb             ... done
Creating ca.example.com         ... done
Creating peer0.org1.example.com ... done
(...)
2018-11-07 13:47:31.634 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2018-11-07 13:47:31.730 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel

请注意 docker-compose -f docker-compose.yml up -d ca.example.com ... 命令如何从 DockerHub 中提取四个 Hyperledger Fabric 容器镜像,然后启动它们。这些容器具有适用于这些 Hyperledger Fabric 组件的软件的最新版本。欢迎浏览 basic-network 目录 – 在本教程中,我们将使用其中的大部分内容。

你可以使用 docker ps 命令列出运行基础网络组件的 Docker 容器:

$ sudo docker ps

CONTAINER ID        IMAGE                        COMMAND                  CREATED              STATUS              PORTS                                            NAMES
ada3d078989b        hyperledger/fabric-peer      "peer node start"        About a minute ago   Up About a minute   0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
1fa1fd107bfb        hyperledger/fabric-orderer   "orderer"                About a minute ago   Up About a minute   0.0.0.0:7050->7050/tcp                           orderer.example.com
53fe614274f7        hyperledger/fabric-couchdb   "tini -- /docker-ent…"   About a minute ago   Up About a minute   4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp       couchdb
469201085a20        hyperledger/fabric-ca        "sh -c 'fabric-ca-se…"   About a minute ago   Up About a minute   0.0.0.0:7054->7054/tcp                           ca.example.com

查看是否可以将这些容器映射到基础网络 (你可能需要水平滚动以查找信息):

  • 对端节点 peer0.org1.example.com 在容器 ada3d078989b 中运行
  • 交易排序器 orderer.example.com 正在容器 1fa1fd107bfb 中运行
  • 在容器 53fe614274f7 中正在运行 CouchDB 数据库 couchdb
  • CA ca.example.com 正在容器 469201085a20 中运行

这些容器都形成了一个名为 net_basicdocker 网络。你可以使用 docker network 命令查看网络:

$ sudo docker network inspect net_basic

    {
        "Name": "net_basic",
        "Id": "62e9d37d00a0eda6c6301a76022c695f8e01258edaba6f65e876166164466ee5",
        "Created": "2018-11-07T13:46:30.4992927Z",
        "Containers": {
            "1fa1fd107bfbe61522e4a26a57c2178d82b2918d5d423e7ee626c79b8a233624": {
                "Name": "orderer.example.com",
                "IPv4Address": "172.20.0.4/16",
            },
            "469201085a20b6a8f476d1ac993abce3103e59e3a23b9125032b77b02b715f2c": {
                "Name": "ca.example.com",
                "IPv4Address": "172.20.0.2/16",
            },
            "53fe614274f7a40392210f980b53b421e242484dd3deac52bbfe49cb636ce720": {
                "Name": "couchdb",
                "IPv4Address": "172.20.0.3/16",
            },
            "ada3d078989b568c6e060fa7bf62301b4bf55bed8ac1c938d514c81c42d8727a": {
                "Name": "peer0.org1.example.com",
                "IPv4Address": "172.20.0.5/16",
            }
        },
        "Labels": {}
    }

查看这四个容器如何成为一个 docker 网络的一部分,如何使用不同的 IP 地址。(为清楚起见,我们将输出缩写。)

回顾一下:你已经从 GitHub 下载了 Hyperledger Fabric 示例仓库,并且基础网络已在本地计算机上运行。现在,让我们开始扮演 MagnetoCorp 的角色,他希望买卖商业票据。

4. 担任 MagnetoCorp 角色

要监视 PaperNet 的 MagnetoCorp 组件,管理员可以使用 logspout 工具 查看一组 Docker 容器的聚合输出。它将不同的输出流收集到一个位置,从而可以轻松地从一个窗口查看正在发生的事情。例如,这对于安装智能合约的管理员或调用智能合约的开发人员确实很有帮助。

现在,让我们以 MagnetoCorp 管理员的身份监视 PaperNet。在 fabric-samples 目录中打开一个新窗口,找到并运行 monitordocker.sh 脚本以启动与 docker 网络 net_basic 关联的 PaperNet docker 容器的 logspout 工具:

(magnetocorp admin)$ cd commercial-paper/organization/magnetocorp/configuration/cli/
(magnetocorp admin)$ sudo ./monitordocker.sh net_basic
...
latest: Pulling from gliderlabs/logspout
4fe2ade4980c: Pull complete
decca452f519: Pull complete
(...)
Starting monitoring on all containers on the network net_basic
b7f3586e5d0233de5a454df369b8eadab0613886fc9877529587345fc01a3582

请注意,如果 Monitordocker.sh 中的默认端口已在使用中,则可以将端口号传递给上述命令。

(magnetocorp admin)$ ./monitordocker.sh net_basic 

现在,该窗口将显示 docker 容器的输出,因此让我们启动另一个终端窗口,该窗口将允许 MagnetoCorp 管理员与网络进行交互。

image

MagnetoCorp 管理员通过 Docker 容器与网络进行交互。

为了与 PaperNet 进行交互,MagnetoCorp 管理员需要使用 Hyperledger Fabric peer 命令。方便地,这些都可以在 hyperledger/fabric-tools docker 镜像 中预先构建。

让我们使用 docker-compose 命令 为管理员启动一个特定于 MagnetoCorp 的 Docker 容器:

(magnetocorp admin)$ cd commercial-paper/organization/magnetocorp/configuration/cli/
(magnetocorp admin)$ sudo docker-compose -f docker-compose.yml up -d cliMagnetoCorp

Pulling cliMagnetoCorp (hyperledger/fabric-tools:)...
latest: Pulling from hyperledger/fabric-tools
3b37166ec614: Already exists
(...)
Digest: sha256:058cff3b378c1f3ebe35d56deb7bf33171bf19b327d91b452991509b8e9c7870
Status: Downloaded newer image for hyperledger/fabric-tools:latest
Creating cliMagnetoCorp ... done

再次,查看如何从 Docker Hub 检索 hyperledger/fabric-tools docker 镜像并将其添加到网络:

(magnetocorp admin)$ docker ps

CONTAINER ID        IMAGE                        COMMAND                  CREATED              STATUS              PORTS                                            NAMES
562a88b25149        hyperledger/fabric-tools     "/bin/bash"              About a minute ago   Up About a minute                                                    cliMagnetoCorp
b7f3586e5d02        gliderlabs/logspout          "/bin/logspout"          7 minutes ago        Up 7 minutes        127.0.0.1:8000->80/tcp                           logspout
ada3d078989b        hyperledger/fabric-peer      "peer node start"        29 minutes ago       Up 29 minutes       0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
1fa1fd107bfb        hyperledger/fabric-orderer   "orderer"                29 minutes ago       Up 29 minutes       0.0.0.0:7050->7050/tcp                           orderer.example.com
53fe614274f7        hyperledger/fabric-couchdb   "tini -- /docker-ent…"   29 minutes ago       Up 29 minutes       4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp       couchdb
469201085a20        hyperledger/fabric-ca        "sh -c 'fabric-ca-se…"   29 minutes ago       Up 29 minutes       0.0.0.0:7054->7054/tcp                           ca.example.com

MagnetoCorp 管理员将使用容器 562a88b25149 中的命令行与 PaperNet 进行交互。还要注意日志记录容器 b7f3586e5d02;这是为 monitordocker.sh 命令捕获所有其他 docker 容器的输出。

现在,让我们使用此命令行以 MagnetoCorp 管理员的身份与 PaperNet 进行交互。

5. 智能合约

发行 (issue),购买 (buy) 和赎回 (redeem) 是 PaperNet 智能合约的三个核心功能。应用程序使用它来提交交易,这些交易相应地在账本上发行,购买和赎回商业票据。我们的下一个任务是检查智能合约。

打开一个新的终端窗口,代表 MagnetoCorp 开发人员,然后转到包含 MagnetoCorp 智能合约副本的目录,以便使用你选择的编辑器进行查 (本教程中的 VS 代码):

(magnetocorp developer)$ cd commercial-paper/organization/magnetocorp/contract
(magnetocorp developer)$ ls .

在文件夹的 lib 目录中,你将看到 papercontract.js 文件 – 该文件包含商业票据智能合约!

image

一个示例代码编辑器,在 papercontract.js 中显示商业票据智能合约。

papercontract.js 是一个 JavaScript 程序,旨在在 node.js 环境中运行。请注意以下关键程序行:

  • const { Contract, Context } = require('fabric-contract-api');

    该声明将智能合约广泛使用的两个关键 Hyperledger Fabric 类纳入了范围 – ContractContext。你可以在 fabric-shim JSDOCS 中了解有关这些类的更多信息。

  • class CommercialPaperContract extends Contract {

    这基于内置的 Fabric Contract 类定义了智能合约类 CommercialPaperContract。在此类中定义了实现发行 (issue),购买 (buy) 和赎回 (redeem) 商业票据的关键交易的方法。

  • async issue(ctx, issuer, paperNumber, issueDateTime, maturityDateTime...) {

    此方法为 PaperNet 定义了商业票据发行 (issue) 交易。传递给此方法的参数将用于创建新的商业票据。

    在智能合约中找到并检查购买 (buy) 和赎回 (redeem) 交易。

  • let paper = CommercialPaper.createInstance(issuer, paperNumber, issueDateTime...);

    在发行 (issue) 交易中,此语句使用带有提供的交易输入的 CommercialPaper 类在内存中创建新的商业票据。检查购买 (buy) 和赎回 (redeem) 交易,以了解它们如何类似地使用此类。

  • await ctx.paperList.addPaper(paper);

    该语句使用 ctx.paperList 将新的商业票据添加到帐本中,ctx.paperList 是在智能合约上下文 CommercialPaperContext 初始化时创建的 PaperList 类的实例。再次,检查购买 (buy) 和赎回 (redeem) 方法,以了解它们如何使用此类。

  • return paper.toBuffer();

    该语句返回一个二进制缓冲区作为发行 (issue) 交易的响应,由智能合约的调用者进行处理。

随时检查 contract 目录中的其他文件,以了解智能合约的工作原理,并详细阅读智能合约 主题papercontract.js 的设计方式。

6. 安装合约

在应用程序可以调用 papercontract 之前,必须将它安装到 PaperNet 中的相应对端节点上。MagnetoCorp 和 DigiBank 管理员能够将 papercontract 安装到他们各自具有权限的对端节点上。

image

MagnetoCorp 管理员将 papercontract 的副本安装到 MagnetoCorp 对端节点。

智能合约是应用程序开发的重点,并且包含在称为 链码 的 Hyperledger Fabric 构件中。可以在单个链码中定义一个或多个智能合约,安装链码将允许 PaperNet 中的不同组织使用它们。这意味着只有管理员才需要担心链码。其他人都可以根据智能合约进行思考。

MagnetoCorp 管理员使用 peer chaincode install 命令将 papercontract 智能合约从其本地计算机的文件系统复制到目标对端节点 Docker 容器内的文件系统。一旦将智能合约安装到对端节点并在通道上实例化,便可以由应用程序调用 papercontract,并通过 putState()getState() Fabric API与账本数据库进行交互。检查 ledger-apistatelist.js 中的 StateList 类如何使用这些 API。

现在,以 MagnetoCorp 管理员的身份安装 papercontract。在 MagnetoCorp 管理员的命令窗口中,使用 docker exec 命令在 cliMagnetCorp 容器中运行 peer chaincode install 命令:

(magnetocorp admin)$ sudo docker exec cliMagnetoCorp peer chaincode install -n papercontract -v 0 -p /opt/gopath/src/github.com/contract -l node

2018-11-07 14:21:48.400 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2018-11-07 14:21:48.400 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2018-11-07 14:21:48.466 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<200 payload:>

文章来源于互联网:5.2 Hyperledger Fabric – 教程 – 商业票据 (Commercial Paper)

0

评论0

鱼翔浅底,鹰击长空,驼走大漠
没有账号? 注册  忘记密码?