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

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

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

网络设置功能设置我们现在来详细分析 setup 方法:
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
42
43
44
45
46
function setup(){
    return new Promise(function(resolve, reject){
        try{
            logHelper.logMethodEntry(logger,"setup");

            //Fetch IBM Bluemix Cloudant and Blockchain service instance configuration
            var cloudantConfig = config.VCAP_SERVICES[constants.VCAP_SERVICES_CLOUDANT][0];
            var blockchainConfig = config.VCAP_SERVICES[constants.VCAP_SERVICES_BLOCKCHAIN][0];
            
            //Setup datastore
            var result = datastore.initSync(cloudantConfig);
            if(result.statusCode != constants.SUCCESS){
                logHelper.logError(logger,'Could not initialize datastore', result);
                return reject({statusCode: 500, body: ''});
            }

            //Setup Cloudant based KeyValueStore
            var cloudantSetupDone = false;
            getCloudantKeyValStore(datastore, config.databases[constants.APP_MASTER_DB])
            .then(function(resp){
                cloudantKvStore = resp.body;
                cloudantSetupDone = true;
                return blockchainNetwork.setupBlockchain({blockchainConfig: blockchainConfig, ccName: constants['BLOCKCHAIN_CHAINCODE_NAME'] , kvStore: cloudantKvStore })
            })
            .then(function(resp){
                return resolve({statusCode: 200, body: ''});
            })
            .catch(function(err){
                if(cloudantSetupDone != true){
                    logHelper.logError(logger,'Could not initialize CloudantKeyValueStore', err);
                }
                else{
                    logHelper.logError(logger,'Blockchain setup failed. exiting...',err);
                }
                return reject(err);
            });
            
            
        }
        catch(err){
            logHelper.logError(logger,'Could not complete setup', err);
            throw reject({statusCode: 500, body: err});
        }
    })
     
}




在上面的清单中:
  • 第 7 和第 8 行会从 runtime.json 文件中获取 Cloudant 和 Blockchain                    服务凭证,我们之前已更新过这些信息。config 模块会解析 runtime.json 文件,并将其内容作为一个 JSON                    对象提供。
  • 第 11 到第 15 行会初始化 Cloudant 数据存储。datastore.js                    文件用于获取一个数据库实例的句柄,该句柄可用于在我们的 Cloudant 数据库上执行 CRUD 操作。
  • 第 18 到第 24 行会使用之前获得的数据库实例,初始化基于 Cloudant                    的自定义键值存储实现。Hyperledger Fabric Client SDK 链对象将使用这个键值存储来管理 ECert                    和其他用户元数据。随后是区块链网络设置。
区块链网络设置现在让我们来看看 setupBlockchain 方法。
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
function setupBlockchain(params){
    return new Promise(function(resolve,reject){
        try{
            logHelper.logEntryAndInput(logger, 'setupBlockchain', params);

            if(!validate.isValidJson(params)){
                logHelper.logError(logger, 'setupBlockchain', 'Invalid params');
                return reject({statusCode: constants.INVALID_INPUT, body: 'Could not setup blockchain. Invalid params' });
            }
            var goPath = __dirname+'/../../chaincode/';
            process.env.GOPATH = goPath;
            
            
            chainInit({ccName: params.ccName, kvStorePath: params.kvStorePath, kvStore: params.kvStore})
            .then(function(resp){
                return loadNetworkConfiguration(params.blockchainConfig);
            })
            .then(function(resp){
                return configureNetwork();
            })
            .then(function(resp){
                logHelper.logMessage(logger, 'setupBlockchain', 'blockchain setup complete');
                isSetupComplete = true;
                return resolve({statusCode: constants.SUCCESS, body: 'blockchain setup complete'});
            })
            .catch(function(err){
                logHelper.logError(logger, 'setupBlockchain', 'Could not setup blockchain', err);
                return reject({statusCode: constants.INTERNAL_SERVER_ERROR, body: 'Could not setup blockchain', err});
            });
        }
        catch(err){
            logHelper.logError(logger, 'setupBlockchain', 'Could not setup blockchain', err);
            return reject({statusCode: constants.INTERNAL_SERVER_ERROR, body: 'Could not setup blockchain', err});
        }
    });
}




此设置包含 3 个函数。第 14 行 以 chainInit 开头,随后是                loadNetworkConfiguration,最后是                configureNetwork。
这是初始化这个链的代码段:
1
2
3
4
5
6
7
8
9
10
11
12
var kvStore = params.kvStore;
            if(!validate.isValid(kvStore)){
                logHelper.logError(logger, 'chainInit', 'Invalid kvStore');
                return reject({statusCode: constants.INVALID_INPUT, body: 'Could not initialize Chain. Invalid kvStore' })
                 
            }

            chain = hfc.newChain(ccName);
            // Configure the KeyValStore which is used to store sensitive keys
            // as so it is important to secure this storage.
            chain.setKeyValStore(kvStore);
            chain.setECDSAModeForGRPC(true);




  • 第 1 到第 6 行负责输入验证。
  • 第 8 行中,使用 Hyperledger Fabric Client SDK 模块                    hfc 创建了一个新的链对象。
  • 第 11 行中,为这个链对象配置了键值存储实现,以便用它来管理用户的 ECert。在本例中,该实现是                    Cloudant 键值存储实现。Hyperledger Fabric Client SDK                    还提供了一个默认的基于文件的键值存储实现可供使用。(但是,要将区块链客户端应用程序部署到云上,不建议使用基于文件的实现,因为重新部署客户端代码会导致基于文件的键值存储丢失。在这种情况下,所有以前注册的用户都将失去作用,因为它们没有必要的证书来执行验证。)
  • 第 12 行中,用于 TLS 通信的密码组被设置为 ECDSA。
链对象的配置属性
  • IsSecurityEnabled:如果为链对象配置了有效的成员服务端点,则需要考虑启用安全性。启用安全性意味着,将使用                    TCert 生成一个基于 ECDSA 的数字签名,所有链代码调用事务中都会发送该签名。各个对等节点都将使用这个 TCert                    来验证调用方。
  • IsPreFetchMode:在预取模式中,链对象在初始化时将向成员服务请求一批                    TCert,而不是等待一次事务调用。这么做是为了提高性能。
  • TCertBatchSize:获取 TCert 批量请求中包含的要返回的 TCert 数量。默认值为                    200。
返回列表