ホーム>source

私はどちらのアプローチが良いかを尋ねたいです-サイズMのjson値を指す単一のキーのN個の異なるバージョンを持っているか、サイズM/Nの値を持つN個の異なるキーを持っていますか?

CouchDBを状態データベースとして使用しています。

例:

多くのバージョンを持つ単一のキー(すべての値は異なるチェーンコード呼び出しの後に挿入されます):

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

1つのバージョンの複数のキー:

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

元帳の配列を永続化するための最適化はありますか?たとえば、すべてをコピーせずに変更のみを保持します。

あなたの答え
  • 解決した方法 # 1

    あなたの質問を正しく理解したかどうかわかりません。ただし、一般的にこれを行うには2つのアプローチがあります。しかし、詳細に入る前に、各バージョンが追加される値として配列を持つ単一のキーを保存することは厳密な禁止事項です。

    これは、同じキーを同時に、または同じブロック内の異なるトランザクションで変更すると、必ず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

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ reactjs - useEffect依存関係に参照が欠落している場合、eslint警告はありません