如何使用Hyperledger Fabric和Composer构建区块链网络

栏目: PHP · 发布时间: 5年前

内容简介:如何使用Hyperledger Fabric和Composer构建区块链网络,这是一个区块链开发入门人员的教程。在开始之前要说明Hyperledger Fabric仅在基于Unix的操作系统上运行。因此,它将无法在Windows上运行,这将对你可以执行的操作进行限制。如果你在继续操作之前运行Windows,我建议你设置虚拟机。本文假设你有一些Javascript知识。它不是针对初学者程序员的教程,而是针对区块链领域初学者的程序员。那么,你想建立一个区块链应用程序,但不知道从哪里开始?别担心。通过本教程,我们

如何使用Hyperledger Fabric和Composer构建区块链网络,这是一个区块链开发入门人员的教程。在开始之前要说明Hyperledger Fabric仅在基于Unix的操作系统上运行。因此,它将无法在Windows上运行,这将对你可以执行的操作进行限制。如果你在继续操作之前运行Windows,我建议你设置虚拟机。

本文假设你有一些Javascript知识。它不是针对初学者 程序员 的教程,而是针对区块链领域初学者的程序员。

我们在建什么?

那么,你想建立一个区块链应用程序,但不知道从哪里开始?别担心。通过本教程,我们将建立一个交易卡网络。拥有棒球,足球和板球运动员的 TradingCard 的不同 Trader 将能够相互交易卡。

我们还将设置REST API服务器,以允许客户端软件与我们的业务网络进行交互。 最后,我们还将生成一个Angular 4应用程序,该应用程序使用REST API与我们的网络进行交互。

你可以在 Github 中找到我们要构建的完整最终代码。

你准备好开始了吗?

目录

  • Hyperledger Fabric及相关应用程序简介。
  • 安装先决条件,工具和Fabric运行时。
  • 创建和部署我们的业务网络。
  • 测试我们的业务网络。
  • 生成REST API服务器。
  • 生成使用REST API的Angular应用程序。

Hyperledger Fabric及相关应用程序简介

如何使用Hyperledger Fabric和Composer构建区块链网络

Hyperledger Fabric是一个开源框架,用于制作私有(许可)区块链业务网络,其中成员的身份和角色为其他成员所共知。基于Fabric的网络作为后端,开发具有客户端应用程序的前端。SDK可用于Nodejs和 Java 来构建客户端应用程序,很快就会支持 Python 和Golang。

Hyperledger Composer是一组基于Javascript的 工具 和脚本,可简化Hyperledger Fabric网络的创建。使用这些工具,我们可以为我们的网络生成业务网络存档(BNA) 。Composer广泛涵盖了这些组件:

  • 业务网络档案(BNA)
  • Composer Playground
  • Composer REST服务器

Business Network Archive(BNA)——Composer允许我们打包几个不同的文件并生成一个存档,然后可以将其部署到Fabric网络上。要生成此存档,我们需要:

  • 网络模型:网络中存在的资源的定义。这些资源包括资产,参与者和交易。我们稍后会回到这些内容。
  • 业务逻辑:交易功能的逻辑。
  • 访问控制限制:包含定义网络中不同参与者权限的各种规则。这包括但不限于定义参与者可以控制的资产。
  • 查询文件(可选):可以在网络上运行的一组查询。这些可以被认为与 SQL 查询类似。你可以在 此处阅读 有关查询的更多。

Composer Playground是一个基于Web的用户界面,我们可以使用它来建模和测试我们的业务网络。Playground适用于简单的概念证明建模,因为它使用浏览器的本地存储来模拟区块链网络。但是,如果我们运行本地Fabric运行时并为其部署了网络,我们也可以使用Playground访问它。在这种情况下,Playground不会模拟网络,它直接与本地Fabric运行时通信。

Composer REST Server是一个允许我们根据业务网络定义生成REST API服务器的工具。客户端应用程序可以使用此API,并允许我们在网络中集成非区块链应用程序。

安装先决条件,工具和Fabric运行时

1.安装Prereqs

既然我们对构建这些网络所需的内容有了高度的了解,那么我们就可以开始开发了。但是,在我们这样做之前,我们需要确保在系统上安装了先决条件。可以在 此处 找到更新的列表。

  • Docker Engine和Docker Compose
  • Nodejs和NPM
  • Git
  • Python 2.7.x

