区块链 Hyperledger Composer 管理部署现有网络(五)

1. 参与者和身份

概念

A Participant是商业网络中的演员。参与者可能是个人的组织。参与者可以创建资产,并与其他参与者交换资产。参与者通过提交交易来处理资产。

参与者拥有一组Identity可以验证文件来证明参与者的身份。例如,一个人可能有一个或多个以下身份证明文件证明他们是谁:

  • 护照
  • 驾驶执照
  • 指纹
  • 视网膜扫描
  • SSL证书

在Hyperledger Composer中,参与者与可用于与业务网络进行交互的身份文档集分离。

为了让新参与者加入商业网络,必须在商业网络中创建该参与者的新实例。参与者实例存储有关该参与者的所有必需信息,但它不会使参与者有权与业务网络进行交互。

为了授予参与者与商业网络交互的访问权限,身份文件必须是Issued该参与者的。然后新参与者可以使用该身份文件与商业网络进行交互。

参与者可能拥有一个现有的身份文件,用于与其他商业网络或其他外部系统进行交互。这些身份证件可以重新使用,并可以重复使用Bound然后新的参与者可以使用他们现有的身份文件与商业网络进行交互。

身份证明文件通常会在一段时间后过期。身份证件也可能丢失或被盗。如果身份证件过期,或者需要更换,那么它必须是Revoked不能再用于与商业网络进行交互的。

但是,撤销身份证件并不会删除关于该参与者及其拥有的任何资产的信息。撤销身份证明文件简单地删除参与者使用该身份证件与商业网络交互的能力。通过向参与者发放新的身份证件,可以恢复对业务网络的访问。

这些参与者和身份管理操作由业务网络中的现有参与者执行,例如监管机构,或同一组织中的参与者,这些参与者已被信任管理该组织中的参与者/身份。

Hyperledger Composer中的参与者和身份

在Hyperledger Composer中,参与者的结构在模型文件中建模。该结构可以包括关于参与者的各种信息,例如参与者姓名,地址,电子邮件地址,出生日期等。然后可以创建该建模参与者的新实例并将其添加到参与者注册表中。

Hyperledger Composer要求使用区块链身份作为身份证件的形式。例如,将业务网络部署到Hyperledger Fabric时,登记证书将用作身份证件的格式。这些注册证书用于加密签名提交到部署的业务网络的交易。

部署的业务网络维护一组身份到参与者的身份映射Identity Registry当身份是IssuedBound参与者身份时,新的映射将添加到身份注册表中。当参与者使用该身份将事务提交到部署的业务网络时,Composer运行时会在身份注册表中查找该身份的有效映射。此查询是使用公钥签名或指纹完成的,本质上是证书内容的哈希,对于该证书和身份来说是唯一的。

在身份注册表中找到映射后,将从该映射中检索该身份的参与者。该参与者成为Current Participant提交交易的参与者。Hyperledger Composer中的所有访问控制均基于当前参与者。访问控制规则,定义哪些参与者可以执行哪些操作,哪些资源在当前参与者上操作。

当参与者第一次使用身份向部署的业务网络提交交易时,该身份是Activated这意味着身份注册表中的条目被更新以记录第一次使用该身份的事实。有关身份的其他信息(如证书)也可以在激活期间记录在身份注册表中,如果在身份发布或绑定到参与者时该身份不可用。

如果并且当身份被撤销时,身份注册表中用于该身份的条目被更新以将状态更改为Revoked身份被撤销后,如果参与者尝试使用该身份向已部署的业务网络提交事务,则该事务将被拒绝。

Hyperledger Composer Playground中的身份和业务网卡

在Hyperledger Composer Playground中,有一个包含本地存储的商业网卡的钱包。业务网卡是业务网络的访问卡,包括身份数据,连接配置文件以及用于业务网络访问的正确证书。可以导出身份证以允许将身份分配给他人。

在Hyperledger Composer中执行身份管理任务

