检查超级账本结构中密钥是否存在的有效方法
Efficient method to check for existence of key in hyperledger fabric
在 hyperledger fabric 链代码中,我有兴趣在输入记录时检查条件,不应输入具有相同密钥的新记录。现在我需要交叉检查我的分类帐并检查 isDelete 标志是真还是假。现在的问题是我需要使用
resultsIterator, err := stub.GetHistoryForKey(key)
然后遍历 resultsIterator 并检查 isdelete 标志,一旦我发现该键在一段时间内有多个值,就中断循环。但是在代码中,函数 stub.GetHistoryForKey(key) 本身可能会在扫描整个账本时花费大量时间。那么有什么方法可以有效地检查我可以检查新密钥之前不存在的场景吗?
您可以继续安全地使用 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)
对于给定的键,上面的APIreturns键的历史值,created/modified的事务发出的时间,是否是删除操作。以上功能的实现细节请参考:
在 hyperledger fabric 链代码中,我有兴趣在输入记录时检查条件,不应输入具有相同密钥的新记录。现在我需要交叉检查我的分类帐并检查 isDelete 标志是真还是假。现在的问题是我需要使用
resultsIterator, err := stub.GetHistoryForKey(key)
然后遍历 resultsIterator 并检查 isdelete 标志,一旦我发现该键在一段时间内有多个值,就中断循环。但是在代码中,函数 stub.GetHistoryForKey(key) 本身可能会在扫描整个账本时花费大量时间。那么有什么方法可以有效地检查我可以检查新密钥之前不存在的场景吗?
您可以继续安全地使用 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)
对于给定的键,上面的APIreturns键的历史值,created/modified的事务发出的时间,是否是删除操作。以上功能的实现细节请参考: