【发布时间】: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