Hyperledger Composer Node.js客户端API,REST API和命令行界面均可用于执行身份管理操作。例如,以下身份管理操作可通过所有Hyperledger Composer界面使用:

  • 将新参与者添加到参与者注册表中
  • 向参与者发放新的身份
  • 将现有身份绑定到参与者
  • 撤销参与者的身份
  • 列出部署的业务网络中的所有身份

有关更多信息,请参阅本文档底部的相关任务和参考资料。

2.添加参与者

参与者可以使用API​​或命令行添加到参与者注册表中。

在你开始之前

在您执行这些步骤之前,您必须为业务网络定义中的参与者建模并将其部署为业务网络。

下面的过程显示了一个使用以下数字财产样本业务网络定义参与者模型的示例:digitalproperty-network

请注意:如果您使用该composer participant add命令添加参与者,请确保参与者的JSON表示使用单引号括起来。

Copy 复制
namespace net.biz.digitalPropertyNetwork

participant Person identified by personId {
  o String personId
  o String firstName
  o String lastName
}

程序

  1. 将参与者添加到参与者注册表
    • JavaScript API
Copy 复制
    const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;

    async function addParticipant() {
        let businessNetworkConnection = new BusinessNetworkConnection();

        try {
            await businessNetworkConnection.connect('admin@digitalPropertyNetwork');
            let participantRegistry = await businessNetworkConnection.getParticipantRegistry('net.biz.digitalPropertyNetwork');
            let factory = businessNetworkConnection.getFactory();
            let participant = factory.newResource('net.biz.digitalPropertyNetwork', 'Person', '[email protected]');
            participant.firstName = 'Mae';
            participant.lastName = 'Smith';
            await participantRegistry.add(participant);
            await businessNetworkConnection.disconnect();
        } catch(error) {
            console.error(error);
            process.exit(1);
        }
    }

    addParticipant();
  • 命令行

    Copy 复制
    composer participant add -c admin@network -d '{"$class":"net.biz.digitalPropertyNetwork.Person","personId":"[email protected]","firstName":"Mae","lastName":"Smith"}'
    

3. 创建,导出和导入业务网卡

业务网卡由.card包含metadata.JSON文件,连接配置文件和可选证书文件表示

业务网卡可用于Hyperledger Composer Playground,以管理不同业务网络和连接配置文件的身份。

创建商业网卡

可以在钱包屏幕中创建业务网卡,可以使用组件文件创建业务网卡,也可以在业务网络中创建业务网卡。

请注意:如果卡从钱包屏幕创建,或者从组件文件创建,则必须在业务网络中创建相应的身份。

在业务网络内创建业务网卡

  1. 我的钱包屏幕中,选择一个用于连接到您的商业网络的身份。点击立即连接请注意:您必须使用具有创建新身份的权限的身份。

  2. 可选:要创建要分配给身份的参与者,请单击测试选项卡,然后单击创建新参与者

  3. 点击右上角的身份名称,然后点击ID注册表

  4. 点击发布新ID

  5. 选择一个ID名称,然后选择一个参与者将新的身份与之关联。

  6. 点击新建

  7. 点击添加到我的电子钱包将商业网卡添加到钱包允许您将其用于连接到商业网络,或将其导出供其他人使用。

我的钱包屏幕现在应该显示新的业务网卡。

使用电子钱包创建企业网卡

可以从我的钱包页面创建商业网卡,但是,必须已经在商业网络中创建了相应的身份。从“ 我的电子钱包”页面创建业务网卡需要使用与在业务网络内创建身份时相同的用户ID用户密码和正确的业务网络名称凭证。

我的电子钱包页面创建商业网卡

  1. 收到有效的用户ID用户密码后,单击我的钱包页面右上角的创建业务网卡按钮

  2. 选择一个连接配置文件,然后单击下一步

  3. 输入创建身份时生成用户ID用户密码

  4. 输入正确的业务网络名称,然后点击创建

企业网卡现在应显示在我的电子钱包页面中。

从组件文件创建业务网卡

业务网卡是包含最多三个元素的复合文件:

  • 连接配置文件。connection.json
  • 一个元数据文件,包含用于连接到业务网络的身份数据。metadata.json
  • credentials包含证书和私钥的可选目录,这些证书和私钥分别命名certificateprivateKey分别存储在文件中

