当前位置: 首页 > 知识库问答 >
问题:

我可以将对象传递给Hyperledger Fabric事务吗?

咸利
2023-03-14
await contract.submitTransaction('createCar', 'CAR12', 'Honda', 'Accord', 'Black', 'Tom');
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()的类型,或者传递一个字符串化的对象(对象/数组、更多的对象/数组)。但我想知道(尤其是后者,它让我发冷)是否真的有必要。文档只提到这个contract.submittransaction()函数,作为向区块链提交事务的一种方式。

我应该用我的工厂解决方案吗?是否有另一个函数,我可以使用它来提交使用类型的事务?或者这不是我应该构造我的链码的方式,我应该考虑完全简化它吗?

共有1个答案

韩照
2023-03-14

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

为了保持语言中立,参数的内部表示只是一个字节数组,这是在protobuf规范中定义的,Fabric用于内部通信。Fabric SDK还倾向于折腾到字符串定义的转换。您唯一的选择是使用字节或字符串。您可以使用自己的自定义解析,或者为了更高级的使用,可以使用某种类型的序列化协议(请参见比较)。但是,您的应用程序和chaincode都需要支持它。

当您需要发送对象时,我建议为您的情况创建一个chaincode函数,如createShipment,它接受构造对象所需的参数。如果对象本身包含一个对象数组(FreightContainer),则可以将其注册为一个对象(CreateFreightContainer),该对象本身包含货件的ID。

 类似资料:
  • 问题内容: 我正在使用Jest和Enzyme来测试React复选框组件。 这是我的测试: 但是在运行测试时出现此错误: 这是我的组件的输入: 我 想 那我需要通过一个事件作为第二个对象,但我不知道如何做到这一点。 谢谢 问题答案: 函数采用其他参数,这些参数将传递给事件处理程序。您可以嘲笑事件。例如:

  • 我正在创建一个象棋引擎。我有一个接口,Rook,Bishop等。实现了这个类。我的电路板是一块[]阵列。假设白人球员想移动他的主教。我将目标的坐标和棋盘引用传递给bishop。Bishop检查,如果目的地在同一对角线上,那么它会询问董事会,在他的位置和目的地方块之间是否没有任何碎片。从面向对象的角度来看,这样做可以吗?非常感谢。

  • 问题内容: 我在php中有对象,每个对象代表一个“项目”以及与之相关的所有信息。 当用户浏览页面时,这些对象应传递给javascript。理想情况下,镜像相同的结构,因此我可以使用Raphael在我的网站上将每个项目及其信息显示为单独的形状。 但是,如何将对象从php转换为javascript? 问题答案: 您可以将PHP对象转换为数组,然后使用JSON函数对其进行编码。之后,从JavaScrip

  • 问题内容: 这里有角的新手。我试图找出将对象传递给指令时出了什么问题。 这是我的指令: 这是我调用指令的模板: 是一组对象。 当我运行此,日志,而日志罚款的范围,甚至有一个与所有的数据,我找孩子。 我不确定我在这里做错了什么,因为这种确切的方法以前对我有用。 编辑: 我已经用所有必需的代码创建了一个插件:http ://plnkr.co/edit/uJCxrG 如您所见,该作用域在范围中可用,但我

  • 问题内容: 我正在将一个对象传递给我的控制器,如下所示: 我的控制器将其视为它正在寻找的对象: 我的问题是我只想再传递一个字符串。我知道我可以制作特定于视图的模型,但我想知道是否可以执行以下操作: 我没有运气就尝试了以下方法: 但是复杂对象只是作为null来的。有没有办法我也可以传递对象和字符串? 问题答案: 尝试将字符串项添加到已有的JSON中。不要对其进行字符串化,否则它将发送一个大字符串,您

  • 问题内容: 我试图找到可以传递给标签属性的所有可能值的列表。 我知道我也可以从.js文件中传递函数名,但是我只需要JSF附带的函数名即可。 我只知道单击鼠标悬停和键入,但是我敢肯定还有更多。只是不知道在哪里可以找到它们。 问题答案: 的属性 至少可以保存HTML J组件所生成的HTML元素的所有受支持的DOM事件。一种简单的查找方法是检查JSF标记库文档中感兴趣的JSF输入组件的所有属性,然后删除