【问题标题】:How can I use UUID (as byte array) in Hyperledger Fabric chaincode written in Go?如何在用 Go 编写的 Hyperledger Fabric 链码中使用 UUID(作为字节数组)?
【发布时间】:2021-02-15 17:12:30
【问题描述】:

我正在用 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 字段,它运行良好。但是现在,添加此字段后,当我调用Get 方法时,我收到下一个错误Value did not match schema:\n1. return.uuid: Invalid type. Expected: array, given: string"

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

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

【问题讨论】:

  • 我检查了代码,并注意,这个问题不完全是 UUID,而是字节数组。

标签: go hyperledger-fabric uuid hyperledger-chaincode


【解决方案1】:

这个问题也遇到过类似的问题:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多