对于Ubuntu用户,Hyperledger有一个bash脚本可以使这个过程变得非常容易。在终端中运行以下命令:

curl -O https://hyperledger.github.io/composer/latest/prereqs-ubuntu.sh
chmod u+x prereqs-ubuntu.sh
./prereqs-ubuntu.sh

不幸的是,Mac用户必须手动安装上述工具,并确保他们拥有系统的所有先决条件。 此页面 随安装说明保持最新。

2. 安装工具以简化开发

在终端中运行以下命令,并确保在运行npm命令时不使用sudo。

npm install -g composer-cli
npm install -g composer-rest-server
npm install -g composer-playground
npm install -g yo generator-hyperledger-composer

composer-cli是唯一必不可少的包。其余的不是核心组件,但随着时间的推移会变得非常有用。我们将了解更多关于每个人在遇到它们时所做的事情。

3. 安装本地Hyperledger Fabric运行时

mkdir ~/fabric-dev-servers
cd ~/fabric-dev-servers
curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.tar.gz
tar -xvf fabric-dev-servers.tar.gz
export FABRIC_VERSION=hlfv12
./downloadFabric.sh
./startFabric.sh
./createPeerAdminCard.sh

让我们看看命令,看看它们的含义。首先,我们制作并输入一个新目录。然后,我们下载并解压缩安装Hyperledger Fabric所需的工具。

然后我们指定我们想要的Fabric版本,在编写本文时我们需要1.2,因此 hlfv12 。然后,我们下载结构运行时并启动它。

最后,我们生成一个 PeerAdmin 卡。Fabric网络中的参与者可以拥有商业卡,类似于现实生活中的名片。正如我们之前提到的,Fabric是私有区块链构建的基础层。PeerAdmin名片的持有者有权在此Fabric运行时(也就是你!)上部署,删除和管理业务网络。

如果一切顺利,你应该看到这样的输出:

如何使用Hyperledger Fabric和Composer构建区块链网络

此外,如果你输入 ls 你会看到:

如何使用Hyperledger Fabric和Composer构建区块链网络

基本上我们在这里做的只是下载并启动本地Fabric网络。如果我们愿意,我们可以停止使用 ./stopFabric.sh 。在我们的开发会话结束时,我们应该运行 ./teardownFabric.sh

注意:此本地运行时应经常启动,停止和销毁以供开发使用。对于具有更持久状态的运行时,你需要在开发环境之外部署网络。你可以通过在Kubernetes上运行网络或在IBM Blockchain等托管平台上执行此操作。不过,你应该首先阅读本教程以获得一个想法。

创建和部署我们的业务网络

还记得我们之前安装的包 yogenerator-hyperledger-composer 吗?

yo 为我们提供了一个生成器生态系统,其中生成器是插件,可以使用yo命令运行。这用于为各种项目设置样板样本应用程序。 generator-hyperledger-composer 是我们将使用的Yo生成器,因为它包含用于生成业务网络样板的规范。

1.生成业务网络

在所选目录中打开终端并键入 yo hyperledger-composer

如何使用Hyperledger Fabric和Composer构建区块链网络

你会受到类似上述事情的欢迎。选择 Business Network 并将其命名为 cards-trading-network ,如下所示:

如何使用Hyperledger Fabric和Composer构建区块链网络

2. 建模我们的业务网络

建立业务网络的第一步也是最重要的一步是确定存在的资源。我们在建模语言中有四种资源类型:

  • 资产
  • 参与者
  • 交易
  • 事件

对于我们的 cards-trading-network ,我们将定义资产类型 TradingCard ,参与者类型 Trader ,交易 TradeCard 和事件 TradeNotification

继续,在选择的代码编辑器中打开生成的文件。打开 org.example.biznet.cto ,它是建模文件。删除它中存在的所有代码,因为我们要重写它(名称空间声明除外)。

/**
 * The asset participants will be trading.
 * Each card has certain properties such as name,
 * description, and type which can
 * be used for the frontend application
 */
asset TradingCard identified by cardId {
  o String cardId
  o String cardName
  o String cardDescription
  o GameType cardType default="Baseball" // If no value is provided, it takes the default value
  o Boolean forTrade
}

/**
 * Enumerated types are used to specify a type
 * which can have 1 or N possible values, and nothing else.
 */
