0

チェーンコードの初期化中に、次のようなキーと値のペアをデプロイできます: ["a","100", "b", "200"]

ただし、次のようなキーと値のペアを展開したいと思います: ["a", "100, v1, v2"] 100、v1、v2 が a の値であるように 2 つの注意事項: 1. 値は整数ではありません 2. 値はコンマ「,」で区切られます

これは可能ですか?

チェーンコード シムを確認します: /home/standards/go/src/github.com/hyperledger/fabric/core/chaincode/shim/chaincode.go

関数:

// PutState writes the specified `value` and `key` into the ledger.
func (stub *ChaincodeStub) PutState(key string, value []byte) error {
    return handler.handlePutState(key, value, stub.UUID)

これは handlePutState (キー、値、stub.UUID) を呼び出します。希望どおりに動作するように変更する方法についてのライトはありますか? ありがとう、

4

1 に答える 1

1

チェーンコードでは、各状態に関連付けられる値は 1 つだけです。ただし、その「1つの値」をリストにすることで、複数の値をシミュレートできます。だから、あなたはこのようなことをすることができます

stub.PutState("a",[]byte("100,v1,v2"))

「a」の状態はカンマ区切りのリストになりました。これらの値を取得するには、次の手順を実行します。

Avals, err := stub.GetState("a")
AvalsString := string(Avals)
fmt.Println(AvalsString)

次の文字列を出力する必要があります

100、v1、v2

そこから個々の引数が必要な場合は、文字列をカンマで分割し、適切な型に変換してください。バム、これで要素を保存および取得できます。

または、データ構造がそれよりも複雑な場合は、データを json オブジェクトに入れる価値があるかもしれません。次に、マーシャリングとアンマーシャリングを使用して、[]byte(状態に直接格納できる) とオブジェクト (おそらく使いやすい) を相互に変換できます。

あなたが言及したものであるため、initメソッドを使用したJsonの例

type SomeStruct struct {
    AVal   string            `json:"Aval"`
    BVal   []string            `json:"Bval"`
}

func (t *MyChaincode) Init(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
    //recieve args ["someStringA","BVal1","Bval2","Bval3"]

    //constructing and storing json object
    myStruct := SomeStruct{
        AVal: args[0],
        BVal: []string{args[1],args[2],args[3]},
    }
    myStructBytes, err := json.Marshal(myStruct)
    _ = err //ignore errors for example
    stub.PutState("myStructKey",myStructBytes)

    //get state back to object
    var retrievedStruct SomeStruct
    retrievedBytes, err := stub.GetState("myStructKey")
    json.Unmarshal(retrievedBytes,retrievedStruct)

    //congratulations, retrievedStruct now contains the data you stored earlier
    return nil,nil
}
于 2016-07-25T14:57:52.033 に答える