Hyperledger Fabric Node.js SDK是否支持通过部分ID检索资产?
Hyperledger Fabric Node.js SDK 部分ID搜索资产相关说明
Hyperledger Fabric Node.js SDK 本身不直接内置通过ID片段模糊搜索资产的能力,底层逻辑限制如下:
Fabric 世界状态默认是键值存储结构,原生提供的getState资产查询接口是精确匹配规则,只能通过完整资产ID查询对应资产,直接通过SDK调用原生查询接口时,传入ID片段无法返回匹配结果。实现ID片段搜索的可行方案
该能力需要配合链码逻辑和世界状态数据库的查询能力共同实现,分两种部署场景:- 使用CouchDB作为世界状态数据库(推荐方案)
CouchDB 支持富查询和正则匹配能力,是实现模糊搜索的最优选择
- 首先在链码的
META-INF/statedb/couchdb/indexes目录下,为资产的ID字段配置查询索引,加速检索效率 - 在链码中自定义模糊查询函数,使用CouchDB的
$regex匹配规则筛选符合ID片段的资产,示例链码逻辑(Node.js版链码):
async queryAssetsByPartialId(ctx, idFragment) { const query = { selector: { // 此处的id对应你资产结构体中存储资产ID的字段名 id: { $regex: idFragment } } }; const iterator = await ctx.stub.getQueryResult(JSON.stringify(query)); const resultList = []; // 遍历迭代器组装查询结果 while (true) { const res = await iterator.next(); if (res.value) { resultList.push(JSON.parse(res.value.value.toString('utf8'))); } if (res.done) { await iterator.close(); return Buffer.from(JSON.stringify(resultList)); } } }- Node.js SDK 侧直接调用上述自定义链码函数即可获取匹配结果,示例代码:
const result = await contract.evaluateTransaction('queryAssetsByPartialId', 'bc12'); const matchedAssets = JSON.parse(result.toString()); - 首先在链码的
- 使用LevelDB作为世界状态数据库
LevelDB 不支持富查询,只能手动在链码中维护全量资产ID集合,查询时遍历集合过滤出匹配的ID,再批量查询对应资产,该方案仅适合资产规模很小的测试场景,性能较差不推荐生产使用。
- 使用CouchDB作为世界状态数据库(推荐方案)
注意事项
- 正则模糊查询性能会随资产量级上升下降,若业务允许仅做前缀匹配,建议将正则规则限制为
^开头的前缀匹配,查询效率会远高于任意位置的片段匹配 - 禁止在SDK侧全量拉取所有资产后本地过滤,会严重消耗节点带宽和SDK运行性能
- 正则模糊查询性能会随资产量级上升下降,若业务允许仅做前缀匹配,建议将正则规则限制为
内容的提问来源于stack exchange,提问作者pavithra ramasamy
相关产品推荐
相关产品推荐