请注意:如果没有credentials目录,则元数据文件必须包含获取具有属性名称enrollmentSecret的凭据所需注册密钥如果指定enrollmentSecret并且业务网卡用于连接到业务网络,则将创建并填充具有证书的凭证目录(如果业务网卡已导出)。

元数据文件应采用以下格式:

Copy 复制
{
    "version": 1,
    "userName": "alice",
    "description": "Alice's identity for basic-sample-network",
    "businessNetwork": "basic-sample-network",
    "enrollmentSecret": "UserSecret",
    "roles": [
    ]
}

businessNetworkName说明enrollmentSecret角色属性是可选的。可用的角色PeerAdminChannelAdmin

要创建业务网卡文件,请运行该composer card create命令。

现在可以使用Hyperledger Composer Playground导入此业务网卡。

导入和导出业务网卡

导入和导出业务网卡是向Playground中的其他业务网络用户授予访问权限的最简单方式。有效的业务网卡必须使用上述方法之一创建,但可以导出并发送给其他用户。

导出商业网卡

  1. 要导出业务网卡,请使用业务网络创建身份并将业务网卡添加到您的钱包。

  2. 我的钱包页面上,单击您想要导出的业务网卡上的导出图标。业务网卡应该作为.card文件下载

请注意:如果您导出一个从未使用过的企业网卡,例如发送给新的参与者,它将包含获取证书和私钥所需的注册ID和注册机密,然后用于识别参与者。或者,如果您导出之前使用过的业务网卡,它将已经包含证书和私钥。

重要提示:导出的身份证应该小心处理,因为它们包含不受保护的凭证。例如,您绝不应通过电子邮件或其他未加密通信方式发送身份证。

导入商业网卡

通过导入业务网卡,您可以连接到业务网络,而无需创建连接配置文件,标识和证书。业务网络的成员可以创建业务网卡并将其导出,以便其他人访问业务网络。

  1. 我的钱包屏幕上,点击右上角的导入商户网络卡

  2. 拖放或浏览以选择.card要导入的业务网络卡()文件。点击导入

商业网卡现在应该在您的钱包中可见。

 

4. 向参与者发放新的身份

使用API​​,命令行或在Hyperledger Composer Playground中使用身份证可以向参与者发布新身份。一旦发布了新的身份,参与者就可以使用该身份与该参与者的上下文中的业务网络进行交互。

使用Hyperledger Fabric时,Hyperledger Composer使用Hyperledger Fabric认证中心(CA)注册新的注册证书,发布新的身份。Hyperledger Fabric证书颁发机构生成一个可以提供给参与者的注册密钥,然后他可以使用注册机密从Hyperledger Fabric证书颁发机构请求注册证书和私钥。

在你开始之前

在执行这些步骤之前,您必须已将参与者添加到参与者注册表中。发行人新的身份(是否使用命令行或使用下面的JavaScript API)本身必须具有“发行人”的权威和适当的,允许他们出具身份的ACL Hyperledger作曲(与参与者相关的)。

下面的过程显示了一个使用以下数字财产样本业务网络定义参与者模型的示例:digitalproperty-network

Copy 复制
namespace net.biz.digitalPropertyNetwork

participant Person identified by personId {
  o String personId
  o String firstName
  o String lastName
}

该示例假定该net.biz.digitalPropertyNetwork#[email protected]参与者的实例已创建并放入参与者注册表中。

程序

  1. 连接到商业网络并向参与者颁发新的身份
    • JavaScript API
Copy 复制
  const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;

  async function identityIssue() {
      let businessNetworkConnection = new BusinessNetworkConnection();
      try {
          await businessNetworkConnection.connect('admin@digitalPropertyNetwork');
          let result = await businessNetworkConnection.issueIdentity('net.biz.digitalPropertyNetwork.Person#[email protected]', 'maeid1')
          console.log(`userID = ${result.userID}`);
          console.log(`userSecret = ${result.userSecret}`);
          await businessNetworkConnection.disconnect();
      } catch(error) {
          console.log(error);
          process.exit(1);
      }
  }

  identityIssue();
  • 命令行
