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

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

第1部分

第2部分

第三部分

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

该系列的概述:

  • 第1条:基本链代码开发和将私有数据存储在集合中
  • 第2条:高级链码查询和CouchDB GUI
  • 第3条:使用MockStub测试链码的教程

要求

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

目标

  • 了解有关CouchDB及其查询语言的信息
  • 学习芒果查询语言.
  • 创建高级链码查询,通过CouchDB GUI进行测试,并在链码中实现它们.

介绍

在第一篇文章中,我们学习了使用TheLedger提供的开源样板创建基本的链码函数,这些函数能够对分类账执行CRUD操作。.

在第二篇教程中,我们将重点介绍创建高级链码查询(也称为富查询),这使我们能够创建更复杂的查询,而不仅仅是寻找特定的键.

开始使用 

确保您拥有可在上找到的代码的副本 Github Michielmulders / hyperledger-fabric-blockgeeks. 建议使用 git克隆 https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git 在您的计算机上创建存储库的本地克隆,并使用签出本教程的第二部分 git checkout tutorial-2

接下来,使用 ./scripts/startFabric.sh , 如果您是本教程的新手,请务必查看第一篇文章中的“样板设置”部分,以启动并运行.

Hyperledger Fabric网络启动后, 打开此链接(http:// localhost:5984 / _utils /#/ _ all_dbs 在浏览器中应显示CouchDB GUI.

关于CouchDB

实际上,Hyperledger Fabric支持同时将LevelDB和CouchDB用作状态数据库,并保存每个对象的最新状态。 LevelDB是每个对等方中嵌入的默认键值状态数据库。 CouchDB是可选的替代外部状态数据库。与LevelDB键值存储一样,CouchDB可以存储以链码建模的任何二进制数据。但是,CouchDB是一个更好的选择,因为它支持JSON文档存储,该存储支持针对链码数据的丰富查询,而LevelDB仅支持针对键的查询.

根据Hyperledger Fabric文档,

CouchDB作为对等体与单独的数据库进程一起运行,因此在设置,管理,操作尤其是安全性方面还有其他注意事项.”

因此,LevelDB提供的功能较少,但是,其配置正确,而CouchDB需要一些额外的配置,例如提供数据库管理员用户和密码或提供CouchDB地址,以使对等方知道在何处查找其当前状态。.

我们使用的样板包含一个包含CouchDB的配置。让我们创建第一个丰富查询.

CouchDB GUI

打开GUI后,您可以在以下位置找到 http:// localhost:5984 / _utils /#/ _ all_dbs, 您应该看到以下界面.

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

让我们打开 mychannel_fabcar (渠道名称与链码名称结合)数据库并探索其中的汽车对象.

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

接下来,打开“使用芒果运行查询”链接以执行我们的第一个查询。让我们从一个简单的查询开始,查找所有Car对象。我们可以通过查找docType“汽车”来完成此操作.

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

芒果查询运算符

1.字段运算符

“字段”运算符允许您仅返回特定字段。让我们从上一个示例中进行查询,只返回每个汽车对象的颜色.

{

  "选择器":{

     "docType": "汽车"

  },

  "领域":[

     "颜色"

  ]

}

2.在运算符中

$ in运算符使您可以搜索字段中的特定值。它使您可以传递要匹配的可能值的数组。让我们接受上一个查询,只返回紫色和紫色汽车.

{

  "选择器":{

     "docType": "汽车",

     "颜色":{

        "$ in":[

           "紫色",

           "紫色的"

        ]

     }

  },

  "领域":[

     "颜色"

  ]

}

该查询将返回三个汽车对象,其中一个颜色为“紫色”,而两个颜色为“紫色”.

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

3.限制和跳过运算符

好的,例如,我们要跳过第一个结果并将结果限制为两辆车,因此我们只有上一个示例的两辆紫罗兰色车。使用限制运算符可以限制返回对象的数量,而跳过运算符可以移动选择器光标.

<div style ="背景:#ffffff;溢出:自动;宽度:自动;边框:纯灰色;边框宽度:.1em .1em .1em .8em;填充:.2em .6em;"><前样式="边距:0;线高:125%">{

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">  跨度><跨度样式="背景颜色:#fff0f0">&quot选择器&跨度>:{

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">     跨度><跨度样式="背景颜色:#fff0f0">&quot; docType&跨度>: <跨度样式="背景颜色:#fff0f0">&quot;汽车&跨度>,

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">     跨度><跨度样式="背景颜色:#fff0f0">&quot;颜色&跨度>:{

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">        跨度><跨度样式="背景颜色:#fff0f0">&quot; $ in&跨度>:[

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">           跨度><跨度样式="背景颜色:#fff0f0">&紫&跨度>,

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">           跨度><跨度样式="背景颜色:#fff0f0">&quot;紫色&跨度>

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">        跨度>]

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">     跨度>}

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">  跨度>},

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">  跨度><跨度样式="背景颜色:#fff0f0">&quot领域&跨度>:[

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">     跨度><跨度样式="背景颜色:#fff0f0">&quot;颜色&跨度>

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">  跨度>],

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">  跨度><跨度样式="背景颜色:#fff0f0">&极限&跨度>: <跨度样式="颜色:#0000DD;字体粗细:粗体">2跨度>,

<跨度样式="颜色:#FF0000;背景颜色:#FFAAAA">  跨度><跨度样式="背景颜色:#fff0f0">&跳过&跨度>: <跨度样式="颜色:#0000DD;字体粗细:粗体">1跨度>

}

预先>div>

4.正则表达式运算符

顾名思义,可以将正则表达式作为Mango查询传递。小提示,不建议传递复杂的正则表达式(如嵌套表达式),因为它们需要太多的计算能力.

在此示例中,我们只想匹配包含至少一个字母的汽车模型。由于模型为“ 205”,因此应从结果中消除CAR5。让我们来看看.

{

  "选择器":{

     "模型":{

        "$ regex": "[A-Z]+"

     }

  }

}

5.查询子文档

甚至可以查询子文档。想象一个经过修改的汽车对象,其中所有者字段包含一个由用户属性组成的对象.

{

  “模型”,

  “ docType”,

  …,

“所有者”: {

      “姓名”,

      “年龄”,

      “地址”

  }

}

Mango对于子文档非常灵活,如下所示–查询查找18岁以下的用户.

{

   "选择器":{

       "所有者年龄":18

   }

}

6.其他运营商

确实存在许多其他运算符:

  • “ $ gt”:字段必须大于值X.
  • “ $ lt”:字段必须小于值X.
  • “ $ eq”:字段必须等于值X.
  • “ $ or”:值必须在搜索值数组中.
  • “ $ not”:字段可能不匹配值X.

可以找到查询运算符的完整实现 这里.

Chaincode丰富查询

现在,我们已经学会编写更高级的查询,让我们在链码中使用这一新知识来检索数据。我们将使用 getQueryResultAsList 来自stubHelper的函数,该函数接受选择器并返回所需的数据.

同样,让我们​​使用一个丰富的查询来查询数据库中的所有汽车对象。 getQueryResultAsList函数接受包含查询的对象.

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

       返回等待stubHelper.getQueryResultAsList({

           选择器:{

               docType:“汽车”

           }

       });

}

让我们使用重新启动网络 ./scripts/startFabric.sh 并执行运行 queryAllCars 在我们的链码中起作用.

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

Docker将向我们返回一个充满汽车对象的数组。如您所见,以chaincode创建丰富的查询并不困难.

我们学到了什么?

芒果查询语言提供了许多查询运算符,我们可以使用它们来创建更复杂的查询以在我们的区块链网络中查找数据。甚至可以使用正则表达式来过滤数据,但是由于性能原因,只能将其用于基本正则表达式查询。除此之外,将这些丰富的查询实现为链码并不难,因为StubHelper会完成所有艰苦的工作.

代码备忘单

  1. 芒果查询从选择器开始,该选择器针对一个或多个我们称为一个或多个运算符的字段.

选择器:{

     场地: {

         “ $ operator”: …

     }

}

  1. stubHelper.getQueryResultAsList 函数将查询发送到我们的Hyperledger Fabric网络并返回结果数组.

进一步阅读

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

@michiel_mulders

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