区块链网络配置让我们来看看 configureNetwork 方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| function configureNetwork() {
return new Promise(function(resolve, reject){
try{
logHelper.logEntryAndInput(logger, 'configureNetwork');
var pem;
fs.readFile(constants['BLOCKCHAIN_NW_CERT_PATH'], function(err, data){
if(validate.isValid(err)){
logHelper.logError(logger,'configureNetwork', 'Could not read cert: '+constants['BLOCKCHAIN_NW_CERT_PATH']);
return reject({statusCode: constants.INTERNAL_SERVER_ERROR, body: 'Could not read cert: '+constants['BLOCKCHAIN_NW_CERT_PATH'] });
}
else{
pem = data;
chain.setMemberServicesUrl(caURL, { pem: pem });
for (var i in peerURLs) {
chain.addPeer(peerURLs, { pem: pem });
}
recursiveLogin({username: constants['BLOCKCHAIN_REGISTRAR_ID'], password: registrarPassword, chain: chain })
.then(function(resp){
logHelper.logMessage(logger,'configureNetwork', 'Successfully enrolled registrar: '+constants['BLOCKCHAIN_REGISTRAR_ID']);
var registrarMember = resp.body;
chain.setRegistrar(registrarMember);
return resolve({statusCode: constants.SUCCESS, body: 'Network configuration complete'});
})
.catch(function(err){
return reject({statusCode: constants.INTERNAL_SERVER_ERROR, body: 'Could not enroll registrar: '+constants['BLOCKCHAIN_REGISTRAR_ID'] });
})
}
});
}
catch(err){
logHelper.logError(logger, 'configureNetwork', 'Could not configure network', err);
return reject({statusCode: constants.INTERNAL_SERVER_ERROR, body: 'Could not configure network', err});
}
});
}
|
- 第 7 行会读取我们从 Blockchain 服务凭证中提供的证书路径下载的 pem 文件。已为 Bluemix Blockchain 网络中的所有通信启用了 TLS。这也包括客户端应用程序与网络实体(比如成员服务和对等节点)之间的通信。
- 第 14 到第 17 行将之前获取的成员服务和对等节点 URL 添加到链对象和 pem 文件中。链对象在与成员服务和对等节点通信时会使用 pem 文件。
- 第 19 到第 28 行会在区块链网络中登记 WebAppAdmin。之前已经解释过,登记后将生成 ECert 对,链对象会将该证书对存储在 Cloudant 键值存储中。如果通过 Cloudant 服务查看您的 Cloudant 数据库中的文档,现在将会看到一个针对 member.WebAppAdmin 的条目,如下面示例所示:
{"name":"WebAppAdmin","enrollment":{"key":"f4b19c7195d2da0ea
02a47fa8e2aabdc0b4ba610720a696e895b400fb81cb9be","cert":"d2
d2d2d454e44204543445341205055424c4943204b45592d2d2d2d2d
0a","queryStateKey":{"type":"Buffer","data":[91,181,140,162,159,21
8,158,144,230,192,52,99,100,155,235,23,72,242,97,158,82,29,54,22
2]}}}
|
- 第 23 行将链的注册员设置为 WebAppAdmin 成员对象。链将使用这个注册员向区块链注册新成员/用户。
区块链设置到此就完成了。现在看看其他重要方法:
使用功能注册新用户让我们来看看 doRegister 方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| var roles = params.roles;
if(!validate.isValidArray(roles)){
roles = ['client'];
}
var enrollsecret
var chain = bcNetwork.getChain();
var reg = chain.getRegistrar();
var chainAsync = Promise.promisifyAll(chain);
chainAsync.getMemberAsync(username)
.then(function(member){
var memberAsync = Promise.promisifyAll(member);
var registrationRequest = {
enrollmentID: username,
attributes: [
{name: 'role', value: affiliation},
{name: 'username', value: username}
],
affiliation: 'group1',
registrar: reg,
roles: roles
};
return memberAsync.registerAsync(registrationRequest);
})
.then(function(enrollsec){
logHelper.logMessage(logger, 'registerUser', 'Successfully registered user on blockchain: '+username);
enrollsecret = enrollsec;
return resolve({statusCode: constants.SUCCESS, body: {password: enrollsecret}});
})
|
要向基于 Hyperledger Fabric 的区块链注册新用户,可在注册请求中发送以下字段:
- enrollmentID(字符串):此成员/用户的登记 ID。
- roles(字符串数组):表示与此成员有关联的角色。有效的角色包括 client(默认)、peer、validator 和 auditor。
- affiliation(字符串):此成员的从属关系。从属关系可在 manifest.yaml 文件中找到。对于 Bluemix 上的 Blockchain 服务,父分组是 group1。
- attributes(属性数组):授予此成员的属性名称和值。这些属性由用户定义,存储在 ACA 中。所有这些属性或部分属性都将嵌入在此成员请求的 TCert 中。链代码可以使用相同的属性,通过解析调用方 TCert 来实现访问控制。
- registrar:用户可以具有注册员的角色,该角色使用户能注册其他成员。需要在请求中包含拥有注册员权利的成员对象。这个注册员成员将用于注册所请求的成员。
- 第 7 和第 8 行将从 blockchain_network.js 文件获取链对象,并从该链对象获取注册员对象。
- 第 11 行将从链中获取成员对象。在基于 Hyperledger Fabric 与区块链网络进行任何交互时,我们都必须拥有一个成员对象的句柄,代表这个成员对象来执行所有链代码部署和调用。getMember 方法从 Cloudant 键值存储中获取成员 ECert 和其他元数据信息。
- 第 15 到第 23 行将创建一个注册请求。请注意 username 和 role 的属性键/值对。本教程系列的第 1 部分介绍了链代码如何利用这些属性来实现访问控制。
- 第 27 行将会调用成员对象上的注册方法,后续代码会获取从 ECA 返回的一次性密码令牌,以便在登记流程中使用它。
|