如何在用 Go 编写的 Hyperledger Fabric 链码中使用 UUID作为字节数组?

问题描述

我正在用 Go 为 Hyperledger Fabric 编写链代码我有一个代码

package chaincode

import (
    "encoding/json"
    "fmt"
    "log"
    "time"

    "github.com/google/uuid"

    "github.com/hyperledger/fabric-chaincode-go/shim"
    "github.com/hyperledger/fabric-contract-api-go/contractapi"
)

type SmartContract struct {
    contractapi.Contract
}

type MyStruct struct {
    ID         string 
    Description string `json:"description"`
    UUID   uuid.UUID `json:"uuid"`
}

func (s *SmartContract) Create(ctx contractapi.TransactionContextInterface,ID string,description string) error {
    asset := MyStruct{
        ID:         ID,Description: description,UUID:     uuid.Nil,}
    js,err := json.Marshal(asset)
    if err != nil {
        return err
    }

    return ctx.GetStub().PutState(asset.ID,js)
}

func (s *SmartContract) Get(ctx contractapi.TransactionContextInterface,ID string) (*MyStruct,error) {
    assetAsBytes,err := ctx.GetStub().GetState(ID)
    if err != nil {
        return nil,fmt.Errorf("Failed to read from world state: %w",err)
    }

    if assetAsBytes == nil {
        return nil,fmt.Errorf("%s does not exist",ID)
    }

    asset := new(MyStruct)
    err = json.Unmarshal(assetAsBytes,asset)
    if err != nil {
        return nil,fmt.Errorf("can not unmarshal: %v",err)
    }

    return asset,nil
}

之前我有相同的代码,但没有 UUID 字段,它运行良好。但是现在,在添加此字段后,我在调用 Value did not match schema:\n1. return.uuid: Invalid type. Expected: array,given: string" 方法时遇到下一个错误 Get

但是正如我所看到的,写入和读取分类效果很好,但是在对等和链码通信中存在一些错误。我不明白如何解决这个错误,除了用字符串类型替换 UUID 字段。

有没有办法在不更换类型的情况下修复它?我想使用 UUID 作为 uuid.UUID(字节数组),而不是字符串,因为我不想进行转换和 UUID 字符串验证。

解决方法

在这个问题中遇到了类似的问题:

Hyperledger error when trying to query the state database after installing the chaincode

目前的建议是转换为字符串,因为合约 API 似乎对字节数组处理不当。这是应该在未来修复的问题,但它不知道一个明确的时间表。