HyperLedger Fabric中的复杂数据类型



我在HyperLedger上读出了文档。但是,我找不到任何有关存储复杂数据类型的信息,我的意思是如果可能的话。例如,假设我们有两个对象:作者和书籍。是否有可能创建一个看起来像这样的智能合约?(打字稿中的示例(:


export class Book {
public ISBN: string;
public Title: string;
}

export class Author {
public firstName: string;
public lastName: string;
public publishedBooks: Array<Book>;
}

如果是这样,在这种情况下查询会是什么样子。另一方面,如果不可能,如何在HyperLedger中对这种数据关系进行建模。

是的,你可以这样做。 在智能合约中实现它,并使用Hyperledger指令查询账本。

例如,在 Go 中,您可以使用填充码 PutState 和 GetState 来确定给定 ID 的实体。 如果你实现了像CouchDB这样的数据库,你甚至可以对你的数据库进行更复杂和丰富的查询。

[编辑1] 用示例回答改进: 这就是我在我的 Go 链码中改进它的方式

type V struct {
Attribute string `json:"Attribute"`
Function  string `json:"Function"`
Value     string `json:"Value"`
}
type AV struct {
Vs  []V      `json:"Vs"`
CFs map[string]string `json:"CFs"`
}

如您所见,我正在使用 V 结构作为 V 数组。 这使我的数据集更加复杂,这是在链码内部。

[编辑 2] 通过查询和放置回答改进: 添加新实体非常简单。我的例子总是在GoLang中。 向链码发送一个 JSON(感谢 SDK(,然后对其进行解组:

var newEntity Entity
json.Unmarshal([]byte(args[0]), &newEntity)

现在使用 PutState 函数将新实体给定他的 ID(在我的例子中包含在 JSON 文件中,id 字段(:

entityAsBytes, _ := json.Marshal(newEntity)
err := APIstub.PutState(newEntity.Id, entityAsBytes)

在这里你完成了。如果现在想要查询检索该 ID 的账本,可以执行以下操作:

entityAsByte, err := APIstub.GetState(id)
return shim.Success(entityAsByte)

最新更新