Hyperledger Fabric教程:综合指南-第1部分

以下Hyperledger Fabric教程系列由三篇文章组成,将教您有关Hyperledger Fabric链码开发的各个方面,包括CRUD操作,数据保护和链码测试.

第1部分

第2部分

第三部分

经过  米歇尔·穆尔德斯(Michiel Mulders)

该系列的概述:

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.
  • 第一条:基本链代码开发和将私有数据存储在集合中
  • 第2条:高级链码查询和CouchDB GUI
  • 第3条:使用MockStub测试链码的教程

要求

  • 4GB RAM(首选更多)
  • Docker,Docker-Compose,代码编辑器(例如Visual Studio Code),Git
  • NodeJS 8.9+版本(首选8.9.4 –使用“ñ’)
  • 基本的JavaScript知识

目标

  • 创建基本的链码功能,例如读取数据并将其附加到分类帐.
  • 通过Docker exec commando验证创建的功能.
  • 配置私人数据收集.
  • 将数据添加到私有数据集合并从分类帐中检索聚合对象.

简介:Hyperledger Fabric教程

在第一篇文章中,我们将习惯于NodeJS链代码的Hyperledger Fabric样板,我们将在本教程系列中使用该样板。该样板是由一家比利时的区块链咨询公司开发的 TheLedger.be, 非常感谢您开源此样板.

为什么我们使用这种样板?它使您的生活更轻松!例如,样板将自动包装响应并序列化为 shim.success()shim.error(). 您可以只返回javascript对象,其余的将完成.

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

在本教程中,我们将专注于开发带有和不带有私有数据集合的基本CRUD操作,我们将在以后进行测试。除此之外,我们还会为您简要介绍私人收藏的运作方式.

获取代码

该代码可以在找到 Github Michielmulders / hyperledger-fabric-blockgeeks. 建议使用

git克隆 https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git

在您的计算机上创建存储库的本地克隆,并使用以下内容检查本教程的第一部分 git checkout tutorial-1

样板设置

好的,因此Hyperledger Fabric不会突如其来…首先,我们需要提取Fabric创建所需容器所需的必需Docker映像(证书颁发机构,订购者,对等方,会员服务).

scripts文件夹包含一个名为 bootstrap.sh 默认情况下,它将提取Hyperledger Fabric 1.2.0版,该版本支持私有集合功能,我们将在以后使用。由于映像的总大小大于1GB,因此请确保磁盘上有足够的可用空间并具有正确的Internet连接。像这样执行脚本 ./scripts/bootstrap.sh

下载完所有必需的图像后,我们可以通过确保开始没有错误来进一步测试样板。让我们用以下命令执行startFabric.sh脚本 ./scripts/startFabric.sh

成功完成-运行的Hyperledger Fabric网络-应返回状态200.

Hyperledger Fabric教程:如何使用Mockstub测试您的NodeJS链代码-第1部分

小费:如果您无法执行Bash(.sh)脚本,请尝试通过以下方式授予其可执行权限:

chmod + x bootstrap.sh

关于私人收藏

Hyperledger Fabric已开发了SideDB的概念,其中包含私有数据,仅对拥有SideDB的节点可见。基本上,这是尚未在专用网络之间公开共享的信息。最近,Hyperledger将其重命名为私人收藏,他们将其视为内置的“符合GDPR要求”的解决方案.

以前,通过使用渠道在Hyperledger网络中创建机密性。最常见的例子是关于某种鱼类每公斤价格的谈判。 Fisher A希望为餐厅A提供特别的价格,因为他们是好朋友,但是Fisher A不希望Restaurant B看到与Restaurant A的这种便宜交易。为了创建安全的通信,Fisher A创建了两个渠道到餐厅A,再从Fisher A到餐厅B.

