Hyperledger Fabric - NodeSDK中的invokeChaincode返回[Object object]

时间:2018-04-17 12:35:07

标签: hyperledger-fabric hyperledger ibm-blockchain

我正在尝试对来自另一个链代码(cc02)的链代码(cc01)执行查询,这两个代码都驻留在同一个通道上。当我尝试通过调用stub.invokeChaincode(...)来调用查询函数时,该命令返回[Object object]而不是查询结果。有人可以告诉我这里的错误是什么吗?

更多详情

cc01中查询功能的最小版本为:

async queryOtherContract(stub, args) {
    let chaincodeName = args[0]; //cc02
    let fcn = args[1];           //query
    let fcnArgs = args[2];       //key
    let channel = args[3];       //defaultchannel
    let queryResponse = await stub.invokeChaincode(chaincodeName, [fcn, fcnArgs], channel);
    console.log('Query response: ', JSON.stringify(queryResponse));
}

输出:

Query response: {"status":200,"message":"","payload":{"buffer":{"type":"Buffer","data":[8,6...108]},"offset":9,"markedOffset":-1,"limit":59,"littleEndian":true,"noAssert":false}}

有效负载缓冲区解码为[Object object]

来自cc02的查询功能如下:

async query(stub, args) {
    let key = args[0]; //key
    let valueAsBytes = await stub.getState(key);
    let valString = valueAsBytes.toString('utf8');
    console.log('Value String: ', valString);
    return shim.success(Buffer.from(valString));
}

输出:Value String: Value001

我也尝试了不同的变体,包括直接发送valueAsBytes以及直接返回valString而不是将其包装在shim函数中。我在这做错了什么?

2 个答案:

答案 0 :(得分:1)

它返回一个缓冲区,因此您需要执行以下操作:

替换以下行:

return shim.success(valString);

使用:

return shim.success(Buffer.from(valString));

第一个链码(cc01)获取对象响应而不是字符串。

答案 1 :(得分:0)

我在调用chaincode时遇到了类似的问题,它仅从一个通道访问网络中另一个chaincode的查询。似乎调用了 invokeChaincode

var response = stub.invokeChaincode("MyChaincode", ["query", key])

不仅返回查询的有效负载,还通过附加事务ID和通道以及读/写集来修改查询。 (这是v1.2软件包和网络的。)

response.payload.toString()正在为我返回:

�{"carId":"CAR_0001"}"@48147a5a84e591671363053e58e4c56fe5d3e42c4adce1ecb2ce92f9922fd5b6:mychannel

查询的交易ID为:48147a5a84e591671363053e58e4c56fe5d3e42c4adce1ecb2ce92f9922fd5b6

和我的频道名称:mychannel。不确定是什么意思。

即使有效负载传递给shim.success(payload),我也确认是:

{"carId":"CAR_0001"}

这令人难以置信,因为我不知道为什么它会修改实际的有效负载字符串。我的解决方法是从响应中提取带有indexOf和lastIndexOf括号的json字符串。

根据docs

  

如果被调用的链码在同一频道上,则只需添加   称为链码读取集和写入集到调用事务。

但是文档中没有提到修改有效负载或有关事务ID或通道名称的任何事情。

希望这有助于从同一通道上的其他链码中查询链码。如果我说错了话,请纠正我。