为基于 Hyperledger Fabric v0.6 的区块链网络开发客户端应用程序(5)
- UID
- 1066743
|
为基于 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。
|
|
|
|
|
|