A Participant
是商业网络中的演员。参与者可能是个人的组织。参与者可以创建资产,并与其他参与者交换资产。参与者通过提交交易来处理资产。
参与者拥有一组Identity
可以验证的文件来证明参与者的身份。例如,一个人可能有一个或多个以下身份证明文件证明他们是谁:
在Hyperledger Composer中,参与者与可用于与业务网络进行交互的身份文档集分离。
为了让新参与者加入商业网络,必须在商业网络中创建该参与者的新实例。参与者实例存储有关该参与者的所有必需信息,但它不会使参与者有权与业务网络进行交互。
为了授予参与者与商业网络交互的访问权限,身份文件必须是Issued
该参与者的。然后新参与者可以使用该身份文件与商业网络进行交互。
参与者可能拥有一个现有的身份文件,用于与其他商业网络或其他外部系统进行交互。这些身份证件可以重新使用,并可以重复使用Bound
。然后新的参与者可以使用他们现有的身份文件与商业网络进行交互。
身份证明文件通常会在一段时间后过期。身份证件也可能丢失或被盗。如果身份证件过期,或者需要更换,那么它必须是Revoked
不能再用于与商业网络进行交互的。
但是,撤销身份证件并不会删除关于该参与者及其拥有的任何资产的信息。撤销身份证明文件简单地删除参与者使用该身份证件与商业网络交互的能力。通过向参与者发放新的身份证件,可以恢复对业务网络的访问。
这些参与者和身份管理操作由业务网络中的现有参与者执行,例如监管机构,或同一组织中的参与者,这些参与者已被信任管理该组织中的参与者/身份。
在Hyperledger Composer中,参与者的结构在模型文件中建模。该结构可以包括关于参与者的各种信息,例如参与者姓名,地址,电子邮件地址,出生日期等。然后可以创建该建模参与者的新实例并将其添加到参与者注册表中。
Hyperledger Composer要求使用区块链身份作为身份证件的形式。例如,将业务网络部署到Hyperledger Fabric时,登记证书将用作身份证件的格式。这些注册证书用于加密签名提交到部署的业务网络的交易。
部署的业务网络维护一组身份到参与者的身份映射Identity Registry
。当身份是Issued
或Bound
参与者身份时,新的映射将添加到身份注册表中。当参与者使用该身份将事务提交到部署的业务网络时,Composer运行时会在身份注册表中查找该身份的有效映射。此查询是使用公钥签名或指纹完成的,本质上是证书内容的哈希,对于该证书和身份来说是唯一的。
在身份注册表中找到映射后,将从该映射中检索该身份的参与者。该参与者成为Current Participant
提交交易的参与者。Hyperledger Composer中的所有访问控制均基于当前参与者。访问控制规则,定义哪些参与者可以执行哪些操作,哪些资源在当前参与者上操作。
当参与者第一次使用身份向部署的业务网络提交交易时,该身份是Activated
。这意味着身份注册表中的条目被更新以记录第一次使用该身份的事实。有关身份的其他信息(如证书)也可以在激活期间记录在身份注册表中,如果在身份发布或绑定到参与者时该身份不可用。
如果并且当身份被撤销时,身份注册表中用于该身份的条目被更新以将状态更改为Revoked
。身份被撤销后,如果参与者尝试使用该身份向已部署的业务网络提交事务,则该事务将被拒绝。
在Hyperledger Composer Playground中,有一个包含本地存储的商业网卡的钱包。业务网卡是业务网络的访问卡,包括身份数据,连接配置文件以及用于业务网络访问的正确证书。可以导出身份证以允许将身份分配给他人。
Hyperledger Composer Node.js客户端API,REST API和命令行界面均可用于执行身份管理操作。例如,以下身份管理操作可通过所有Hyperledger Composer界面使用:
有关更多信息,请参阅本文档底部的相关任务和参考资料。
参与者可以使用API或命令行添加到参与者注册表中。
在您执行这些步骤之前,您必须为业务网络定义中的参与者建模并将其部署为业务网络。
下面的过程显示了一个使用以下数字财产样本业务网络定义参与者模型的示例:digitalproperty-network
请注意:如果您使用该composer participant add
命令添加参与者,请确保参与者的JSON表示使用单引号括起来。
namespace net.biz.digitalPropertyNetwork
participant Person identified by personId {
o String personId
o String firstName
o String lastName
}
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();
命令行
composer participant add -c admin@network -d '{"$class":"net.biz.digitalPropertyNetwork.Person","personId":"[email protected]","firstName":"Mae","lastName":"Smith"}'
业务网卡由.card
包含metadata.JSON
文件,连接配置文件和可选证书的文件表示。
业务网卡可用于Hyperledger Composer Playground,以管理不同业务网络和连接配置文件的身份。
可以在钱包屏幕中创建业务网卡,可以使用组件文件创建业务网卡,也可以在业务网络中创建业务网卡。
请注意:如果卡从钱包屏幕创建,或者从组件文件创建,则必须在业务网络中创建相应的身份。
从我的钱包屏幕中,选择一个用于连接到您的商业网络的身份。点击立即连接。请注意:您必须使用具有创建新身份的权限的身份。
可选:要创建要分配给身份的参与者,请单击测试选项卡,然后单击创建新参与者。
点击右上角的身份名称,然后点击ID注册表。
点击发布新ID。
选择一个ID名称,然后选择一个参与者将新的身份与之关联。
点击新建。
点击添加到我的电子钱包。将商业网卡添加到钱包允许您将其用于连接到商业网络,或将其导出供其他人使用。
在我的钱包屏幕现在应该显示新的业务网卡。
可以从我的钱包页面创建商业网卡,但是,必须已经在商业网络中创建了相应的身份。从“ 我的电子钱包”页面创建业务网卡需要使用与在业务网络内创建身份时相同的用户ID,用户密码和正确的业务网络名称凭证。
从我的电子钱包页面创建商业网卡:
收到有效的用户ID和用户密码后,单击我的钱包页面右上角的创建业务网卡按钮。
选择一个连接配置文件,然后单击下一步。
输入创建身份时生成的用户ID和用户密码。
输入正确的业务网络名称,然后点击创建。
企业网卡现在应显示在我的电子钱包页面中。
业务网卡是包含最多三个元素的复合文件:
connection.json
)metadata.json
)credentials
包含证书和私钥的可选目录,这些证书和私钥分别命名certificate
和privateKey
分别存储在文件中。请注意:如果没有credentials
目录,则元数据文件必须包含获取具有属性名称enrollmentSecret的凭据所需的注册密钥。如果指定了enrollmentSecret并且业务网卡用于连接到业务网络,则将创建并填充具有证书的凭证目录(如果业务网卡已导出)。
元数据文件应采用以下格式:
{
"version": 1,
"userName": "alice",
"description": "Alice's identity for basic-sample-network",
"businessNetwork": "basic-sample-network",
"enrollmentSecret": "UserSecret",
"roles": [
]
}
该businessNetworkName,说明,enrollmentSecret和角色属性是可选的。可用的角色是PeerAdmin
和ChannelAdmin
。
要创建业务网卡文件,请运行该composer card create
命令。
现在可以使用Hyperledger Composer Playground导入此业务网卡。
导入和导出业务网卡是向Playground中的其他业务网络用户授予访问权限的最简单方式。有效的业务网卡必须使用上述方法之一创建,但可以导出并发送给其他用户。
要导出业务网卡,请使用业务网络创建身份并将业务网卡添加到您的钱包。
在我的钱包页面上,单击您想要导出的业务网卡上的导出图标。业务网卡应该作为.card
文件下载。
请注意:如果您导出一个从未使用过的企业网卡,例如发送给新的参与者,它将包含获取证书和私钥所需的注册ID和注册机密,然后用于识别参与者。或者,如果您导出之前使用过的业务网卡,它将已经包含证书和私钥。
重要提示:导出的身份证应该小心处理,因为它们包含不受保护的凭证。例如,您绝不应通过电子邮件或其他未加密通信方式发送身份证。
通过导入业务网卡,您可以连接到业务网络,而无需创建连接配置文件,标识和证书。业务网络的成员可以创建业务网卡并将其导出,以便其他人访问业务网络。
在我的钱包屏幕上,点击右上角的导入商户网络卡。
拖放或浏览以选择.card
要导入的业务网络卡()文件。点击导入。
商业网卡现在应该在您的钱包中可见。
使用API,命令行或在Hyperledger Composer Playground中使用身份证可以向参与者发布新身份。一旦发布了新的身份,参与者就可以使用该身份与该参与者的上下文中的业务网络进行交互。
使用Hyperledger Fabric时,Hyperledger Composer使用Hyperledger Fabric认证中心(CA)注册新的注册证书,发布新的身份。Hyperledger Fabric证书颁发机构生成一个可以提供给参与者的注册密钥,然后他可以使用注册机密从Hyperledger Fabric证书颁发机构请求注册证书和私钥。
在执行这些步骤之前,您必须已将参与者添加到参与者注册表中。该发行人新的身份(是否使用命令行或使用下面的JavaScript API)本身必须具有“发行人”的权威和适当的,允许他们出具身份的ACL Hyperledger作曲(与参与者相关的)。
下面的过程显示了一个使用以下数字财产样本业务网络定义参与者模型的示例:digitalproperty-network
namespace net.biz.digitalPropertyNetwork
participant Person identified by personId {
o String personId
o String firstName
o String lastName
}
该示例假定该net.biz.digitalPropertyNetwork#[email protected]
参与者的实例已创建并放入参与者注册表中。
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();
composer identity issue -c admin@network -f maeid1.card -u maeid1 -a "resource:net.biz.digitalPropertyNetwork.Person#[email protected]"
这将为用户maeid1发卡,并在当前目录中导出一个卡片文件。
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();
composer card import -f [email protected]
composer network ping -c maeid1@network
在ping之前,您需要确保将卡导入商业网络。
现有的身份可以通过API或命令行发给参与者。一旦现有身份被绑定,参与者就可以使用该身份与该参与者上下文中的商业网络进行交互。
使用Hyperledger Fabric时,可以绑定使用Hyperledger Fabric认证中心(CA)创建的现有证书,或者使用其他工具(例如,)创建证书cryptogen
。现有证书必须有效用于在Hyperledger Fabric网络上提交事务。
在执行这些步骤之前,您必须已将参与者添加到参与者注册表中。您必须拥有PEM格式的现有证书才能绑定到参与者。现有身份的绑定(无论是使用命令行还是使用下面的JavaScript API)都必须具有ACL,以允许其绑定Hyperledger Composer中的身份(与参与者关联)。
下面的过程显示了一个使用以下数字财产样本业务网络定义参与者模型的示例:digitalproperty-network
namespace net.biz.digitalPropertyNetwork
participant Person identified by personId {
o String personId
o String firstName
o String lastName
}
该示例假定该net.biz.digitalPropertyNetwork#[email protected]
参与者的实例已创建并放入参与者注册表中。
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();
命令行
composer identity bind -c admin@digitalPropertyNetwork -a "resource:net.biz.digitalPropertyNetwork.Person#[email protected]"
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();
命令行
composer network ping -c admin@digitalPropertyNetwork
参与者ID将被打印到控制台,并且应该与composer identity bind
命令中指定的参与者ID匹配。
当向参与者发布新身份或者将现有身份绑定至参与者时,身份与参与者之间的映射将在部署的业务网络中的身份注册中心中创建。当参与者使用该身份将事务提交到部署的业务网络时,Composer运行时会在身份注册表中查找该身份的有效映射。此查询是使用公钥签名或指纹完成的,本质上是证书内容的哈希,对于该证书和身份来说是唯一的。
为了在部署的业务网络中执行身份管理操作,您需要在身份注册表中列出并查看身份标识集。
在您执行这些步骤之前,您应该已将参与者添加到参与者注册中心,并向该参与者发布新身份或绑定现有身份。否则,身份注册表将为空,您将看不到任何结果。
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);
}
}
命令行
composer identity list -c admin@digitalPropertyNetwork
可以使用API或命令行从参与者中撤销身份。一旦身份被撤销,参与者就不能再使用该身份与该参与者的上下文中的业务网络进行交互。
使用Hyperledger Fabric时,Hyperledger Composer当前不会尝试使用Hyperledger Fabric认证中心(CA)API撤销身份。该身份仍可用于向底层区块链网络提交事务,但交易将被部署的业务网络拒绝。
在执行这些步骤之前,您必须已将参与者添加到参与者注册中心,并向该参与者发布或绑定了标识。您还必须在身份注册表中找到该身份的唯一标识符。有关查找身份的唯一标识符的更多信息,请查看列出业务网络中的所有身份。
下面的过程显示了一个使用以下数字财产样本业务网络定义参与者模型的示例:digitalproperty-network
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'。
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();
命令行
composer identity revoke -c admin@digitalPropertyNetwork -u f1c5b9fe136d7f2d31b927e0dcb745499aa039b201f83fe34e243f36e1984862
有几种情况下,具体到Hyperledger面料信息必须包括在Hyperledger作曲家命令,包括composer network install
,composer network start
和composer identity issue
。该--option, -o
选项和--optionsFile, -O
选项允许发送连接器特定信息。
--option, -o
通过重复标签可以指定多个选项,例如:
composer somecmd -o thisOpt=value2 -o thatOpt=value2
或者,您可以创建单个文件以包含多个选项,例如,调用的文件someCmdOpts.txt
可能包含:
thisOpt=value1
thatOpt=value2
要引用选项文件,请使用以下格式:
composer somecmd --optionsFile=someCmdOpts.txt
一些API也将包括传递一个通用选项对象的选项,包括AdminConnection.start()
和AdminConnection.install()
该npmrcFile
选项在composer network install
命令中可用。
该npmrcFile
选项允许您在Hyperledger Fabric为Hyperledger Composer运行时构建链式码图像时指定npm配置信息。
例如,不是使用默认的npm注册表,您可以通过registry
在选项文件中包含选项来指定组织内的内部注册表:
registry=http://mycompanynpmregistry.com:4873
提供完全合格的文件名作为安装命令的一部分,例如,如果该文件在/ home / user1 / config目录中名为npmConfig:
composer network install --c PeerAdmin@hlfv1 --a [email protected] -o npmrcFile=/home/user1/config/npmConfig
文件内容可以是.npmrc
npm配置文件中允许的任何内容。
通过npmrcFile
在installOptions
对象上指定属性,可以在安装方法中提供文件的名称作为AdminConnection API的一部分。例如,要传递在安装时提供的npm配置选项文件的名称:
await AdminConnection.install(businessNetworkDefinition, {npmrcFile: '/tmp/npmrc'});
您可以为网络启动和网络升级请求提供Hyperledger Fabric认可策略。下面的例子显示,start
但方法同样upgrade
如此。
Hyperledger面料认可政策可以通过几种方式使用-o
和-O
选项发送。
-o
选项,背书政策可以作为单行JSON字符串或完全合格的文件路径发送:composer network start ... -o endorsementPolicy='{"identities": [.... }'
composer network start ... -o endorsementPolicyFile=/path/to/file/endorsementPolicy.json
当指定文件路径时,认可策略文件应该遵循以下格式:
{"identities":[...],
"policy": {...}}
使用该-O
选项,认可政策必须作为文件路径发送,如下所示:
composer network start ... -O /path/to/file/options.json
在这种情况下,选项文件应该遵循以下格式:
{"endorsementPolicy": {"Identities": [...].
"policy: {...}"
},
"someOtherOption": "A Value"
}
有关编写Hyperledger Fabric认可策略的更多信息,请参阅提供认可策略示例的Hyperledger Fabric Node.js SDK文档。
要通过管理API发送认可政策,在分别调用启动或部署时,认可政策文件必须作为startOptions
或部分deployOptions
对象包含在内。要传递认可策略文件,它必须在对象属性中指定endorsementPolicyFile
。要将策略作为JSON对象提供,endorsementPolicy
必须指定对象属性。
await adminConnection.start('tutorial-network', '0.0.1', { networkAdmins: networkAdmins, endorsementPolicyFile: 'endorsement-policy.json'} );
发布新身份时,可能需要指定发布的身份是否有权向Hyperledger Fabric认证中心服务器注册新身份。
要授予身份从命令行向证书颁发机构注册新身份的权限,该-x
选项可用(这是快捷键的替代-o issuer=true
)。
composer identity issue -c admin@digitalproperty-network -u MyUser -a net.biz.digitalPropertyNetwork.Person#P1 -x
要指定发行者属性,您将其设置在一个对象中,并将该对象作为issueOptions
on的一部分传递issueIdentity
。例如颁发具有颁发者权限的身份
await businessNetworkConnection.issueIdentity(participantId, newUserId, {issuer: true});
Composer默认使用Winston日志记录模块 - 并使用Config模块查找任何配置信息。如果没有找到,则会使用一组默认值。
如果没有设置配置文件,配置模块会写出警告。例如。WARNING: No configurations found in configuration directory
。如果您对缺省值感到满意并且不希望在应用程序中使用配置,则可以使用环境变量来抑制这种情况。在这里查看更多信息。
如果应用程序出现问题,应该如何处理诊断?
我们来看一下digitalproperty-app
示例,并用它来解释如何从框架中获取诊断信息。
请注意:这是一个框架 - 因此您的应用程序需要拥有自己的日志记录框架。此外,您的应用程序还可以拥有配置信息来控制Hyperledger Composer自己的日志记录。
有两个与日志相关的容器;
在内部,默认情况下,Hyperledger Composer使用Winston node.js日志包,并设置初始级别的日志点和目标。
该框架将记录这些级别的信息。
在Hyperledger作曲的源代码,Entry
和Exit
日志在功能的开始和结束时产生。在调试级别报告这些日志以进行问题诊断。
在应用程序环境中,可以在文本文件或stdout中找到日志。在chaincode容器中,只使用stdout。
为了控制产生的信息的位置和类型,使用了基于JSON的简单对象配置。[Config]模块用于组装这个JSON结构 - 因此最终用户控制可以通过Config支持的环境变量和其他格式完成。
提供了简捷的环境变量,使得使用这个JSON结构变得容易!
通过这种结构,控制可以分解为两部分
记录内容以及显示日志的时间由DEBUG控制字符串控制,与许多其他节点应用程序相同。该DEBUG字符串是一个逗号分隔的组件列表,*
表示一切从组件将被记录,一个-
表示什么都不会被记录。使用时应注意-
指定什么都不会被记录,因为它会影响所有日志记录级别,而不仅仅是默认的日志记录级别。在DEBUG字符串采用以下格式:
DEBUG=,
包含Hyperledger Composer时,使用该字符串composer
。对于更具体的日志记录控制,DEBUG字符串可以按照以下格式接受更多详细信息:
DEBUG=composer[tracelevel]:fqn/class/name
在前面的示例中,[tracelevel]指示要指定的日志级别,并且默认为错误 ; fqn/class/name
取决于它请求的记录器的源代码和名称。
以下是调试控制字符串的示例:
composer:*
一切都在错误级别composer[error]:*
一切都在错误级别composer[info]:*
信息级别的一切composer[info]:BusinessNetworkConnection
仅在信息级别的BusinessNetworkConnection-composer:BusinessNetworkConnection,composer[error]:*
不要跟踪BusinessNetworkConnection类中的任何内容,但要跟踪发生错误的其他地方。文件的写入位置的详细信息如下所示。
默认设置是:
~/.composer/logs
每个控制台或文件都可以被控制。这些通过使用的Config npm模块进行控制。通常这是通过config
在当前工作目录中的目录中使用json文件来控制的。
该结构应使用以下格式:
{
"loadAssets": {
"cardName": "admin@example-network"
},
"composer": {
"log": {
"debug": "composer[debug]:*",
"console": {
"maxLevel": "error"
},
"file": {
"filename" : "./log.txt"
}
}
}
这个例子做了几件事情。
DEBUG=composer[debug]:*
./log.txt
(默认情况下,最大日志级别设置为愚蠢以便获取所有内容)。但是,当[调试]出现时,这个预过滤日志。上述配置文件可以在命令行中指定为单个环境变量。
NODE_CONFIG=' { .... JSON HERE } '
logger
用于引用实际记录的模块。默认意味着这是winston框架config
传递给记录器来控制它的功能。所以这部分是特定于使用中的记录器。调试node.js应用程序的标准方法是使用DEBUG
环境变量。所以
node app.js
将错误记录到〜/ .composer/logs/log_date.txtDEBUG=composer[info]:* node app.js
将信息记录到〜/ .composer/logs/log_date.txtDEBUG=composer[debug]:* COMPOSER_LOGFILE=./log.txt node app.js
将所有内容以调试级别记录到调用的cwd文件中log.txt
COMPOSER_LOG_CONSOLE=error node app.js
将日志文件和错误记录到控制台在运行chaincode的容器中,因此业务网络事务功能与日志记录系统相同。但是,日志控制和日志输出位置不同。
因为这是在容器内运行,所以最好将日志输出到stdout。然后由码头工或容器管理系统捕获。
为了达到这个目的,有一个运行时LoggingService,专门为此提供配置。因此使用相同的框架,但具有特定的配置。这是为了composer-runtime-hlfv1
定义
getDefaultCfg(){
return {
'logger': './winstonInjector.js',
'debug': 'composer[error]:*',
'console': {
'maxLevel': 'silly'
},
'file': {
'maxLevel': 'none'
},
'origin':'default-runtime-hlfv1',
};
}
这将所有日志路由到控制台,而没有路由到文件系统。默认的控制字符串都是错误。
运行时的一个重要部分是当前正在使用的事务标识。这对于能够将来自客户端,运行时和Fabric的所有日志链接在一起非常重要。
为了达到这个目的,有一个回调机制来允许检索只有运行时才知道日志调用已经完成的数据。
这允许日志中的输出包含事务ID。例如88bae779在这一行2018-01-16T12:56:58.987Z [88bae779] [INFO ] @JS : IdentityManager :
同样的基本控制可用,并围绕“调试控制字符串”的提供。虽然在一个容器内需要有其他方法来传递它。例如,可以在docker-compose文件中设置环境变量。
'setLogLevel'和'getLogLevel'事务可用于设置/获取此调试字符串的值。字符串的语法是相同的,
例如,发出命令以获取全新设置中的日志级别:
composer network loglevel --card admin@bsn-local
这可以修改为包含TransactionHandler的所有调试级别日志点,但在其他地方仍然存在错误
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,可以使用启用跟踪
DEBUG=composer[debug]:acls
语法相同,但内部'acls'扩展为专用于ACL的调试字符串。