チェーンコードでは、各状態に関連付けられる値は 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
}