但是,在金融科技中,创建渠道的过程可能会变得相当复杂,因为我们谈到了成千上万的客户,每个客户都有多个渠道。这就是为什么Hyperledger Fabric不鼓励过度使用通道的原因,因为这会大大降低网络速度,从而影响性能.

TheLedger的Jonas Snellinckx解释了如何在Hyperledger网络内部更好地管理私人数据,

私有数据使您可以使用策略创建数据集合,以定义通道中的哪些方可以访问数据。可以通过将策略添加到集合中来简单地管理此访问。这使得某些数据可以公开,而某些数据对于某些方可以是私有的。”

Hyperledger Fabric教程:如何使用Mockstub测试您的NodeJS链代码-第1部分

图片1:来自Slidedeck“启用隐私权的分类帐” https://jira.hyperledger.org/browse/FAB-1151

在本教程中,我们定义了将存储在Fabric网络中的汽车。有关所有者的数据是私有的,因此将被添加到私有集合中。让我们编码!

超级账本结构链码

让我们来看看当前的链码 chaincode /节点/src/MyChaincode.ts. 该文件包含一个功能, initLedger 用于预填充某些汽车的分类帐。汽车对象由品牌,型号,颜色和所有者组成。将汽车对象添加到分类账时,我们为它们提供唯一的键和文档类型,以便于检索它们.

对于(让i = 0;我 < cars.length; i ++){

           const car:any = cars [i];

           car.docType =’汽车’;

           //car.key =`CAR $ {i}`;

           等待stubHelper.putState(’CAR’+ i,car);

           this.logger.info(’添加 <–> ‘, 车);

       }

1.创建新车

