N个不同版本的单个密钥指向大小为M的json值还是N个不同的密钥为M / N的值?

时间:2018-08-20 11:30:28

标签: couchdb hyperledger-fabric hyperledger

我想问哪种方法更好-是让N个不同版本的单个键指向大小为M的json值,还是让N个不同键的大小为M / N?

我使用CouchDB作为状态数据库。

示例:

具有多个版本的单键(在调用不同的链码后将插入每个值):

"singleKey:1" -> {"values":[v1]}
"singleKey:2" -> {"values":[v1, v2]}
"singleKey:3" -> {"values":[v1, v2, v3]}
...
"singleKey:m" -> {"values":[v1, v2, v3, ..., vm]}

具有一个版本的多个键:

"key1:1" -> {"value":"v1"}
"key2:1" -> {"value":"v2"}
"key3:1" -> {"value":"v3"}
...
"keym:1" -> {"value":"vm"}

在账本中是否存在一些用于持久化数组的优化?例如,仅保留更改而不复制所有内容。

1 个答案:

答案 0 :(得分:1)

不知道我是否正确理解了您的问题。但是通常有两种方法可以做到这一点。但是在开始讨论细节之前,严格限制每个对象的存储,并在每个版本后面附加一个数组作为值。

这是因为,当您同时修改同一密钥或在同一块中的不同事务中修改密钥时,肯定会导致MVCC_READ_CONFLICT错误。

这是因为Fabric使用乐观锁来提交读/写集。

回到方法[这两种方法都与StateDB无关,可以使用Couch / goLevelDB]:

方法1 : 如果您需要在获取值时使用版本,请将每个键存储为组合键

key1-ver1 -> val1
key1-ver2 -> val2
.. and so on

https://github.com/hyperledger/fabric/blob/release-1.2/core/chaincode/shim/interfaces.go#L128 https://github.com/hyperledger/fabric/blob/release-1.2/core/chaincode/shim/interfaces.go#L121

方法2 : 如果在获取时不需要版本,只需获取以前的版本,则Fabric在内部使用其自己的机制存储密钥修改的历史记录。您可以使用链码的API查询此历史记录。

https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeStub.GetHistoryForKey https://github.com/hyperledger/fabric/blob/release-1.2/core/chaincode/shim/interfaces.go#L161

您可以看一下大理石示例,了解这两种方法的想法:

https://github.com/hyperledger/fabric-samples/blob/release-1.2/chaincode/marbles02/go/marbles_chaincode.go