wbwangk / BlockchainPublicRegulationFabric-Food

一个食品工业的公共监管Fabric例子

Home Page:https://developer.ibm.com/code/patterns/implement-fda-food-supplier-verification-program-on-hyperledger-composer/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

BlockchainPublicRegulationFabric-Food

在这个旅程中,我们通过一个部署在业务网络上的智能合约,获得食品供应商验证计划的合规逻辑。

这个业务网络定义:

参与者: Supplier Importer Retailer Regulator

资产: ProductListingContract

交易: createProductListing transferListing checkProducts updateExemptedList

最初,供应商将把食品移交给进口商,进口商验证供应商、国家和食品类型是否都与正确的标识符匹配。在入境口岸,将供应商与数据库中已知供应商的名单进行核对(由监管机构管理)。如果供应商属于豁免类型,则产品将被转移给零售商。如果供应商属于非豁免类型,则根据数据库中已知食品列表(由监管机构管理)对产品进行检查。如果食品是豁免的产品,然后将其转移给零售商。如果食品是非豁免产品,进口商必须进行危害分析(独立或使用第三方)。供应商向监管机构提供危害分析报告。

当一个createProductListing交易被递交时,createProductListing函数被调用。该逻辑允许供应商创建一个ProductListingContract资产。

当一个transferListing交易由ProductListingContract所有者递交时,transferListing函数被调用。这个递交,要么由供应商(Supplier)移交ProductListingContract给进口商(Importer),要么在完成了产品的豁免检查时由进口商(Importer)移交ProductListingContract给零售商(Retailer)。

当供应商(Supplier)递交一个checkProducts交易时,checkProducts函数被调用来对ProductListingContract中的产品执行豁免检查。如果ProductListingContract合约中所有商品都是免检的,合约状态会变为CHECKCOMPLETED,否则合约状态会变为HAZARDANALYSISCHECKREQHAZARDANALYSISCHECKREQ意味着供应商(Supplier)需要为产品提供危害分析报告。递交报告后,供应商(Supplier)执行checkProducts交易,来完成对产品的豁免检查。

当监管机构(Regulator)递交updateExemptedList交易时,updateExemptedList函数被调用,用来更新免检组织id和免检产品id的清单。

包含的组件

  • Hyperledger Fabric

  • Hyperledger Composer

包括技术

  • Blockchain

  • 容器

  • 云计算

应用工作流程图

应用程序工作流

  • 安装Hyperledger Composer开发工具

  • 配置并启动Hyperledger Fabric网络

  • 生成业务网络档案文件

  • 使用Composer Playground部署业务网络档案

  • (备选方法)在本地运行的Hyperledger Composer上部署业务网络档案

步骤

  1. 生成业务网络档案(BNA)

  2. 用Composer Playground部署业务网络档案

  3. 在本地运行的Hyperledger Composer上部署业务网络档案

1.生成业务网络档案(BNA)

要检查文件的结构是否有效,现在可以为你的业务网络定义生成业务网络档案(BNA)文件。BNA文件是可部署的单元 - 可以部署到Composer运行时进行执行。

使用以下命令生成网络档案:

git clone https://github.com/wbwangk/BlockchainPublicRegulationFabric-Food && cd BlockchainPublicRegulationFabric-Food
npm install

你应该看到以下输出:

Creating Business Network Archive

Looking for package.json of Business Network Definition
	Input directory: /Users/ishan/Documents/git-demo/BlockchainPublicRegulationFabric-Food

Found:
	Description: Sample food supplier verification network
	Name: food-supply
	Identifier: food-supply@0.0.1

Written Business Network Definition Archive file to
	Output file: ./dist/food-supply.bna

Command succeeded

composer archive create命令会在dist文件夹下创建了一个叫food-supply.bna的文件。

你可以利用嵌入式运行时测试业务网络定义,该运行时在Node.js进程的内存中存储“区块链”状态。从你的项目工作目录中运行以下命令(它会打开文件test/foodTest.js并执行):

npm test

你应该看到以下输出:

> food-supply@0.0.1 test /Users/ishan/Documents/git-demo/BlockchainPublicRegulationFabric-Food
> mocha --recursive

  FoodSupply - Test
    #FSVP
      ✓ Create Participants (185ms)
      ✓ Transfer ProductListing to Importer
      ✓ Exempt Check for ProductListing (41ms)
      ✓ Transfer ProductListing to Retailer (56ms)

  4 passing (1s)

这表示测试通过了。

2.使用Composer Playground部署业务网络档案

打开 Composer Playground,默认情况下将导入基本示例网络。如果你之前使用过Playground,请务必通过在浏览器控制台中运行localStorage.clear()清除浏览器本地存储。

现在导入food-supply.bna文件并点击部署按钮。

img

你也可以在本地安装Composer Playground

你将看到以下内容:

img

要测试你的业务网络定义,首先单击测试选项卡:

在参与者Supplier库中,创建一个新的参与者。确保你先点击最左边的Supplier选项卡,然后点击Create New Participant按钮。

img

{
  "$class": "composer.food.supply.Supplier",
  "supplierId": "supplierA",
  "countryId": "UK",
  "orgId": "ACME"
}

同样通过选择最左边相应的选项卡来分别创建另外三个参与者:零售商、监管机构和进口商。

