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

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

有没有办法修复它而不替换类型?我想用UUID作为UUID。UUID(字节数组),而不是字符串,因为我不想进行转换和UUID字符串验证。

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

Hyperledger在安装chaincode后试图查询状态数据库时出错

目前的建议是转换为字符串,因为合约API似乎错误地处理字节数组。这是将来应该解决的问题,但确切的时间表尚不清楚。

最新更新