代码之家  ›  专栏  ›  技术社区  ›  user9040429

一种有效的检查超分类帐中密钥存在的方法

  •  0
  • user9040429  · 技术社区  · 6 年前

    在hyperledger fabric链码中,我有兴趣在输入一条记录时检查一个条件,即不应输入具有相同键的新记录。为此,我需要交叉检查我的分类账,并检查isdelite标志是真是假。现在的问题是我需要用

    resultsIterator, err := stub.GetHistoryForKey(key)
    

    然后在resultsIterator上迭代,检查isdelete标志,并在发现键在一段时间内有多个值时中断循环。但在代码中,function stub.GetHistoryForKey(key)本身在扫描整个分类账时可能要花很多时间。那么,有没有一种有效的方式来检查我可以检查新密钥以前不存在的场景吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   arnabkaycee    6 年前

    你可以继续安全使用 stub.GetHistoryForKey(键) 以满足你的要求。与您的想法相反,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