enum GameType {
  o Baseball
  o Football
  o Cricket
}

这包含我们的资产 TradingCard 的规范。所有资产和参与者都需要为我们在代码中指定的唯一标识符,在我们的例子中,它是 cardId

此外,我们的资产具有 GameType cardType 属性,该属性基于下面定义的枚举器。枚举用于指定一个类型,该类型最多可以有N个可能的值,但没有别的。在我们的示例中,没有任何 TradingCard 可以拥有除 BaseballFootballCricket 之外的 cardType

现在,要指定我们的 Trader 参与者资源类型,请在建模文件中添加以下代码:

/**
 * The participant model for a Trader
 */
participant Trader identified by traderId {
  o String traderId
  o String traderName
}

这相对简单且易于理解。我们有一个参与者类型 Trader ,他们是由他们的 Trader ID 唯一标识。

现在,我们需要添加对我们的 TradingCard 的引用,以获得指向其所有者的引用,以便我们知道该卡属于谁。为此,请在 TradingCard 资产中添加以下行:

--> Trader owner

所以代码看起来像这样:

asset TradingCard identified by cardId {
  o String cardId
  o String cardName
  o String cardDescription
  o GameType cardType default="Baseball" // If no value is provided, it takes the default value
  o Boolean forTrade
  --> Trader owner
}

这是我们第一次使用 --> 你一定想知道这是什么。这是一个关系指针。 o--> 是我们如何区分资源自身的属性与另一种资源类型的关系。由于所有者是作为网络参与者的 Trader ,我们希望直接引用该 Trader ,这正是 -->

最后,继续在建模文件中添加此代码,该文件指定进行交易和发出事件所需的参数。

/**
 * A transaction which allows Traders to buy other
 * Traders' cards if they're available for trade
 */
transaction TradeCard {
  --> TradingCard card
  --> Trader newOwner
}

/**
 * A notification event to be emitted whenever
 * any card is traded
 */
event TradeNotification {
  --> TradingCard card
}

3. 为我们的交易添加逻辑

要在 TradeCard 函数后面添加逻辑,我们需要一个Javascript逻辑文件。在项目的文件夹中创建一个名为 lib 的新目录,并使用以下代码创建一个名为 logic.js 的新文件:

/**
 * Buy card transaction
 * @param {org.example.biznet.TradeCard} trade
 * @transaction
 */
async function buyCard(trade) {
  if (trade.card.forTrade) {
    // If card is available for trade
    trade.card.owner = trade.newOwner;
    return getAssetRegistry("org.example.biznet.TradingCard")
      .then(assetRegistry => {
        return assetRegistry.update(trade.card); // Update the network registry
      })
      .then(() => {
        let event = getFactory().newEvent(
          "org.example.biznet",
          "TradeNotification"
        ); // Get a reference to the event specified in the modeling language
        event.card = trade.card;
        emit(event); // Fire off the event
      });
  }
}

注意:函数上面的注释中的装饰器非常重要。 如果没有 @param {org.example.biznet.TradingCard} trade ,该函数不知道代码从建模语言引用哪个 Transaction 。此外,确保传递的参数名称(即 trade )是你在函数定义中传递的参数名称。

此代码基本上检查指定的卡是否具有 forTrade==true 并在该情况下更新卡的所有者。然后,它会触发该卡的 TradeNotification 事件。

4. 定义权限和访问规则

permissions.acl 添加新规则,以便参与者可以访问其资源。在生产中,你希望对这些访问规则更加严格。你可以在 这里 阅读更多相关信息。

rule AllParticipantsHaveAccessToAllResources {
  description: "Allow all participants to have access to all resources and make transactions"
  participant: "ANY"
  operation: ALL
  resource: "org.example.biznet.*"
  action: ALLOW
}

5. 生成业务网络存档(BNA)

现在所有编码都已完成,是时候为我们的业务网络创建一个存档文件,以便我们可以在我们的本地Fabric运行时上部署它。为此,请在项目目录中打开Terminal并键入以下内容:

composer archive create --sourceType dir --sourceName

这个命令告诉Hyperledger Composer我们想从一个目录中构建一个BNA,这个目录是我们当前的根文件夹。

如何使用Hyperledger Fabric和Composer构建区块链网络

注意:BNA名称和版本来自 package.json 文件。添加更多代码时,应更改其中的版本号以部署能够升级现有业务网络的唯一存档。

