一种检查超账结构中密钥是否存在的有效方法

时间:2018-08-06 11:38:39

标签: hyperledger-fabric hyperledger

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

resultsIterator, err := stub.GetHistoryForKey(key)

,然后遍历resultsIterator并检查isdelete标志并在我发现该键在一段时间内具有多个值后中断循环。但是在代码中,功能存根GetHistoryForKey(key)在扫描整个分类帐时可能会花费很多时间。那么,有什么方法可以有效地检查我可以检查以前是否不存在新密钥的情况?

1 个答案:

答案 0 :(得分:3)

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

它维护一个单独的索引数据库(在Go Level DB中实现),以将所有键的历史记录存储在Block存储中。

索引指向修改给定键的块和块内的事务。分类帐将以下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