首页 > 解决方案 > 检查超级账本结构中是否存在密钥的有效方法

问题描述

在超级账本结构链码中,我有兴趣在输入记录时检查条件,不应输入具有相同键的新记录。现在,我需要交叉检查我的分类帐并检查 isDelete 标志是真还是假。现在这里的问题是我需要使用

resultsIterator, err := stub.GetHistoryForKey(key)

然后遍历 resultsIterator 并检查 isdelete 标志并在我发现该键在一段时间内具有多个值时中断循环。但是在代码中,函数 stub.GetHistoryForKey(key) 本身在扫描整个账本时可能会花费大量时间。那么有什么方法可以有效地检查我可以检查新密钥以前不存在的场景吗?

标签: hyperledger-fabrichyperledger

解决方案


您可以继续安全地使用stub.GetHistoryForKey(key)来满足您的要求。与您的看法相反,Fabric 不会遍历每个块来获取密钥的历史记录。

它维护一个单独的索引数据库 [在 Go Level DB 中实现] 来存储块存储中所有键的历史记录。

索引指向块内修改给定键的块和事务。账本将以下 API 公开给背书者,然后作为链码 API 公开。

// GetHistoryForKey retrieves the history of values for a key.
// The returned ResultsIterator contains results of type *KeyModification which is defined in protos/ledger/queryresult.
GetHistoryForKey(namespace string, key string) (commonledger.ResultsIterator, error)

对于给定的键,上述 API 返回键的历史值、创建/修改事务的发布时间以及是否为删除操作。上述功能的实现细节请参考:

https://github.com/hyperledger/fabric/blob/release-1.2/core/ledger/kvledger/history/historydb/historyleveldb/historyleveldb_query_executer.go


推荐阅读