Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
州';Corda中的唯一标识_Corda - Fatal编程技术网

州';Corda中的唯一标识

州';Corda中的唯一标识,corda,Corda,我想在数据库中创建具有唯一id的状态。这是我的州代码 data class SampleState( val partyA: Party, val partyB: Party, val value: Int, val id: String, override val linearId: UniqueIdentifier = UniqueIdentifier(id), val properties: LCProperties = LCProperti

我想在数据库中创建具有唯一id的状态。这是我的州代码

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”是唯一的? 我在流和合同中使用了相同的代码,比如

  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")
val results=builder{
val quantityIndex=SampleSchemaV1.PersistentSample::id.equal(id);
val customCriteria1=QueryCriteria.VaultCustomQueryCriteria(quantityIndex)
val标准=一般标准和(客户标准1);
serviceHub.vaultService.queryBy(标准)
}
if(results.states.count()>0)
抛出IllegalArgumentException(“id$id存在”)

但是,即使在1s内(提交事务1,1秒后提交事务2),它也不能在几乎相似的时间内处理两个提交示例状态事务。

在状态代码中,它是这样的:

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()
数据类唯一标识符(val-externalId:String?=null,val-id:UUID=UUID.randomUUID()):可比{
重写fun-toString():String=if(externalId!=null)${externalId}\u$id“else-id.toString()
这是一篇关于Java的randomUUID在确保id唯一性方面有多好的文章


您还可以阅读有关UniqueIdentifier的更多信息

因此,在Corda中,无论如何都有办法确保数据库中存储两个相似的状态?例如,在上面的示例代码中,我不想存储两个具有相似PartyA、PartyB、value和id的样本状态。您能给它们相同的外部id吗?它们的id仍然是唯一的,但您需要ld能够基于相同的外部ID进行查询。@CaisManai即使您将相同的UUID传递给两个不同的线性ID状态,Corda也没有强制执行这些状态唯一性的约束,这意味着您可以在vault中拥有多个未使用状态,所有状态都具有相同的类型和线性ID。