小编给大家分享一下Hyperledger composer如何实现查询,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
本地查询语言可以过滤使用条件返回的结果,并且可以在事务中调用该结果以执行操作,例如更新或移除结果集上的资产。
查询.qry
在业务网络定义的父目录中的查询文件()中定义。查询包含WHERE子句,该子句定义选择资产或参与者的标准。
1.1 模型文件必须更新以包含事件和新事务,打开model的(.cto
)文件tutorial-network
,在它的基础上添加
event TradeNotification { --> Commodity commodity } transaction RemoveHighQuantityCommodities { } event RemoveNotification { --> Commodity commodity }
1.2 打开交易处理器功能文件lib/logic.js,
用下面的JavaScript替换事务逻辑
/** * Track the trade of a commodity from one trader to another * @param {org.example.mynetwork.Trade} trade - the trade to be processed * @transaction */ async function tradeCommodity(trade) { // set the new owner of the commodity trade.commodity.owner = trade.newOwner; let assetRegistry = await getAssetRegistry('org.example.mynetwork.Commodity'); // emit a notification that a trade has occurred let tradeNotification = getFactory().newEvent('org.example.mynetwork', 'TradeNotification'); tradeNotification.commodity = trade.commodity; emit(tradeNotification); // persist the state of the commodity await assetRegistry.update(trade.commodity); } /** * Remove all high volume commodities * @param {org.example.mynetwork.RemoveHighQuantityCommodities} remove - the remove to be processed * @transaction */ async function removeHighQuantityCommodities(remove) { let assetRegistry = await getAssetRegistry('org.example.mynetwork.Commodity'); let results = await query('selectCommoditiesWithHighQuantity'); for (let n = 0; n < results.length; n++) { let trade = results[n]; // emit a notification that a trade was removed let removeNotification = getFactory().newEvent('org.example.mynetwork','RemoveNotification'); removeNotification.commodity = trade; emit(removeNotification); await assetRegistry.remove(trade); } }
第一个功能tradeCommodity
将更改商品(拥有新的所有者参与者)上的所有者财产,以传入交易事务并发出通知事件。然后,它将修改的商品保留回用于存储商品实例的资产注册表中。
第二个函数调用命名查询'selectCommoditiesWithHighQuantity'(定义于queries.qry
),它将返回数量大于60的所有商品资产记录; 发出一个事件; 并从AssetRegistry中移除商品。
2.1 在tutorial-network
目录中,创建一个名为的新文件queries.qry
2.2 将以下代码复制并粘贴到queries.qry
/** Sample queries for Commodity Trading business network */ query selectCommodities { description: "Select all commodities" statement: SELECT org.example.mynetwork.Commodity } query selectCommoditiesByExchange { description: "Select all commodities based on their main exchange" statement: SELECT org.example.mynetwork.Commodity WHERE (mainExchange==_$exchange) } query selectCommoditiesByOwner { description: "Select all commodities based on their owner" statement: SELECT org.example.mynetwork.Commodity WHERE (owner == _$owner) } query selectCommoditiesWithHighQuantity { description: "Select commodities based on quantity" statement: SELECT org.example.mynetwork.Commodity WHERE (quantity > 60) }
在更改业务网络中的文件后,必须将业务网络重新打包为业务网络存档(.bna
)并重新部署到Hyperledger Fabric实例。升级部署的网络需要部署的新版本具有新的版本号
3.1 在tutorial-network
目录中,打开package.json
文件
3.2 将版本属性更新0.0.1
为0.0.2
3.3 使用命令行,导航到该tutorial-network
目录,执行以下命令
composer archive create --sourceType dir --sourceName . -a tutorial-network@0.0.2.bna
我们需要部署修改后的网络,以成为区块链上的最新版本!我们正在使用新创建的归档业务网络归档文件来更新现有的已部署业务网络; 这是我们在开发者教程中使用的相同的商业网络名称。
4.1 切换到终端,将目录切换到包含该文件夹的文件夹tutorial-network@0.0.2.bna
4.2 运行以下命令安装更新的业务网络
composer network install --card PeerAdmin@hlfv1 --archiveFile tutorial-network@0.0.2.bna
4.3 运行以下命令将网络升级到新版本
composer network upgrade -c PeerAdmin@hlfv1 -n tutorial-network -V 0.0.2
4.4 在继续使用以下命令之前,检查当前版本的业务网络:
composer network ping -c admin@tutorial-network | grep Business
现在我们将整合最新更新的业务网络和添加的查询,并公开此业务网络的REST API。
5.1 使用以下命令启动REST服务器:
composer-rest-server
5.2 输入admin@tutorial-network
卡名称
5.3 询问是否在生成的API中使用名称空间时,请选择不使用名称空间。
5.4 当询问是否保护生成的API时选择否。
5.5 当询问是否启用事件发布时,选择是
5.6 当被问及是否启用TLS安全时,请选择否。
6.1 打开Web浏览器并导航到http://localhost:3000/explorer。您应该看到LoopBack API Explorer,允许您检查和测试生成的REST API。
6.2 首先,在REST Explorer中点击'Trader',然后点击/ Trader上的'POST'方法,然后向下滚动到Parameter部分 - 依次创建以下Trader实例,内容是:
{ "$class": "org.example.mynetwork.Trader", "tradeId": "TRADER1", "firstName": "Jenny", "lastName": "Jones" }
6.3 点击“试用”来创建参与者。'响应代码'(向下滚动)应该是200(SUCCESS),由于成功界面太长,所以需要三个截图
6.4 按照上面的操作,重复执行两次,代码不同,通过复制以下JSON创建第二个交易者
{ "$class": "org.example.mynetwork.Trader", "tradeId": "TRADER2", "firstName": "Jack", "lastName": "Sock" }
6.5 第三个交易者
{ "$class": "org.example.mynetwork.Trader", "tradeId": "TRADER3", "firstName": "Rainer", "lastName": "Valens" }
6.6 现在滚动到顶部,然后在REST Explorer中单击“商品”对象
6.7 点击POST操作并向下滚动到参数部分:以与上述相同的方式,为所有者TRADER1和TRADER2创建两个商品资产记录
{ "$class": "org.example.mynetwork.Commodity", "tradingSymbol": "EMA", "description": "Corn", "mainExchange": "EURONEXT", "quantity": 10, "owner": "resource:org.example.mynetwork.Trader#TRADER1" }
{ "$class": "org.example.mynetwork.Commodity", "tradingSymbol": "CC", "description": "Cocoa", "mainExchange": "ICE", "quantity": 80, "owner": "resource:org.example.mynetwork.Trader#TRADER2" }
现在我们拥有资产和参与者,我们可以尝试一些查询,我们可以首先尝试的最简单的REST查询是我们的命名查询selectCommodities
。展开“查询”REST端点,您将看到我们在模型中定义的命名查询。这些查询现在作为REST查询公开,并为其生成一个/ GET操作。请注意,查询的描述(我们在模型定义中定义的)显示在右侧。
7.1 执行简单的REST查询
然后try it out 出现结果正是刚刚添加的那两个如图,
7.2 执行筛选的REST查询
展开查询端点'selectCommoditiesByExchange'并滚动到'参数'部分。
在'Exchange'参数中输入'EURONEXT',点击“试用”。
结果为:
7.3 使用来自命名查询的结果执行事务更新
最后,您会记得我们已经定义了一个简单的查询,用于在我们的查询文件中筛选数量大于60的商品。在事务功能中使用时,查询功能非常强大,因为使用查询可以允许事务逻辑设置一组资产或参与者来执行更新或创建删除操作。
我们selectCommoditiesWithHighQuantity
在removeHighQuantityCommodities
交易中使用查询。如果您在REST资源管理器中执行此/ GET操作,您会看到它仅选择数量大于60的资产。
点击
筛选结果:
看完了这篇文章,相信你对“Hyperledger composer如何实现查询”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。