6. 安装和部署BNA文件

我们可以使用 PeerAdmin 用户将网络安装和部署到我们的本地Fabric运行时。要安装业务网络,请键入:

composer network install --archiveFile cards-trading-network@0.0.1.bna --card PeerAdmin@hlfv1

如何使用Hyperledger Fabric和Composer构建区块链网络

要部署业务网络,请键入

composer network start --networkName cards-trading-network --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file cards-trading-admin.card

如何使用Hyperledger Fabric和Composer构建区块链网络

networkNamenetworkVersion 必须与 package.json 指定的相同,否则将无法正常工作。

--file 获取要为THIS网络的名片创建的文件的名称。然后需要输入此卡以通过键入来使用

composer card import --file cards-trading-admin.card

如何使用Hyperledger Fabric和Composer构建区块链网络

惊人。我们现在可以通过输入确认我们的网络正常运行。

composer network ping --card admin@cards-trading-network

--card 这次需要ping我们想要ping的网络的管理卡。

如果一切顺利,你应该看到类似的东西:

如何使用Hyperledger Fabric和Composer构建区块链网络

你的网络版本将是0.0.1或你的package.json指定的任何内容,我实际上忘记了这个截图并在我完成编写教程并进行编辑后上传它。

测试我们的业务网络

现在我们的网络已在Fabric上运行,我们可以启动 Composer Playground 与它进行交互。要执行此操作,请在终端中键入 composer-playground 并在浏览器中打开 http://localhost:8080/ ,你应该会看到与此类似的内容:

如何使用Hyperledger Fabric和Composer构建区块链网络

按立即连接 admin@cards-trading-network ,你将看到此屏幕:

如何使用Hyperledger Fabric和Composer构建区块链网络

Define 定义页面是我们可以对代码进行更改,部署这些更改以升级网络以及导出业务网络存档的地方。

从顶部菜单转到 Test 页面,你会看到:

如何使用Hyperledger Fabric和Composer构建区块链网络

从参与者中选择 Trader ,单击右上角附近的创建新参与者 Create New Participant ,然后创建一个类似于此的新 Trader

如何使用Hyperledger Fabric和Composer构建区块链网络

来吧,让更多的 Trader 。以下是我的三位交易员的名字,名字是哈迪克,约翰和泰隆(Haardik, John, and Tyrone)。

如何使用Hyperledger Fabric和Composer构建区块链网络

现在,让我们制作一些资产。点击左侧菜单中的 TradingCard ,然后按 Create New Asset 创建新资产。请注意 owner 字段在这里特别有趣,看起来像这样:

如何使用Hyperledger Fabric和Composer构建区块链网络

这是一种关系。这就是 --> 的意思。我们指定确切的资源类型,后跟它们的唯一标识符和瞧,我们有一个关系指针。

继续完成一个类似于此的 TradingCard

如何使用Hyperledger Fabric和Composer构建区块链网络

请注意 owner 字段如何指向 Trader#1 aka Haardik 。继续做几张牌,并让一对夫妇将 forTrade 设置为true。

如何使用Hyperledger Fabric和Composer构建区块链网络

请注意我的 Card#2forTrade == true

现在,为了有趣的东西,让我们尝试交易卡:D。

点击左侧的提交交易,并将 card 指向 TradingCard#2newOwner 指向 Trader#3 如下所示:

如何使用Hyperledger Fabric和Composer构建区块链网络

按提交并查看你的 TradingCard ,你会看到 Card#2 现在拥有所有者 Trader#3 :D

生成REST API服务器

Playground 进行交易很不错,但不是最佳的。我们必须为用户提供客户端软件,以便为他们提供无缝体验,他们甚至不必了解底层区块链技术。为此,我们需要一种更好的方式与我们的业务网络进行交互。值得庆幸的是,我们有 composer-rest-server 模块来帮助我们。

在终端中键入 composer-rest-server ,指定 admin@cards-trading-network ,选择 never use namespaces ,然后继续使用其余的默认选项,如下所示:

如何使用Hyperledger Fabric和Composer构建区块链网络

打开 http://localhost:3000/explorer/ ,你将看到自动生成的REST API的文档版本:D

生成使用REST API的Angular应用程序

还记得 yo hyperledger-composer 生成器吗?它不仅可以生成业务网络,还可以创建一个针对我们上面创建的REST API运行的Angular 4应用程序。

