2016-07-23 54 views
0

在chaincode init期間,可以部署鍵值對,例如:[「a」,「100」,「b」,「200」 ]Chacodeode shim:密鑰的更多值或允許非整數的值

但是,我想部署鍵值對,如:[「a」,「100,v1,v2」] 這樣100,v1,v2是a的值。兩個註釋: 1.值爲非整數 2.數值用逗號分隔「,」

這可能嗎?

我檢查chaincode墊片:/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(key,value,stub.UUID)。有關如何修改它的任何指示燈,使其能夠按要求工作?謝謝,

回答

1

在chaincode中,每個狀態只能有一個與之關聯的值。但是,通過將該「一個值」作爲列表可以模擬多個值。所以你可以做這樣的事情

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

「a」的狀態現在是一個逗號分隔的列表。當你想檢索這些值,請執行下列操作:

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

應打印以下字符串

100,V1,V2

如果您有需要的個人參數,只需在逗號分割字符串,並轉換爲適當的類型。 Bam,你現在可以存儲和檢索元素。或者,如果你的數據結構比這個更復雜,那麼把你的數據放入一個json對象可能是值得的。然後,您可以使用封送處理和解組處理從[]byte(可以直接存儲在狀態中)和對象(可能更易於使用)之間來回轉換。

使用JSON例,使用init方法,因爲它是你提到

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 
} 
的一個