如何使用Hyperledger Fabric和Composer构建区块链网络(上)
Posted 汇智网
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Hyperledger Fabric和Composer构建区块链网络(上)相关的知识,希望对你有一定的参考价值。
如何使用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等托管平台上执行此操作。不过,你应该首先阅读本教程以获得一个想法。
创建和部署我们的业务网络
还记得我们之前安装的包yo
和generator-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
可以拥有除Baseball
,Football
或Cricket
之外的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
networkName
和networkVersion
必须与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指定的任何内容,我实际上忘记了这个截图并在我完成编写教程并进行编辑后上传它。
文章来自官方博客:
http://blog.hubwiz.com。您也可以直接点击左下角的“阅读原文”进行访问。
已经覆盖以下编程技术,发送相应的文字会获取对应教程的信息:
区块链、以太坊、EOS、比特币、Tendermint、Node.js、MongoDB、JavaScript、C、C#、php、Python、Angularjs、Ionic、React、UML、redis、mysql、nginx、CSS、html、Bootstrap、Flask、Gulp、Mocha、Git、Meteor、Canvas、zebra、Typescript、Material Design Lite、ECMAScript、Elasticsearch、Mongoose、jQuery、d3.js、django、cheerio、SVG、phoneGap、jQueryMobile、Saas、YAML、Vue.js、webpack、Firebird、jQuery Easy UI、ruby、asp.net、c++、Express......
以上是关于如何使用Hyperledger Fabric和Composer构建区块链网络(上)的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个Hyperledger Fabric channel
Hyperledger Fabric 2.x 自定义智能合约
Hyperledger Fabric 2.x 自定义智能合约
如何编写一个企业级Hyperledger Fabric开源框架