如何在 hyperledger composer 链代码中生成新的 Id?
How to generate new Id in hyperledger composer chaincode?
factory
newResource
中有一个方法。
这个方法的第三个参数是id
。有什么方法或变通方法可以生成 id
吗?
当您在资源注册表中创建新资源(无论是 AssetRegistry 还是 ParticipantRegistry 等)时,您可以控制(确定性地)生成 id 的内容,并且取决于标识 asset/participant 的 id 字段类型.
有关示例,请参见示例网络。例如 Perishables 网络:
在这里,Grower 被创建为资源,使用电子邮件 ID 作为资源的标识符。
此处 - Participant Grower
是从通用 Business
参与者扩展而来的,该参与者由电子邮件 ID 标识(因为它从超类型继承了该字段)。
如果你想 auto-increment 标识符,也有类似的问题:
Auto Increment field in Composer
开发者不推荐,因为不同的peer可能在同一时间为不同的新assets/participants计算了ID,不同意。分歧将迫使所有记录回滚。
这是一个真正的问题,Hyperledger 文档并不清楚哪种方法是正确的。
当你创建一个新资源时,第三个参数id是强制性的,如果它已经存在另一个资产,则交易被拒绝相同的ID。那么,newResource的参数id怎么填?
factory.newResource(ns, type, id)
一个解决方案可以是统计相同类型的资产并生成一个伪增量ID。但这应该仅用于区块链上有点独特的资产。如果您不关心同行对交易的拒绝,您应该使用这种方法;或者如果拒绝是想要的行为,因为 确定性唯一 id 可以像 唯一约束 一样工作(如 sql)。 "counting the assets" 的一大缺陷是 hyperledger 查询语言不这样做,所以你必须使用 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 时,我会 生成一个长的随机字符串 这样与其他同行发生冲突的风险就会很低。我会让你知道!
factory
newResource
中有一个方法。
这个方法的第三个参数是id
。有什么方法或变通方法可以生成 id
吗?
当您在资源注册表中创建新资源(无论是 AssetRegistry 还是 ParticipantRegistry 等)时,您可以控制(确定性地)生成 id 的内容,并且取决于标识 asset/participant 的 id 字段类型.
有关示例,请参见示例网络。例如 Perishables 网络:
在这里,Grower 被创建为资源,使用电子邮件 ID 作为资源的标识符。
此处 - Participant Grower
是从通用 Business
参与者扩展而来的,该参与者由电子邮件 ID 标识(因为它从超类型继承了该字段)。
如果你想 auto-increment 标识符,也有类似的问题: Auto Increment field in Composer
开发者不推荐,因为不同的peer可能在同一时间为不同的新assets/participants计算了ID,不同意。分歧将迫使所有记录回滚。
这是一个真正的问题,Hyperledger 文档并不清楚哪种方法是正确的。
当你创建一个新资源时,第三个参数id是强制性的,如果它已经存在另一个资产,则交易被拒绝相同的ID。那么,newResource的参数id怎么填?
factory.newResource(ns, type, id)
一个解决方案可以是统计相同类型的资产并生成一个伪增量ID。但这应该仅用于区块链上有点独特的资产。如果您不关心同行对交易的拒绝,您应该使用这种方法;或者如果拒绝是想要的行为,因为 确定性唯一 id 可以像 唯一约束 一样工作(如 sql)。 "counting the assets" 的一大缺陷是 hyperledger 查询语言不这样做,所以你必须使用 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 时,我会 生成一个长的随机字符串 这样与其他同行发生冲突的风险就会很低。我会让你知道!