0

我正在尝试对cc02来自另一个链代码(cc01)的链代码()执行查询,两者都驻留在同一通道上。当我尝试通过调用来调用查询函数时stub.invokeChaincode(...),该命令返回的是 a[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 函数中。我在这做错了什么?

4

2 回答 2

1

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

替换以下行:

return shim.success(valString);

和:

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

第一个链码(cc01)得到一个对象响应,而不是一个字符串。

于 2018-04-17T12:56:46.763 回答
0

我在只有一个通道的网络中从另一个链代码调用链代码调用查询时遇到了类似的问题。似乎调用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 字符串。

根据文档

如果被调用的链码在同一个通道上,它只是将被调用的链码读取集和写入集添加到调用事务中。

但是文档没有提到修改有效负载或任何关于事务 id 或通道名称的内容。

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

于 2019-07-23T17:53:42.823 回答