【发布时间】: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