我想问哪种方法更好-是让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"}
在账本中是否存在一些用于持久化数组的优化?例如,仅保留更改而不复制所有内容。
答案 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
您可以看一下大理石示例,了解这两种方法的想法: