Board logo

标题: 为基于 Hyperledger Fabric v0.6 的区块链网络开发客户端应用程序(10) [打印本页]

作者: look_w    时间: 2018-6-23 08:20     标题: 为基于 Hyperledger Fabric v0.6 的区块链网络开发客户端应用程序(10)

用于链代码调用的请求规范这是 getRequestSpec 方法的代码段:
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
function getRequestSpec(params){

        if(!validate.isValidJson(params)){
            logHelper.logError(logger, 'getRequestSpec', 'Invalid params');
            throw new Error("Invalid params");
        }

        var chaincodeID = config['chaincode']['id']
        if(!validate.isValidString(chaincodeID)){
            logHelper.logError(logger, 'getRequestSpec', 'Invalid chaincodeID');
            throw new Error("Invalid chaincodeID");
        }

        var functionName = params.functionName;
        if(!validate.isValidString(functionName)){
            logHelper.logError(logger, 'getRequestSpec', 'Invalid function name');
            throw new Error("Invalid function name");
        }

        var args = []
         
        if(validate.isValidArray(params.args)){
            args = params.args;
        }

        var attributes = ['username', 'role']
         
        if(validate.isValidArray(params.attributes)){
            attributes = params.attributes;
        }

        var spec = {
            chaincodeID: chaincodeID,
            fcn: functionName,
            args: args,
            attrs: attributes
        }

        return spec;
}




调用部署在区块链上的链代码这是 doInvoke 方法的代码段:
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
var chain = bcNetwork.getChain();
            var chainAsync = Promise.promisifyAll(chain);
            

            chainAsync.getMemberAsync(user)
            .then(function(member){
                 
                var tx = member.invoke(requestSpec);
                tx.on('submitted', function(data) {
                    logHelper.logMessage(logger, 'doInvoke', 'Transaction for invoke submitted ',requestSpec);
                    return resolve({statusCode: constants.SUCCESS, body: data});
                     
                });

                tx.on('complete', function(data) {
                    //logHelper.logMessage(logger, 'doInvoke', 'Transaction for invoke complete ',data);
                     
                });

                tx.on('error', function (err) {
                    logHelper.logError(logger, 'doInvoke', 'Could not perform invoke ',err);
                    return reject({statusCode: constants.INTERNAL_SERVER_ERROR, body: 'Could not perform invoke ' });
                    
                });
            })




备注 1:您需要在事务对象上注册 submitted、complete 和                    error 事件,才能获知事务的状态
备注 2:调用请求仅返回链代码调用的事务 UUID。它不会返回从链代码函数本身返回的任何数据。
备注 3:即使实际的链代码函数抛出了错误且没有成功完成,也不会调用 error 事件。此时会调用 complete                    事件。
我采用的方法是等待 submitted 事件。这至少表明链代码函数将被调用。要确保成功执行链代码,您可以:





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0