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

时间:2018-03-07 04:21:13

标签: hyperledger-fabric hyperledger hyperledger-composer

factory newResource中有一种方法。 此方法的第三个参数是id。是否有任何方法或变通方法可以生成id

3 个答案:

答案 0 :(得分:2)

当您在Resource注册表中创建新资源(无论是AssetRegistry还是ParticipantRegistry等)并依赖于标识资产/参与者的id字段类型时,您可以(确定性地)控制生成id的内容。

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

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

此处,使用电子邮件ID作为资源的标识符,将Grower创建为资源。

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

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

答案 1 :(得分:2)

如果您想自动增加标识符,则会出现类似的问题: Auto Increment field in Composer

开发人员不推荐这样做,因为不同的同行可能已经为不同的新资产/参与者同时计算了ID并且不同意。分歧会迫使所有记录回滚。

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

答案 2 :(得分:1)

这是一个实际问题,而且Hyperledger文档尚不清楚哪种方法正确。

创建新资源时,第三个参数 id 是必填项,如果该交易已经存在另一个具有相同ID的资产,则该交易将被拒绝。那么,如何填充newResource的参数 id

factory.newResource(ns, type, id) 

一种解决方案可能是计算相同类型的资产并生成一个伪增量ID 。但这仅应用于区块链上非常独特的资产。如果您不关心同行拒绝交易,则应使用这种方法。或是拒绝是想要的行为,因为确定性唯一ID 可以像唯一约束一样工作(如sql)。 “计算资产”的一大缺陷是超级账本查询语言无法做到这一点,因此您必须使用 AssetRegistry getAll 方法,然后获取长度数组,无法用于大型数组:

  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的默认值。 无论如何,当我需要一个真实的随机ID时,我会生成一个较长的随机字符串,因此与其他同伴发生冲突的风险会降低。我会让你知道!