要创建Angular Web应用程序,请在终端中键入 yo hyperledger-composer ,选择 Angular ,选择使用 card admin@cards-trading-network 连接到现有的业务 admin@cards-trading-network ,并连接到现有的REST API。(编辑:软件的较新版本可能会要求提供卡片文件而不仅仅是卡片的名称)

如何使用Hyperledger Fabric和Composer构建区块链网络

这将继续运行 npm install ,给它一分钟,一旦完成,你将能够加载 http://localhost:4200/ 并且会遇到类似这样的页面:

编辑:软件的较新版本可能要求你自己运行 npm install 然后运行 npm start

如何使用Hyperledger Fabric和Composer构建区块链网络

你现在可以直接在此应用程序中使用你的网络,该网络通过端口3000上运行的REST服务器与网络进行通信。

恭喜!你只需使用Hyperledger Fabric和Hyperledger Composer设置你的第一个区块链业务网络:D

你可以向卡交易网络添加更多功能,在卡上设置价格并为所有 Trader 提供余额。你还可以有更多交易,允许 Trader 切换 forTrade 的值。你可以将其与非区块链应用程序集成,并允许用户购买添加到其帐户中的新卡,然后他们可以在网络上进一步交易。

KNOWN BUG:你的Angular Web应用程序是否无法正确处理交易?

在撰写本文时,角度生成器存在一个问题,即交易页面 translate 上的紫色调用按钮 Invoke 不执行任何操作。要解决此问题,我们需要对生成的角度应用程序进行一些更改。

如何使用Hyperledger Fabric和Composer构建区块链网络

1.按下按钮时打开模态

我们需要做的第一个改变是按钮打开模态窗口。代码已包含所需的模态窗口,该按钮只缺少 (click)data-target 属性。

要解决此问题,请打开 /cards-trading-angular-app/src/app/ TradeCard/TradeCard.component.html

文件名可能因你的 transaction 名称而异。如果业务网络中有多个 transaction ,则必须在所有事务资源类型HTML文件中执行此更改。

向下滚动直到最后,你会看到一个 <button> 标签。继续将这两个属性添加到该标记:

(click)="resetForm();" data-target="#addTransactionModal"

所以这条线看起来像这样:

<button type=”button” class=”btn btn-primary invokeTransactionBtn” data-toggle=”modal” (click)=”resetForm();” data-target=”#addTransactionModal”>Invoke</button>

(click) 属性调用 resetForm(); 将所有输入字段设置为空, data-target 指定单击时要打开的模式窗口。

如何使用Hyperledger Fabric和Composer构建区块链网络

保存文件,打开浏览器,然后尝试按下调用按钮。它应该打开这个模态:

如何使用Hyperledger Fabric和Composer构建区块链网络

2. 删除不必要的字段

只是让模态打开是不够的。我们可以看到它向我们请求 transactionIdtimestamp ,即使我们没有在我们的建模文件中添加这些字段。我们的网络存储所有交易固有的价值。所以,它应该能够自己找出这些值。事实证明,实际上确实如此。这些是备用字段,我们可以将它们注释掉,REST API将为我们处理剩下的事情。

在同一个文件中,向上滚动以查找输入字段并注释掉负责 addTransactionModal 输入字段的 div

如何使用Hyperledger Fabric和Composer构建区块链网络

保存文件,打开浏览器,然后按“调用”。你应该看到这个:

如何使用Hyperledger Fabric和Composer构建区块链网络

你现在可以通过在这些字段中传递数据来创建交易。由于 cardnewOwner 是与其他资源的关系,我们可以进行如下交易:

如何使用Hyperledger Fabric和Composer构建区块链网络

按确认 ,返回资产页面,你将看到 TradingCard#2 现在属于 Trader#1

如何使用Hyperledger Fabric和Composer构建区块链网络

恭喜!你已在Hyperledger Fabric上成功构建并部署了区块链业务网络。你还为该网络生成了一个REST API服务器,并学习了如何创建与该API交互的Web应用程序。

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用 php 进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、 mongodb 、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解 ,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是 go 语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文 如何使用Hyperledger Fabric和Composer构建区块链网络


以上所述就是小编给大家介绍的《如何使用Hyperledger Fabric和Composer构建区块链网络》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cyberwar

Cyberwar

Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96

The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试