Copy 复制
  composer identity issue -c admin@network -f maeid1.card -u maeid1 -a "resource:net.biz.digitalPropertyNetwork.Person#[email protected]"

这将为用户maeid1发卡,并在当前目录中导出一个卡片文件。

  1. 作为参与者,测试与商业网络的连接
    • JavaScript API
Copy 复制
  const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;

  async function testConnection() {
      let businessNetworkConnection = new BusinessNetworkConnection();
      try {
          await businessNetworkConnection.connect('admin@digitalPropertyNetwork');
          let result = await businessNetworkConnection.ping();
          console.log(`participant = ${result.participant ? result.participant : ''}`);
          await businessNetworkConnection.disconnect();
      } catch((error) {
          console.error(error);
          process.exit(1);
      }
  }

  testConnection();
  • 命令行
Copy 复制
  composer card import -f [email protected]
  composer network ping -c maeid1@network

在ping之前,您需要确保将卡导入商业网络。


5. 将现有身份绑定到参与者

现有的身份可以通过API或命令行发给参与者。一旦现有身份被绑定,参与者就可以使用该身份与该参与者上下文中的商业网络进行交互。

使用Hyperledger Fabric时,可以绑定使用Hyperledger Fabric认证中心(CA)创建的现有证书,或者使用其他工具(例如,)创建证书cryptogen现有证书必须有效用于在Hyperledger Fabric网络上提交事务。

在你开始之前

在执行这些步骤之前,您必须已将参与者添加到参与者注册表中。您必须拥有PEM格式的现有证书才能绑定到参与者。现有身份绑定(无论是使用命令行还是使用下面的JavaScript API)都必须具有ACL,以允许其绑定Hyperledger Composer中的身份(与参与者关联)。

下面的过程显示了一个使用以下数字财产样本业务网络定义参与者模型的示例:digitalproperty-network

Copy 复制
namespace net.biz.digitalPropertyNetwork

participant Person identified by personId {
  o String personId
  o String firstName
  o String lastName
}

该示例假定该net.biz.digitalPropertyNetwork#[email protected]参与者的实例已创建并放入参与者注册表中。

程序

  1. 连接到业务网络并将现有身份绑定到参与者
    • JavaScript API
Copy 复制
  const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;

  async function bind() {
      let businessNetworkConnection = new BusinessNetworkConnection();
      let certificate = `-----BEGIN CERTIFICATE-----
            MIIB8DCCAZegAwIBAgIURanHh55fqrUecvHNHtcMKiHJRkwwCgYIKoZIzj0EAwIw
            czELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh
            biBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT
            E2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNzI3MTc0MzAwWhcNMTgwNzI3MTc0
            MzAwWjAQMQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
            BAANIGFIrXXr5+h0NfUNJhx5YFQ4w6r182eZYRhc9KvYQhYo5D0ZbecfR9sGX2b6
            0aW+C7bUaXc6DU3pJSD4fNijbDBqMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E
            AjAAMB0GA1UdDgQWBBRwuAyWrGlzVQFqRf0OqoTNuoq7QDArBgNVHSMEJDAigCAZ
            q2WruwSAfa0S5MCpqqZknnCGjjq9AhejItieR+GmrjAKBggqhkjOPQQDAgNHADBE
            AiBcj/JvxmKHel4zQ3EmjITEFhdYku5ijIZEDuR5v9HK3gIgTUbVEfq3MuasVZKx
            rkM5DH3e5ECM7T+T1Ovr+1AK6bs=
            -----END CERTIFICATE-----`
       try { 
           await businessNetworkConnection.connect('admin@digitalPropertyNetwork');
           await businessNetworkConnection.bindIdentity('net.biz.digitalPropertyNetwork.Person#[email protected]', certificate);
           await businessNetworkConnection.disconnect();
       } catch(error) {
           console.error(error);
           process.exit(1);
       }
  }

  bind();
  • 命令行

    Copy 复制
    composer identity bind -c admin@digitalPropertyNetwork -a "resource:net.biz.digitalPropertyNetwork.Person#[email protected]"
    
  1. 作为参与者,测试与商业网络的连接
    • JavaScript API
Copy 复制
  const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;

  async function testConnection() {
      let businessNetworkConnection = new BusinessNetworkConnection();

      try {
          await businessNetworkConnection.connect('admin@digitalPropertyNetwork');
          let result = await businessNetworkConnection.ping();
          console.log(`participant = ${result.participant ? result.participant : ''}`);
          await businessNetworkConnection.disconnect();
      } catch(error) {
          console.error(error);
          process.exit(1);
      }
  }

  testConnection();
  • 命令行

    Copy 复制
    composer network ping -c admin@digitalPropertyNetwork
    

参与者ID将被打印到控制台,并且应该与composer identity bind命令中指定的参与者ID匹配


6. 列出业务网络中的所有身份

当向参与者发布新身份或者将现有身份绑定至参与者时,身份与参与者之间的映射将在部署的业务网络中的身份注册中心中创建。当参与者使用该身份将事务提交到部署的业务网络时,Composer运行时会在身份注册表中查找该身份的有效映射。此查询是使用公钥签名或指纹完成的,本质上是证书内容的哈希,对于该证书和身份来说是唯一的。

为了在部署的业务网络中执行身份管理操作,您需要在身份注册表中列出并查看身份标识集。

在你开始之前

在您执行这些步骤之前,您应该已将参与者添加到参与者注册中心,并向该参与者发布新身份或绑定现有身份。否则,身份注册表将为空,您将看不到任何结果。

程序

  1. 连接到业务网络并在身份注册表中列出身份
    • JavaScript API
Copy 复制
  const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;

  async function identityList() {
      let businessNetworkConnection = new BusinessNetworkConnection();
      try {
          await businessNetworkConnection.connect('admin@digitalPropertyNetwork');
          let identityRegistry = await businessNetworkConnection.getIdentityRegistry();
          let identities = await identityRegistry.getAll();
          identities.forEach((identity) => {
            console.log(`identityId = ${identity.identityId}, name = ${identity.name}, state = ${identity.state}`);
          });
          await businessNetworkConnection.disconnect();
      } catch(error) {
          console.log(error);
          process.exit(1);
      }
  }
  • 命令行

    Copy 复制
    composer identity list -c admin@digitalPropertyNetwork
    

7. 撤销参与者的身份

可以使用API​​或命令行从参与者中撤销身份。一旦身份被撤销,参与者就不能再使用该身份与该参与者的上下文中的业务网络进行交互。

使用Hyperledger Fabric时,Hyperledger Composer当前不会尝试使用Hyperledger Fabric认证中心(CA)API撤销身份。该身份仍可用于向底层区块链网络提交事务,但交易将被部署的业务网络拒绝。

在你开始之前

在执行这些步骤之前,您必须已将参与者添加到参与者注册中心,并向该参与者发布或绑定了标识。您还必须在身份注册表中找到该身份的唯一标识符。有关查找身份的唯一标识符的更多信息,请查看列出业务网络中的所有身份

下面的过程显示了一个使用以下数字财产样本业务网络定义参与者模型的示例:digitalproperty-network

Copy 复制
namespace net.biz.digitalPropertyNetwork

participant Person identified by personId {
  o String personId
  o String firstName
  o String lastName
}

该示例假定该net.biz.digitalPropertyNetwork#[email protected]参与者的实例已创建并放入参与者注册表中。

该示例还假定maeid1已向该参与者发布身份,并且该身份的唯一标识符是'f1c5b9fe136d7f2d31b927e0dcb745499aa039b201f83fe34e243f36e1984862'。

程序

  1. 连接到商业网络并撤销参与者的现有身份
    • JavaScript API
Copy 复制
    const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection;

    async function revoke() {
        let businessNetworkConnection = new BusinessNetworkConnection();

        try {
            await businessNetworkConnection.connect('admin@digitalPropertyNetwork');
            await businessNetworkConnection.revokeIdentity('f1c5b9fe136d7f2d31b927e0dcb745499aa039b201f83fe34e243f36e1984862')
            await businessNetworkConnection.disconnect();
        } catch(error) {
            console.log(error);
            process.exit(1);
        } 
    }
    revoke();
  • 命令行

    Copy 复制
    composer identity revoke -c admin@digitalPropertyNetwork -u f1c5b9fe136d7f2d31b927e0dcb745499aa039b201f83fe34e243f36e1984862
    

8. Hyperledger Fabric

有几种情况下,具体到Hyperledger面料信息必须包括在Hyperledger作曲家命令,包括composer network installcomposer network startcomposer identity issue--option, -o选项和--optionsFile, -O选项允许发送连接器特定信息。

--option, -o通过重复标签可以指定多个选项,例如:

Copy 复制
composer somecmd -o thisOpt=value2 -o thatOpt=value2

或者,您可以创建单个文件以包含多个选项,例如,调用的文件someCmdOpts.txt可能包含:

Copy 复制
thisOpt=value1
thatOpt=value2

要引用选项文件,请使用以下格式:

Copy 复制
composer somecmd --optionsFile=someCmdOpts.txt

一些API也将包括传递一个通用选项对象的选项,包括AdminConnection.start()AdminConnection.install()

提供npm配置设置进行安装

CLI

npmrcFile选项在composer network install命令中可用

npmrcFile选项允许您在Hyperledger Fabric为Hyperledger Composer运行时构建链式码图像时指定npm配置信息。

例如,不是使用默认的npm注册表,您可以通过registry在选项文件中包含选项来指定组织内的内部注册表

Copy 复制
registry=http://mycompanynpmregistry.com:4873

提供完全合格的文件名作为安装命令的一部分,例如,如果该文件在/ home / user1 / config目录中名为npmConfig:

Copy 复制
composer network install --c PeerAdmin@hlfv1 --a [email protected] -o npmrcFile=/home/user1/config/npmConfig

文件内容可以是.npmrcnpm配置文件中允许的任何内容

管理API

通过npmrcFileinstallOptions对象指定属性,可以在安装方法中提供文件的名称作为AdminConnection API的一部分例如,要传递在安装时提供的npm配置选项文件的名称:

Copy 复制
await AdminConnection.install(businessNetworkDefinition, {npmrcFile: '/tmp/npmrc'});

Hyperledger面料认可政策

您可以为网络启动和网络升级请求提供Hyperledger Fabric认可策略。下面的例子显示,start但方法同样upgrade如此。

作曲家网络启动/升级CLI

Hyperledger面料认可政策可以通过几种方式使用-o-O选项发送

  • 使用该-o选项,背书政策可以作为单行JSON字符串或完全合格的文件路径发送:
Copy 复制
composer network start ... -o endorsementPolicy='{"identities": [.... }'
Copy 复制
composer network start ... -o endorsementPolicyFile=/path/to/file/endorsementPolicy.json

当指定文件路径时,认可策略文件应该遵循以下格式:

Copy 复制
    {"identities":[...],
        "policy": {...}}
  • 使用该-O选项,认可政策必须作为文件路径发送,如下所示:

    Copy 复制
    composer network start ... -O /path/to/file/options.json
    

    在这种情况下,选项文件应该遵循以下格式:

    Copy 复制
            {"endorsementPolicy": {"Identities": [...].
                "policy: {...}"
              },
              "someOtherOption": "A Value"
            }
    

有关编写Hyperledger Fabric认可策略的更多信息,请参阅提供认可策略示例Hyperledger Fabric Node.js SDK文档

管理API

要通过管理API发送认可政策,在分别调用启动或部署时,认可政策文件必须作为startOptions部分deployOptions对象包含在内要传递认可策略文件,它必须在对象属性中指定endorsementPolicyFile要将策略作为JSON对象提供,endorsementPolicy必须指定对象属性。

Copy 复制
await adminConnection.start('tutorial-network', '0.0.1', { networkAdmins: networkAdmins,  endorsementPolicyFile: 'endorsement-policy.json'} );

身份问题

发布新身份时,可能需要指定发布的身份是否有权向Hyperledger Fabric认证中心服务器注册新身份。

CLI

要授予身份从命令行向证书颁发机构注册新身份的权限,该-x选项可用(这是快捷键的替代-o issuer=true)。

Copy 复制
composer identity issue -c admin@digitalproperty-network -u MyUser -a net.biz.digitalPropertyNetwork.Person#P1 -x

API

要指定发行者属性,您将其设置在一个对象中,并将该对象作为issueOptionson的一部分传递issueIdentity例如颁发具有颁发者权限的身份

Copy 复制
await businessNetworkConnection.issueIdentity(participantId, newUserId, {issuer: true});


9. 诊断问题

Composer默认使用Winston日志记录模块 - 并使用Config模块查找任何配置信息。如果没有找到,则会使用一组默认值。

如果没有设置配置文件,配置模块会写出警告。例如。WARNING: No configurations found in configuration directory如果您对缺省值感到满意并且不希望在应用程序中使用配置,则可以使用环境变量来抑制这种情况。在这里查看更多信息

诊断问题

如果应用程序出现问题,应该如何处理诊断?

我们来看一下digitalproperty-app示例,并用它来解释如何从框架中获取诊断信息。

请注意:这是一个框架 - 因此您的应用程序需要拥有自己的日志记录框架。此外,您的应用程序还可以拥有配置信息来控制Hyperledger Composer自己的日志记录。

有两个与日志相关的容器;

  • 应用程序正在运行的那个,以及
  • 执行交易功能的链式代码容器。

应用

在内部,默认情况下,Hyperledger Composer使用Winston node.js日志包,并设置初始级别的日志点和目标。

默认配置

该框架将记录这些级别的信息。

  • 错误
  • 警告
  • 信息
  • 详细
  • 调试

在Hyperledger作曲的源代码,EntryExit日志在功能的开始和结束时产生。调试级别报告这些日志以进行问题诊断。

在应用程序环境中,可以在文本文件或stdout中找到日志。在chaincode容器中,只使用stdout。

控制产生的东西

为了控制产生的信息的位置和类型,使用了基于JSON的简单对象配置。[Config]模块用于组装这个JSON结构 - 因此最终用户控制可以通过Config支持的环境变量和其他格式完成。

提供了简捷的环境变量,使得使用这个JSON结构变得容易!

通过这种结构,控制可以分解为两部分

  • 什么级别的日志消息生成在
  • 发送这些消息的位置

生产什么?

记录内容以及显示日志的时间由DEBUG控制字符串控制,与许多其他节点应用程序相同。DEBUG字符串是一个逗号分隔的组件列表,*表示一切从组件将被记录,一个-表示什么都不会被记录。使用时应注意-指定什么都不会被记录,因为它会影响所有日志记录级别,而不仅仅是默认的日志记录级别。DEBUG字符串采用以下格式:

Copy 复制
DEBUG=,

包含Hyperledger Composer时,使用该字符串composer对于更具体的日志记录控制,DEBUG字符串可以按照以下格式接受更多详细信息:

Copy 复制
DEBUG=composer[tracelevel]:fqn/class/name

在前面的示例中,[tracelevel]指示要指定的日志级别,并且默认为错误 ; fqn/class/name取决于它请求的记录器的源代码和名称。

以下是调试控制字符串的示例

  • composer:*一切都在错误级别
  • composer[error]:*一切都在错误级别
  • composer[info]:*信息级别的一切
  • composer[info]:BusinessNetworkConnection信息级别的BusinessNetworkConnection
  • -composer:BusinessNetworkConnection,composer[error]:* 不要跟踪BusinessNetworkConnection类中的任何内容,但要跟踪发生错误的其他地方。

日志输出位置

文件的写入位置的详细信息如下所示。

默认设置是:

  • 控制台没有日志输出(在日志设置期间遇到的异常和错误)
  • 文件,1Mb有限大小的一组三个文件被写入
    • 这是位置 ~/.composer/logs
    • 每个日历日都会写入一组单独的文件。

每个控制台或文件都可以被控制。这些通过使用的Config npm模块进行控制通常这是通过config在当前工作目录中的目录中使用json文件来控制的

该结构应使用以下格式:

Copy 复制
{
  "loadAssets": {
    "cardName": "admin@example-network"
  },
  "composer": {
    "log": {
      "debug": "composer[debug]:*",
      "console": {
        "maxLevel": "error"
      },
      "file": {
        "filename" : "./log.txt"
      }
    }
}

这个例子做了几件事情。

  • 调试控制字符串为所有事情启用调试跟踪。等同于DEBUG=composer[debug]:*
  • 它能够以最大程度的错误记录到控制台(所以只是错误)
  • 日志文件应该在一个无限制的文件中调用./log.txt(默认情况下,最大日志级别设置为愚蠢以便获取所有内容)。但是,当[调试]出现时,这个预过滤日志。

快捷键

上述配置文件可以在命令行中指定为单个环境变量。

Copy 复制
NODE_CONFIG=' { .... JSON HERE  } '
  • logger用于引用实际记录的模块。默认意味着这是winston框架
  • config传递给记录器来控制它的功能。所以这部分是特定于使用中的记录器。

启用更多信息

调试node.js应用程序的标准方法是使用DEBUG环境变量。所以

例子

  • node app.js错误记录到〜/ .composer/logs/log_date.txt
  • DEBUG=composer[info]:* node app.js信息记录到〜/ .composer/logs/log_date.txt
  • DEBUG=composer[debug]:* COMPOSER_LOGFILE=./log.txt node app.js将所有内容以调试级别记录到调用的cwd文件中log.txt
  • COMPOSER_LOG_CONSOLE=error node app.js 将日志文件和错误记录到控制台

Chaincode容器

在运行chaincode的容器中,因此业务网络事务功能与日志记录系统相同。但是,日志控制和日志输出位置不同。

输出位置

因为这是在容器内运行,所以最好将日志输出到stdout。然后由码头工或容器管理系统捕获。

为了达到这个目的,有一个运行时LoggingService,专门为此提供配置。因此使用相同的框架,但具有特定的配置。这是为了composer-runtime-hlfv1定义

Copy 复制
    getDefaultCfg(){
        return {
            'logger': './winstonInjector.js',
            'debug': 'composer[error]:*',
            'console': {
                'maxLevel': 'silly'

            },
            'file': {
                'maxLevel': 'none'
            },
            'origin':'default-runtime-hlfv1',
        };
    }

这将所有日志路由到控制台,而没有路由到文件系统。默认的控制字符串都是错误。

交易ID

运行时的一个重要部分是当前正在使用的事务标识。这对于能够将来自客户端,运行时和Fabric的所有日志链接在一起非常重要。

为了达到这个目的,有一个回调机制来允许检索只有运行时才知道日志调用已经完成的数据。

这允许日志中的输出包含事务ID。例如88bae779在这一行2018-01-16T12:56:58.987Z [88bae779] [INFO ] @JS : IdentityManager :() Binding in the tx names and impl

控制

同样的基本控制可用,并围绕“调试控制字符串”的提供。虽然在一个容器内需要有其他方法来传递它。例如,可以在docker-compose文件中设置环境变量。

'setLogLevel'和'getLogLevel'事务可用于设置/获取此调试字符串的值。字符串的语法是相同的,

例如,发出命令以获取全新设置中的日志级别:

Copy 复制
composer network loglevel --card admin@bsn-local                                                                                                              

这可以修改为包含TransactionHandler的所有调试级别日志点,但在其他地方仍然存在错误

Copy 复制
composer network loglevel --card admin@bsn-local -l "composer[debug]:TransactionHandler,composer[error]:*"  
The logging level was successfully changed to: composer[debug]:TransactionHandler,composer[error]:*

Command succeeded

组件简档

除了广泛的日志记录以外,使用调试字符串需要了解要跟踪的文件/类。如果你想从ACL中进行日志记录,那么这就是'概要文件'的概念。例如,对于ACL,可以使用启用跟踪

Copy 复制
DEBUG=composer[debug]:acls

语法相同,但内部'acls'扩展为专用于ACL的调试字符串。






你可能感兴趣的:(区块链)