factory
newResource
中有一种方法。
此方法的第三个参数是id
。是否有任何方法或变通方法可以生成id
?
答案 0 :(得分:2)
当您在Resource注册表中创建新资源(无论是AssetRegistry还是ParticipantRegistry等)并依赖于标识资产/参与者的id字段类型时,您可以(确定性地)控制生成id的内容。
有关示例,请参阅示例网络。例如Perishables网络:
此处,使用电子邮件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并且不同意。分歧会迫使所有记录回滚。
答案 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时,我会生成一个较长的随机字符串,因此与其他同伴发生冲突的风险会降低。我会让你知道!