问题描述
我正在用 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 似乎对字节数组处理不当。这是应该在未来修复的问题,但它不知道一个明确的时间表。