3

我正在尝试获取分类帐中的所有条目(Fabric 1.4.4,使用 Java Chaincode):

QueryResultsIterator<KeyValue> iterator = ctx.getStub().getStateByRange("","");

但我总是得到一个空的迭代器。这是获取所有条目的正确方法吗?

(至少一种获取所有密钥的方法对我有用,因为我可以一个一个地获取状态,但为此我需要所有密钥)

4

3 回答 3

2

问题是getStateByRange不能返回使用复合键存储的状态

如果您直接使用:

await ctx.stub.putState('objName', Buffer.from(JSON.stringify(obj)));
    

它会起作用的

但是如果你使用像这样的复合键

   let key = ctx.stub.createCompositeKey("objName", [obj]);
   await ctx.stub.putState('objName', Buffer.from(JSON.stringify(obj))); 

它将返回一个空响应。

原因是getStateByRange使用空分隔符来\u0000分隔关键部分,然后不会返回存储的状态(例如 {"Key":"\u0000objName\u0000obj1\u0000","Record":"\u0000"})。要在使用复合键时读取状态,您需要使用getStateByPartialCompositeKey

于 2021-04-04T16:03:17.900 回答
2

由于某种原因 getStateByRange("","") 在 Fabric Java SDK 中不起作用,但这会起作用:

getStateByRange("A","Z")

(我所有的 id 都以大写字母开头,所以我得到所有条目)

于 2019-12-06T12:46:50.063 回答
-3

我不确定归还整个区块链是个好主意。

无论如何,您可以通过使用获取单个密钥的历史记录

APIstub.GetHistoryForKey(id)

这将返回该特定 ID 所涉及的所有事务

于 2019-12-05T16:51:30.863 回答