未命名

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

内容简介:title: 如何使用Hyperledger Fabric和Composer构建区块链网络 date: 2019-01-11 20:00 categories: - Hyperledger Fabric - 超级账本 - fabric tags: - 智能合约 - 以太坊 - 区块链 - Hyperledger Fabric - 超级账本 - fabric keywords: 以太坊 智能合约 区块链 Hyperledger Fabric 超级账本如何使用Hyperledger Fabric和Compose

title: 如何使用Hyperledger Fabric和Composer构建区块链网络 date: 2019-01-11 20:00 categories: - Hyperledger Fabric - 超级账本 - fabric tags: - 智能合约 - 以太坊 - 区块链 - Hyperledger Fabric - 超级账本 - fabric keywords: 以太坊 智能合约 区块链 Hyperledger Fabric 超级账本

如何使用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是一个开源框架,用于制作私有(许可)区块链业务网络,其中成员的身份和角色为其他成员所共知。基于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运行时(也就是你!)上部署,删除和管理业务网络。

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

未命名

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

未命名

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

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

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

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

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

1.生成业务网络

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

未命名

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

未命名

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,这个目录是我们当前的根文件夹。

未命名

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

6. 安装和部署BNA文件

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

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

未命名

要部署业务网络,请键入

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

未命名

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

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

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

未命名

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

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

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

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

未命名

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

测试我们的业务网络

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

未命名

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

未命名

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

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

未命名

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

未命名

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

未命名

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

未命名

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

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

未命名

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

未命名

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

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

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

未命名

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

生成REST API服务器

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

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

未命名

打开 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。(编辑:软件的较新版本可能会要求提供卡片文件而不仅仅是卡片的名称)

未命名

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

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

未命名

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

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

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

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

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

未命名

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 指定单击时要打开的模式窗口。

未命名

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

未命名

2. 删除不必要的字段

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

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

未命名

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

未命名

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

未命名

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

未命名

恭喜!你已在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构建区块链网络


以上所述就是小编给大家介绍的《未命名》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

莱昂氏UNIX源代码分析

莱昂氏UNIX源代码分析

(澳)John Lions / 尤晋元 / 机械工业出版社 / 2000-7-1 / 49.00

本书由上、下两篇组成。上篇为UNIX版本6的源代码,下篇是莱昂先生对UNIX操作系统版本6源代码的详细分析。本书语言简洁、透彻,曾作为未公开出版物广泛流传了二十多年,是一部杰出经典之作。本书适合UNIX操作系统编程人员、大专院校师生学习参考使用。一起来看看 《莱昂氏UNIX源代码分析》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具