如何更新结构的数据并将其保存在链代码中?

时间:2017-01-24 04:16:32

标签: go blockchain hyperledger

以下是链代码的摘录,其中我创建了一个保存基本信息的客户结构。我希望编写一个更新函数,首先使用UID(args [0])获取客户的详细信息,然后根据函数更新的第二个参数附加/更新Country,最后保存更新的数据。 我究竟做错了什么?我也想知道Marshal和Unmarshal的概念。

type Customer struct {
  UID     string
  Name    string
  Address struct {
    StreetNo string
    Country  string
  }
}
func (t *SimpleChaincode) update(stub shim.ChaincodeStubInterface, args []string) ([]byte, error) {


if len(args) != 2 {
    return nil, errors.New("Incorrect number of arguments. Expecting name of the key to query")
}
  //args[0] to get the UID of customer whose details to be updated
  //args[1] data that needs to be updated 

data,err:= stub.GetState(ars[0])
if err != nil {
     return nil, err
}
json.Unmarshal(data, &uid)
//append
data.Country= append(data.Country,args[1])
fmt.Printf("Risk Fag set for UID %s",data)

raw, err := json.Marshal(data)
  if err != nil {
     return nil, err
  }

  stub.PutState(data.UID, raw)

return nil,nil

}

2 个答案:

答案 0 :(得分:1)

在Fabric链代码示例中,有一个很好的编组和解组结构到/来自JSON的示例。它演示了如何从链中读取JSON数据,更新结构的某些字段,然后将JSON数据重新保存到链中。请参阅示例中的transferMarble函数:

https://github.com/hyperledger/fabric/blob/release/examples/chaincode/go/marbles02/marbles_chaincode.go

答案 1 :(得分:0)

您需要提供一个JSON包可以放置解码数据的变量。例如,这将包含任意数据类型的字符串映射:

map[string]interface{}

byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
if err := json.Unmarshal(byt, &dat); err != nil {
    panic(err)
}
fmt.Println(dat)

结果是:

map[num:6.13 strs:[a b]]