如何在 hyperledger composer 链代码中生成新的 Id?

How to generate new Id in hyperledger composer chaincode?

factorynewResource中有一个方法。 这个方法的第三个参数是id。有什么方法或变通方法可以生成 id 吗?

当您在资源注册表中创建新资源(无论是 AssetRegistry 还是 ParticipantRegistry 等)时,您可以控制(确定性地)生成 id 的内容,并且取决于标识 asset/participant 的 id 字段类型.

有关示例,请参见示例网络。例如 Perishables 网络:

https://github.com/hyperledger/composer-sample-networks/blob/v0.16.x/packages/perishable-network/lib/logic.js#L133

在这里,Grower 被创建为资源,使用电子邮件 ID 作为资源的标识符。

在此处查看模型 -> https://github.com/hyperledger/composer-sample-networks/blob/v0.16.x/packages/perishable-network/models/perishable.cto

此处 - Participant Grower 是从通用 Business 参与者扩展而来的,该参与者由电子邮件 ID 标识(因为它从超类型继承了该字段)。

如果你想 auto-increment 标识符,也有类似的问题: Auto Increment field in Composer

开发者不推荐,因为不同的peer可能在同一时间为不同的新assets/participants计算了ID,不同意。分歧将迫使所有记录回滚。

来源:https://github.com/hyperledger/composer/issues/2931

这是一个真正的问题,Hyperledger 文档并不清楚哪种方法是正确的。

当你创建一个新资源时,第三个参数id是强制性的,如果它已经存在另一个资产,则交易被拒绝相同的ID。那么,newResource的参数id怎么填?

factory.newResource(ns, type, id) 

一个解决方案可以是统计相同类型的资产并生成一个伪增量ID。但这应该仅用于区块链上有点独特的资产。如果您不关心同行对交易的拒绝,您应该使用这种方法;或者如果拒绝是想要的行为,因为 确定性唯一 id 可以像 唯一约束 一样工作(如 sql)。 "counting the assets" 的一大缺陷是 hyperledger 查询语言不这样做,所以你必须使用 AssetRegistrygetAll 方法] 然后获取数组的长度,这对于大数组是不可扩展的:

  let bananas_registry = await getAssetRegistry("org.exampleblockchain.Banana");
  let all_bananas = await bananas_registry.getAll();
  let new_banana_id = String(all_bananas.length + 1);

另一种获取唯一 ID 的方法是连接父资产的 ID

但有时我也需要像真正的随机 ID 之类的东西(不是增量的)。我不明白为什么参数 Id 不是默认值。 无论如何,当我需要一个真正的随机 ID 时,我会 生成一个长的随机字符串 这样与其他同行发生冲突的风险就会很低。我会让你知道!