首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

为基于 Hyperledger Fabric v0.6 的区块链网络开发客户端应用程序(7)

为基于 Hyperledger Fabric v0.6 的区块链网络开发客户端应用程序(7)

区块链网络配置让我们来看看 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                    返回的一次性密码令牌,以便在登记流程中使用它。
返回列表