Typescript 我可以将对象传递给Hyperledger结构事务吗?
我有一个基于的网络设置。自定义了链码和文件夹结构,所有这些似乎都可以编译并启动。但现在,我正在尝试确定是否可以使用函数Typescript 我可以将对象传递给Hyperledger结构事务吗?,typescript,hyperledger-fabric,blockchain,hyperledger,Typescript,Hyperledger Fabric,Blockchain,Hyperledger,我有一个基于的网络设置。自定义了链码和文件夹结构,所有这些似乎都可以编译并启动。但现在,我正在尝试确定是否可以使用函数Contract.submitTransaction()(在中找到并包含在中)或更适用的函数来传递基于原始示例类型的自定义类型装运的稍微复杂的参数。在本例中,Car只是一个简单的strings平面类型,您可以将其传递到Contract.submitTransaction(),它只接受字符串参数,如下所示: await contract.submitTransaction('cre
Contract.submitTransaction()
(在中找到并包含在中)或更适用的函数来传递基于原始示例类型的自定义类型装运
的稍微复杂的参数。在本例中,Car
只是一个简单的string
s平面类型,您可以将其传递到Contract.submitTransaction()
,它只接受字符串参数,如下所示:
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()
:
我可以为这些自定义类型创建工厂,并根据string
值生成类型,而不是将类型传递给createshipping()
,或者传递一个字符串化对象(对象/数组,更多对象/数组)。但我想知道(尤其是后者,它让我感到寒冷)是否真的有必要。唯一提到此合同的地方是submitTransaction()
功能,它是向区块链提交交易的一种方式
我应该使用我的工厂解决方案吗?我是否可以使用另一个函数来提交使用类型的事务?或者,这不是我应该构造我的链表的方式吗?我应该考虑完全简化它吗?< <强> > /p> < p>对于HyffeDiger-Buffic支持的每种语言,对象都是不同的。例如,有可用于JavaScript(Node.js)、Java、Go和Python的SDK。此外,链码本身可以用JavaScript、Java或Go编写 为了保持语言中立,参数的内部表示形式只是一个字节数组,它是在结构用于内部通信的中定义的。Fabric SDK也倾向于转换为字符串定义。您唯一的选择是使用字节或字符串。您可以使用自己的自定义解析,或者为了更高级的使用,您可以使用某种类型的序列化协议()。但是,应用程序和链代码都需要支持它
当您需要发送对象时,我建议为您的案例创建一个chaincode函数,例如
createshipping
,它可以根据需要接受尽可能多的参数来构造对象。如果对象本身包含一个对象数组(FreightContainer
),您可以将其注册为一个对象本身(createFreightContainer
),该对象本身包含一个装运的ID
我问这个问题已经有一段时间了,但您的回答帮助了我。出于语言兼容性的考虑,应该只向链提交string
值。我也只使用相关对象的文本引用。用这种方式来定义关系有点难,但我想这是必须的。祝你好运!:)
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 ===========');
}