【问题标题】:How does ChaincodeStub.delState impact the ledger?ChaincodeStub.delState 如何影响账本?
【发布时间】:2021-07-06 13:06:06
【问题描述】:

我有一个关于org.hyperledger.fabric.shim.ChaincodeStub.delState(String key) 如何影响分类帐的具体问题。

我知道区块链上的数据几乎永远不会被删除,但是根据文档here,有一个delState方法,

Records the specified key to be deleted in the writeset of the transaction proposal.

The key and its value will be deleted from the ledger when the transaction is validated and successfully committed.

据我了解,账本有两个组成部分——区块链和世界状态。这个操作对这两个组件有什么影响?

【问题讨论】:

  • 对应key的State值被擦除,记录留在区块链上。
  • 例如,如果你在user_myeongkil键中插入一个100的状态值,然后执行DelState,那么user_myeongkil中的no valueuser_myeongkil键中的StateDB保留最新值。在blockchain(数据结构)中,user_myeongkil中包含100值的记录和user_myeongkil的值已被删除的记录被链接到块。
  • @myeongkilkim 在这种情况下是否仍然可以读取区块链文件并检索与该密钥相关的任何信息?
  • 是的。如果单独看结果,输入(key, data)的记录和删除(key, data)的记录仍然存在,最新状态值为none。

标签: hyperledger-fabric


【解决方案1】:

在 Hyperledger Fabric 中,Ledger 分为两个组件:

  1. 区块链/交易日志(LevelDB)
  2. 世界状态(LevelDB/CouchDB)

Blockchain Ledger 将数据存储在 LevelDB 中,并且只能追加,这意味着您只能向其中添加数据,而不能从中删除数据。由于区块链分类账以仅附加模式工作,因此它维护数据的历史记录。而 World 状态仅存储当前状态。使用世界状态,您可以在 LevelDB 和 CouchDB 之间进行选择。

当您在链码中使用 getHistoryForKey() 时,您会从区块链分类帐中获取数据,而不是从世界状态中获取数据。但是当您在链码中使用 getState() 时,您会从世界状态中获取数据。

因此,即使您使用 delState() 删除数据,数据也会从世界状态中删除,但它会出现在区块链分类帐中,您可以使用getHistoryForKey() 前提是您知道存储数据所使用的密钥。

当你使用 getHistoryForKey()

时你会得到这样的数据
[
  {
   "TxId" :"1121212d...."
   "Timestamp" :"" ,
   "IsDelete": true
   "Record" : {
     .......
      }
   },
  {
   "TxId" :"2221212d...."
   "Timestamp" :"" ,
   "IsDelete": false
   "Record" : {
     .......
    }
   },
 ]

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2011-01-04
    • 2016-12-11
    • 2018-06-08
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多