2016-10-09 4 views
0

の前にinitデータを失いました。チェーンコードを変更して展開するたびに新しいchaincodeIDが返されましたが、私は再びプロダクション環境を実行しなければなりません。チェインコードを更新したい場合は、履歴データを保持する必要があります。私はseached、https://jira.hyperledger.org/browse/FAB-22このURLは今私には、チェーンコードのアップグレードをサポートしていないhyperledgerので、私は今これが必要な場合はどうすればいいですか?私がそれを誤解すれば、あなたは私に教えてくれるでしょう。ありがとう!チェーンコードを更新した後、私は

答えて

3

FAB-22で見つかったように、Fabric v0.5-0.6はチェーンコード「アップグレード」をサポートしていません。このような動作の理由は、Fabricが情報を元帳に保存する方法です。 chaincodeがPutStateメソッドを呼び出ししようとします:

PutState(customKey string, value []byte) error 

ファブリックが自動的にキーにChaincodeIdを追加し、名前CHAINCODE_ID + customKeyを使用して提供された「値」を保存しますが。 その結果、各チェーンコードは、それ自身の変数にのみアクセスできます。更新後、チェーンコードは新しいChaincodeIdと新しい可視領域を受け取ります。

この制限に対処するには、いくつかの回避策があります。あなたは「stub.RangeQueryState」メソッドを使用して総勘定元帳からすべての変数をロードする機能「readAllVars」を作成することができ、あなたのchaincode(V1)で

  1. は、カスタム機能をアップグレードします。

  2. 新しいバージョン(v2)がデプロイされている場合、 "InvokeChaincode"を使用して(v1)にクロスチェーンコードを要求し、 "readAllVars"から以前の状態を読み取り、すべての(v2)可視領域のすべてを保存できます。

DAO層

あなたは責任を「読み取り/書き込み」操作になります別のchaincodeを作成することができます。すべてのバージョンは、この "DAO"をすべての "PutState"および "GetState"要求のプロキシとして使用します。そのようなアプローチでは、すべてのChaincodeのバージョンは同じ可視領域で動作します。同時に、このDAOレイヤーはセキュリティの責任を負うようになり、他のチェーンコードがプライベート情報にアクセスできないことを保証する必要があります。

+0

ありがとう、私はこれを試して、v1の結果を見て、これは大丈夫だと思います。 – teddy

関連する問題