让我们编写一个在Hyperledger世界状态下创建新汽车对象的函数的代码。该函数接受一个字符串数组,但是,只有数组中的第一个元素包含一个字符串化的JSON对象。我们使用一个辅助函数来轻松检查参数 是的. 除了检查参数外,它还可以将参数从字符串解析为所需的数据格式。 Yup将根据我们定义的提供的模式解析字符串化的JSON对象 Yup.object()。shape({my-object}.

异步createCar(stubHelper:StubHelper,args:string []){

       const verifyArgs =等待Helpers.checkArgs<任何>(args [0],Yup.object()

           .形状({

               键:Yup.string()。required(),

               make:Yup.string()。required(),

               型号:Yup.string()。required(),

               颜色:Yup.string()。required(),

               所有者:Yup.string()。required(),

           }));

    …

}

接下来,我们可以使用该格式化的对象(已验证Args 常量)以构建新的汽车对象。别忘了添加 文档类型. 现在可以准备将​​对象附加到分类帐。让我们使用 stubHelper 其中包含用于与分类帐状态进行交互的所有功能,例如检索,添加,更新和删除数据.

异步createCar(stubHelper:StubHelper,args:string []){

       const verifyArgs =等待Helpers.checkArgs<任何>(args [0],Yup.object()

           .形状({

               键:Yup.string()。required(),

               make:Yup.string()。required(),

               型号:Yup.string()。required(),

               颜色:Yup.string()。required(),

               所有者:Yup.string()。required(),

           }));

       让汽车= {

           docType:“汽车”,

           制作:经过验证的Args.make,

           模型:verifyArgs.model,

           颜色:经过验证的Args.color,

           拥有者:经过验证的Args.owner,

           密钥:已验证Args.key,

       };

       等待stubHelper.putState(verifiedArgs.key,car);

   }

putState 函数接受要存储在分类帐中的密钥和对象。我们在这里使用的putState函数是包装函数,因为分类帐只能存储字节数组,而不能存储JSON对象。的 stubHelper 对我们有帮助,原始的实现可以在以下位置找到 ChaincodeStubInterface.PutState.

1.1验证汽车的添加

我们将使用Docker在对等方的容器中执行命令,因为对等方拥有最新版本的链码。要向对等方提供此更新的版本,请使用以下命令重新启动Hyperledger Fabric网络: ./scripts/startFabric.sh. 为什么要使用此脚本?它执行速度更快,因为它将仅替换对等节点上的链码,而不会重新启动整个网络.

打开终端并执行以下命令: docker exec cli对等链代码调用-C mychannel -n fabcar -c'{“ function”:“ createCar”,“ Args”:[“ {\” key \“:\” CAR100 \“,\” make \“:\ “ Peugot \”,\“ model \”:\“ 307 \”,\“ color \”:\“ green \”,\“ owner \”:\“ John Doe \”}”]}}’

此命令将向对等方发送新的交易建议,以将其包括在分类帐的世界状态中。我们称我们的“createCar”功能,然后在字符串数组中添加一个键为“ CAR100”的字符串化JSON对象作为第一个参数。为了将其传递给我们的链码,我们必须转义JSON对象的双引号.

请注意 调用 关键词。重要的是要知道 调用询问. 当我们尝试更改或向分类帐添加数据时,将使用invoke关键字,而query关键字仅在从分类帐中检索信息时使用.

成功执行Docker命令应返回“结果:状态:200”.

Hyperledger Fabric教程:如何使用Mockstub测试您的NodeJS链代码-第1部分

2.从分类帐读取数据

为了从分类账中读取数据,我们可以寻找一个特定的密钥。让我们寻找新创建的带有“ CAR100”键的Car对象。我们从验证链码中收到的参数开始,这一次我们只接受一个密钥.

接下来,我们使用 getStateAsObject 函数从分类账中检索指定键的JSON对象。密钥可能不存在。在这种情况下,我们可以使用 NotFoundError 这是 fabric-chaincode-utils, 我们导入文件的顶部,例如 stubHelper.

异步queryCar(stubHelper:StubHelper,args:string []):承诺<任何> {

       

       const verifyArgs =等待Helpers.checkArgs<{键:字符串}>(args [0],Yup.object()

           .形状({

               键:Yup.string()。required(),

           }));

       const car =等待stubHelper.getStateAsObject(verifiedArgs.key);

       如果(!car){

           抛出新的NotFoundError(’Car不存在’);

       }

       回车

   }

2.1验证查询汽车功能

使用以下Docker命令通过键“ CAR100”查询Car,请注意此命令中使用query关键字.

docker exec cli对等链代码查询-C mychannel -n fabcar -c'{“ function”:“ queryCar”,“ Args”:[“ {\” key \“:\” CAR100 \“}”]}}}’

Hyperledger Fabric教程:如何使用Mockstub测试您的NodeJS链代码-第1部分

3个私人收藏

首先,我们首先需要一个collections配置文件 collections_config.json 其中包括馆藏名称和政策。该策略类似于背书,这使我们可以使用现有的策略逻辑,例如OR,AND,…运算符.

3.1私人收藏夹配置

私有集合由名称和策略组成,其他属性不在本教程讨论范围内,并且已针对Hyperledger网络进行了优化。我们将一个名为“ privateCarCollection”的集合与一项策略结合使用,该策略中组织中只有一个成员必须验证交易.

[

 {

   "姓名": "privateCarCollection",

   "政策": "或(“ Org1MSP.member”,“ Org2MSP.member”)",

   "requiredPeerCount":0,

   "maxPeerCount":3,

   "blockToLive":1000000

 }

]

3.2将数据添加到私人收藏夹

现在我们有了我们的私人收藏,让我们在代码中使用它。告诉 stubHelper 将数据保存到私有集合中,而不是将其分散到整个网络中.

等待stubHelper.putState(

           已验证Args.key,

           车,

           {privateCollection:’privateCarCollection’}

       );

让我们稍微修改一下代码,以便将车主及其地址存储在私人汽车收藏中。请记住,向此新的私家车对象添加相同的密钥,以使其更容易检索完整的对象。除此之外,我们将更改Yup对象验证器以仅接受键,地址和所有者属性。最佳做法是,将文档类型更改为 ‘私人汽车’.

异步createPrivateCar(stubHelper:StubHelper,args:string []){

const verifyArgs =等待Helpers.checkArgs(args [0],Yup.object()

.形状({

键:Yup.string()。required(),

地址:Yup.string()。required(),

拥有者:Yup.string()。required(),

}));

让汽车= {

docType:“ privateCar”,

地址:authenticatedArgs.address,

拥有者:经过验证的Args.owner,

密钥:已验证Args.key,

};

等待stubHelper.putState(

已验证Args.key,

车,

{privateCollection:’privateCarCollection’}

);

}

3.3查询聚合车

要创建聚合的汽车对象,我们将同时查询Hyperledger网络和包含我们的汽车所有者和地址的私人数据集合.

首先,让我们使用以下方法检索公共车:

让publicCar =等待stubHelper.getStateAsObject(verifiedArgs.key);

接下来,我们可以用相同的方式查询私家车数据:

让privateCar =等待stubHelper.getStateAsObject(verifiedArgs.key,{privateCollection:‘privateCarCollection’})

最后,让我们返回聚合的汽车对象。我们正在使用对象散布(三个点“…”),这是一种ECMAscript 2018方法,该方法将每个对象的所有属性合并到一个新对象中.

异步queryAggregatedCar(stubHelper:StubHelper,args:string []):承诺<任何> {

       

       const verifyArgs =等待Helpers.checkArgs<{键:字符串}>(args [0],Yup.object()

           .形状({

               键:Yup.string()。required(),

           }));

       让publicCar =等待stubHelper.getStateAsObject(verifiedArgs.key);

       如果(!publicCar){

           抛出新的NotFoundError(’Car不存在’);

       }

       让privateCar =等待stubHelper.getStateAsObject(

           已验证Args.key,

           {privateCollection:’privateCarCollection’}

       );

       const car = {

           …大众汽车,

           …私人汽车

       };

       回车

   }

3.4验证汇总查询

在本教程的项目符号1.1中,我们创建了一辆新车,其钥匙为“汽车100’。让我们使用此密钥通过Docker exec命令创建一个新的私有数据对象.

docker exec cli对等链代码调用-C mychannel -n fabcar -c'{“ function”:“ createPrivateCar”,“ Args”:[“ {\” key \“:\” CAR100 \“,\” address \“:\ “ Parklane 20,Italy \”,“ owner \”:\“ John Doe \”}”]}’

现在,我们既将公众作为私人汽车对象,让我们尝试像这样的汇总调用。请记住使用 询问 关键字,因为我们只在检索数据.

docker exec cli对等链代码查询-C mychannel -n fabcar -c‘{“ function”:“ queryAggregatedCar”,“ Args”:[“ {\” key \”:\“ CAR100 \”}“]}}}”

这应该返回:

{“颜色”:“绿色”,“ docType”:“ privateCar”,“键”:“ CAR100”,“ make”:“ Peugot”,“ model”:“ 307”,“ owner”:“ John Doe”, “地址”:“意大利帕克兰20号”}

4.我们学到了什么?

stubHelper 是与分类账中的数据进行交互的最重要工具。它能够添加,更新和删除数据。但是,还可以帮助在分类账中查找和查询对象并将其作为JSON对象返回.

代码备忘单

Hyperledger Fabric教程:如何使用Mockstub测试您的NodeJS链代码-第1部分

是否想更深入地研究超级账本?查看我们的Hyperledger Accelerator 

也请继续第二部分: 

进一步阅读

  • 这里 您可以找到完整的界面实现 ChaincodeStubInterface 当使用这种新语言创建Hyperledger时,将使用Golang编码.
  • 完整的API 规格 StubHelper.
  • Hyperledger Fabric相关资源的收集 Github.

经过 米歇尔·穆尔德斯(Michiel Mulders)

@michiel_mulders

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me