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)
对于给定的键,上述 API 返回键的历史值、创建/修改事务的发布时间以及是否为删除操作。上述功能的实现细节请参考:
推荐阅读
- django - 从 django 1..x 和 cms-plugins 迁移到 djangocms 插件和 django 2 后出错
- python - 有没有办法使用余弦相似度找到 BallTree 或 KDTree 的最近邻居?
- javascript - 在 JavaScript 数组中将连续数字分组为“from~to”字符串
- php - 在函数内逐行读取 .txt 文件 - 优化 PHP 脚本以获得更好的性能
- javascript - 从一组按钮转移到另一组按钮
- angular - Angular 服务调用测试
- swiftui - 您可以将 UIViewRepresentable (UISearchBar) 添加为 navigationBarItem 吗?- 斯威夫特用户界面
- amazon-web-services - 如何通过powershell创建AWS New-Scprovisionedproduct
- java - 无论手机的屏幕尺寸如何,如何缩放粉红色框以使其完美地适合电子表格的网格?安卓工作室
- c# - 如何在基类中使用派生类属性?C#