Search code examples
gostatehyperledger-fabrichyperledger-chaincodechaincode

How to write struct onto ledger state


I am trying to write chaincode for Hyperledger that has a mapping, that stores struct values mapped to strings. This is my first time writing contracts for Hyperledger and also my first time using go and it appears I am not approaching this the right way.

This is my mapping, Data struct, Init function and addVData function that shows the problem.

type Data struct{
    Timestamp string
    Velocity string
    Location string
}

var all_data map[string]Data

func (t *DataContract) Init(stub shim.ChaincodeStubInterface) peer.Response {
    all_data = make(map[string]Data)

    return shim.Success(nil)
}


func (t *DataContract) addVData(stub shim.ChaincodeStubInterface, args []string) peer.Response {
    params := stub.GetStringArgs()
    fmt.Println("The params passed in are:", params)

    if len(params) != 4 {
        fmt.Println("Please resubmit in this particular order: addVData, Timestamp, Velocity, Location")
        return shim.Error("Please resubmit in this particular order: addVData, Timestamp, Velocity, Location")
    }

    var d = Data{Timestamp:params[1], Velocity:params[2], Location:params[3]}
    all_data[params[1]] = d

    var err = stub.PutState(params[1],d)

    return shim.Success(nil)
}

The error I am getting is actually very clear:

./data.go:79:35: cannot use d (type Data) as type []byte in argument to stub.PutState

I am wondering, since my data is not in form of a byte array, how do I go about storing it? Also, I am not certain I have implemented the Init method and the mappings in the correct way but have had a hard time finding examples. If you could please explain and point me in the right direction it would be very appreciated, thank you.


Solution

  • Use json.Marshal function to convert the struct into bytes

    type UserData struct {
     a string
    }
    
    
    userdata := &UserData{a: "hello"}
    
    // Mashelling struct to jsonByte object to put it into the ledger
    userDataJSONBytes, err := json.Marshal(&userdata)
    if err != nil {
        return shim.Error(err.Error())
    }
    
    var err = stub.PutState(params[1],userDataJSONBytes)