我正在尝试获取分类帐中的所有条目(Fabric 1.4.4,使用 Java Chaincode):
QueryResultsIterator<KeyValue> iterator = ctx.getStub().getStateByRange("","");
但我总是得到一个空的迭代器。这是获取所有条目的正确方法吗?
(至少一种获取所有密钥的方法对我有用,因为我可以一个一个地获取状态,但为此我需要所有密钥)
我正在尝试获取分类帐中的所有条目(Fabric 1.4.4,使用 Java Chaincode):
QueryResultsIterator<KeyValue> iterator = ctx.getStub().getStateByRange("","");
但我总是得到一个空的迭代器。这是获取所有条目的正确方法吗?
(至少一种获取所有密钥的方法对我有用,因为我可以一个一个地获取状态,但为此我需要所有密钥)
问题是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
由于某种原因 getStateByRange("","") 在 Fabric Java SDK 中不起作用,但这会起作用:
getStateByRange("A","Z")
(我所有的 id 都以大写字母开头,所以我得到所有条目)
我不确定归还整个区块链是个好主意。
无论如何,您可以通过使用获取单个密钥的历史记录
APIstub.GetHistoryForKey(id)
这将返回该特定 ID 所涉及的所有事务