{
  "$class": "composer.food.supply.Retailer",
  "retailerId": "retailerA",
  "products": []
}
{
  "$class": "composer.food.supply.Regulator",
  "regulatorId": "regulatorA",
  "location": "SF",
  "exemptedOrgIds": ["ACME","XYZ CORP"],
  "exemptedProductIds": ["prodA","prodB"]
}
{
  "$class": "composer.food.supply.Importer",
  "importerId": "importerA"
}

现在我们准备添加访问控制。首先点击右上角的admin选项卡,向参与者颁发新的ID并将ID添加到钱包。请按照以下图片中的说明进行操作:

管理员标签

点击 Issue New Id按钮来创建新的ID。 生成新的ID

点击Add to my Wallet链接将新生成的ID添加到Wallet添加到钱包

Ids到钱包

在钱包中选择supplier点击Use now来切换当前用户为供应商。现在点击顶部Test选项卡执行createProductListingtransferListing交易。

选择ID

现在点击Submit Transaction按钮并从下拉列表中选择createProductListing交易,来为产品列表创建一个产品列表。products数组元素包含有关产品编码(productid)和数量(quantity)的信息(用逗号,分隔)。

{
  "$class": "composer.food.supply.createProductListing",
  "products": ["prodA,5","prodB,2"],
  "user": "resource:composer.food.supply.Supplier#supplierA"
}

成功执行交易后,productListing将在ProductListingContract库中创建。上述数据表示供应商A提供了A和B两个产品,数量分别是5和2。

产品清单

同样,递交一个transferListing交易来将产品列表转移到进口商(Importer)。

<ProductListingContractID>替换成从ProductListingContract库中复制的产品列表合约的ID。这个ID是随机生成的。

{
  "$class": "composer.food.supply.transferListing",
  "ownerType": "supplier",
  "newOwner": "resource:composer.food.supply.Importer#importerA",
  "productListing": "resource:composer.food.supply.ProductListingContract#<ProductListingContractID>"
}

importerA将是ProductListingContract的所有者,状态将是EXEMPTCHECKREQ。另外,产品列表将从Supplier视图中移除。现在从Wallet tab中选择importerid ,递交checkProducts交易来对产品执行豁免检查。

{
  "$class": "composer.food.supply.checkProducts",
  "regulator": "resource:composer.food.supply.Regulator#regulatorA",
  "productListing": "resource:composer.food.supply.ProductListingContract#<ProductListingContractID>"
}

成功执行交易将会将产品列表的状态更改为CHECKCOMPLETED。现在执行transferListing交易将产品移交给零售商。

{
  "$class": "composer.food.supply.transferListing",
  "ownerType": "importer",
  "newOwner": "resource:composer.food.supply.Retailer#retailerA",
  "productListing": "resource:composer.food.supply.ProductListingContract#<ProductListingContractID>"
}

交易将改变ProductListingContract的所有者,并更新Retailer库中的产品列表。从Wallet tab中选择RetailerID 并查看更新的库。

产品清单

零售商注册

你也可以使用默认的System user执行所有操作,因为我们在permissions.acl中有一个规则来允许System user执行所有访问。

3.在本地运行的Hyperledger Composer上部署业务网络存档

请按照说明启动本地Fabric 。现在将目录切换到包含food-supply.bna文件的dist文件夹并输入:

cd dist
composer runtime install --card PeerAdmin@hlfv1 --businessNetworkName food-supply
composer network start --card PeerAdmin@hlfv1 --networkAdmin admin --networkAdminEnrollSecret adminpw --archiveFile food-supply.bna --file networkadmin.card
composer card import --file networkadmin.card

你可以通过输入以下内容来验证网络是否已部署:

composer network ping --card admin@food-supply

你应该看到如下输出:

The connection to the network was successfully tested: food-supply
	version: 0.16.0
	participant: org.hyperledger.composer.system.NetworkAdmin#admin

Command succeeded

要创建REST API,需要启动composer-rest-server并告诉它如何连接到我们的已部署业务网络。现在通过改变目录到BlockchainPublicRegulationFabric-Food文件夹来启动服务器,并输入:

cd ..
composer-rest-server

回答在启动时提出的问题。这些允许composer-rest-server连接到Hyperledger Fabric并配置REST API的生成方式。

  • 输入admin@food-supply卡片名称。

  • 在询问是否在生成的API中使用命名空间时选择never use namespaces

  • 当被问及是否需要保护生成的API选择No

  • 当被问及是否启用事件发布时选择Yes

  • 当询问是否启用TLS安全时选择No

测试REST API

如果composer-rest-server启动成功,你应该看到这两行输出:

Web server listening at: http://localhost:3000
Browse your REST API at http://localhost:3000/explorer

打开Web浏览器并导航到http://localhost:3000/explorer

你应该看到LoopBack API浏览器,允许你查看和测试生成的REST API。按照上述在Composer部分的说明测试业务网络定义,。

其他资源

License

Apache 2.0

About

一个食品工业的公共监管Fabric例子

https://developer.ibm.com/code/patterns/implement-fda-food-supplier-verification-program-on-hyperledger-composer/

License:Apache License 2.0


Languages

Language:JavaScript 100.0%