【问题标题】:Can I pass objects to a Hyperledger Fabric transaction?我可以将对象传递给 Hyperledger Fabric 交易吗?
【发布时间】:2019-12-16 15:12:36
【问题描述】:

我有一个基于fabcar example 的网络设置。自定义了链码和文件夹结构,一切似乎都可以正常编译和启动。但是现在,我想知道我是否可以使用函数Contract.submitTransaction()(在invoke.ts 中找到并在docs 中介绍)或更适用的函数来为自定义类型Shipment 传递更复杂的参数,即基于原始示例的Car 类型。在示例中,Car 只是 strings 的扁平类型,您可以简单地将其传递给 Contract.submitTransaction(),它只接受字符串参数,如下所示:

await contract.submitTransaction('createCar', 'CAR12', 'Honda', 'Accord', 'Black', 'Tom');

对于由多个“子类型”组成的类型Shipment,这会变得有点困难:

import { TransitStatusEnum } from "../enum/transitstatusenum";
import { FreightContainer } from "./freightcontainer";
import { Company } from "./company";

export class Shipment {
    public docType?: string;
    public id: string;
    public status: TransitStatusEnum;
    public containers: FreightContainer[];
    public shipper?: Company;
    private totalShipmentValue?: number = 0;

    constructor() {
        if (!this.containers) {
            console.log("Shipment does not (yet) contain any containers, shipmentValue is 0");            
            return;
        }

        for (let container of this.containers) {
            this.totalShipmentValue += container.transitAgreement.cargoValue;
        }
    }
}

您将在下面找到Contract.submitTransaction() 应该调用而不是CreateCar() 的函数:

public async createShipment(ctx: Context, id: string, status: TransitStatusEnum, shipper: Company, containers?: FreightContainer[]) {
    console.info('============= START : Create Shipment ===========');

    const shipment: Shipment = {
        docType: 'shipment',
        id,
        status,
        containers,
        shipper
    };

    await ctx.stub.putState(id, Buffer.from(JSON.stringify(shipment)));
    console.info('============= END : Create Shipment ===========');
}

我可以为这些自定义类型创建工厂,并根据 string 值而不是传递给 createShipment() 的类型生成类型,或者传递一个字符串化对象(对象/数组,更多的对象/数组)。但我想知道(尤其是后者,这让我不寒而栗)是否真的有必要。 docs 仅提及此 Contract.submitTransaction() 函数作为向区块链提交交易的一种方式。

我应该使用我的工厂解决方案吗?我可以使用其他功能来使用类型提交交易吗?或者这不是我应该构建我的链代码的方式,我应该考虑完全简化它吗?

【问题讨论】:

    标签: typescript hyperledger-fabric blockchain hyperledger


    【解决方案1】:

    Hyperledger Fabric 支持的每种语言的对象都不同。例如,有适用于 JavaScript (Node.js)、Java、Go 和 Python 的 SDK。此外,链码本身可以用 JavaScript、Java 或 Go 编写。

    为了保持语言中立,参数的内部表示只是一个字节数组,它在 Fabric 用于内部通信的 protobuf specification 中定义。 Fabric SDK 也倾向于转换为字符串定义。您唯一的选择是使用字节或字符串。您可以使用自己的自定义解析或更高级的用途,您可以使用某种类型的序列化协议 (see comparison)。但是,您的应用程序和链代码都需要支持它。

    当您需要发送对象时,我建议您为您的情况创建一个链码函数,例如 createShipment,它接受构造对象所需的任意数量的参数。如果对象本身包含对象数组 (FreightContainer),您可以将其注册为对象本身 (createFreightContainer),其中包含 Shipment 的 ID。

    【讨论】:

    • 我问这个问题已经有一段时间了,但你的回答对我有帮助。这是有道理的,为了语言兼容性,应该只向链提交string 值。我也只使用对相关对象的文本引用。以这种方式定义关系有点困难,但我猜它必须这样做。
    • 祝你好运! :)
    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多