Corda中的州唯一标识

4

我想在数据库中创建具有唯一标识的状态。以下是我的状态代码:

data class SampleState(
    val partyA: Party,
    val partyB: Party,
    val value: Int,
    val id: String,
    override val linearId: UniqueIdentifier = UniqueIdentifier(id),
    val properties: LCProperties = LCProperties("ABC"))    : LinearState {...}

当我提交两个类似的SampleState时,数据库中会有两个不同的状态和两个不同的linearId。因此,有人可以告诉我如何确保数据库中的SampleState对象的“id”是唯一的吗?我在Flows和Contracts中使用了相同的代码来捕获这种情况。
  val results = builder {

        val quantityIndex = SampleSchemaV1.PersistentSample::id.equal(id);

        val customCriteria1 = QueryCriteria.VaultCustomQueryCriteria(quantityIndex)

        val criteria = generalCriteria.and(customCriteria1);

        serviceHub.vaultService.queryBy<SampleState>(criteria)
    }
    if(results.states.count() > 0)
        throw IllegalArgumentException("id $id is exist")

然而,即使在1秒内(提交事务1后1秒钟),也无法处理两个几乎相似的提交状态事务(commit Sample State Transaction)。

1个回答

0
在你的状态代码中,这是这一行:
override val linearId: UniqueIdentifier = UniqueIdentifier(id)

这将为您创建一个唯一的ID。您传递到UniqueIdentifier中的id将绑定生成的唯一ID到您的id。但是所有的相等性和比较都基于唯一ID。

查看源代码中的UniqueIdentifier.kt,您会看到这是底层代码:

data class UniqueIdentifier(val externalId: String? = null, val id: UUID = UUID.randomUUID()) : Comparable<UniqueIdentifier> {
    override fun toString(): String = if (externalId != null) "${externalId}_$id" else id.toString()

这篇文章讲述了Java的randomUUID有多好,保证id的唯一性。

你还可以在这里了解更多关于UniqueIdentifier的内容。


在 Corda 中,有没有办法确保两个相似的状态被存储在数据库中?例如,在我上面的示例代码中,我不想存储具有相似 PartyA、PartyB、value 和 id 的两个 SampleStates。 - Henry
你能给它们相同的外部ID吗?它们的ID仍然是唯一的,但你可以基于这个相同的外部ID进行查询。 - Cais Manai
1
@CaisManai 即使您将相同的 UUID 传递给两个不同的线性 ID 状态,Corda 没有强制执行这些唯一性的约束,这意味着您可以在保险库中拥有多个未使用的状态,所有这些状态都具有相同的类型和线性 ID。 - Matthew Layton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接