0

在链码初始化期间,可以部署键值对,例如:[“a”,“100”,“b”,“200”]

但是,我想部署键值对,例如: ["a", "100, v1, v2"] 这样 100, v1, v2 是 a 的值。两个注意事项: 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

在链码中,每个状态只能有一个与之关联的值。但是,可以通过将“一个值”列为列表来模拟多个值。所以你可以做这样的事情

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
}
于 2016-07-25T14:57:52.033 回答