Corda - externalIds 的 CommonQueryCriteria 用途 属性
Corda - CommonQueryCriteria purpose of externalIds property
Corda 保险库 API 包含一个名为 CommonQueryCriteria 的 class,其实现方式如下:
abstract class CommonQueryCriteria : QueryCriteria() {
abstract val status: Vault.StateStatus
open val relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL
open val constraintTypes: Set<Vault.ConstraintInfo.Type> = emptySet()
open val constraints: Set<Vault.ConstraintInfo> = emptySet()
open val participants: List<AbstractParty>? = null
abstract val contractStateTypes: Set<Class<out ContractState>>?
open val externalIds: List<UUID> = emptyList()
open val exactParticipants: List<AbstractParty>? = null
override fun visit(parser: IQueryCriteriaParser): Collection<Predicate> {
return parser.parseCriteria(this)
}
}
externalIds
属性的目的是什么?
注:这肯定不能映射UniqueIdentifier.externalId
因为:
- 存在类型不匹配(
UUID
与 String?
)。
LinearStateQueryCriteria
存在以通过 linearId
或 externalId
. 查询状态
这是为了支持 Corda 4.3 中的帐户查询而引入的:
https://github.com/corda/accounts/blob/master/docs.md#querying-the-vault-by-account
Vault Query 文档在讨论拥有密钥时在页面底部提到了这个新属性:
https://docs.corda.net/docs/corda-os/4.8/api-vault-query.html#mapping-owning-keys-to-external-ids
不可否认,它不是很清楚,应该参考 CommonQueryCriteria
(而不是 VaultQueryCriteria
)并给出一个例子。
不过,如果我们查看帐户库提供的 CreateAccount 流程,AccountInfo
是使用 UniqueIdentifier
创建的,只有 id
:
val newAccountInfo = AccountInfo(
name = name,
host = ourIdentity,
identifier = UniqueIdentifier(id = identifier)
)
而 UniqueIdentifier
的构造函数同时具有 externalId
和 id
:
data class UniqueIdentifier
constructor(val externalId: String? = null, val id: UUID = UUID.randomUUID())
因此,实际上,如果确实引入了 externalId 来支持帐户查询,那么金库查询实际上使用的是 UniqueIdentifier.id
of AccountInfo
而不是它的 externalId
(假设没有人创建 AccountInfo
手动覆盖 CreateAccount()
函数,正如我怀疑的那样)。
Corda 保险库 API 包含一个名为 CommonQueryCriteria 的 class,其实现方式如下:
abstract class CommonQueryCriteria : QueryCriteria() {
abstract val status: Vault.StateStatus
open val relevancyStatus: Vault.RelevancyStatus = Vault.RelevancyStatus.ALL
open val constraintTypes: Set<Vault.ConstraintInfo.Type> = emptySet()
open val constraints: Set<Vault.ConstraintInfo> = emptySet()
open val participants: List<AbstractParty>? = null
abstract val contractStateTypes: Set<Class<out ContractState>>?
open val externalIds: List<UUID> = emptyList()
open val exactParticipants: List<AbstractParty>? = null
override fun visit(parser: IQueryCriteriaParser): Collection<Predicate> {
return parser.parseCriteria(this)
}
}
externalIds
属性的目的是什么?
注:这肯定不能映射UniqueIdentifier.externalId
因为:
- 存在类型不匹配(
UUID
与String?
)。 LinearStateQueryCriteria
存在以通过linearId
或externalId
. 查询状态
这是为了支持 Corda 4.3 中的帐户查询而引入的: https://github.com/corda/accounts/blob/master/docs.md#querying-the-vault-by-account
Vault Query 文档在讨论拥有密钥时在页面底部提到了这个新属性: https://docs.corda.net/docs/corda-os/4.8/api-vault-query.html#mapping-owning-keys-to-external-ids
不可否认,它不是很清楚,应该参考 CommonQueryCriteria
(而不是 VaultQueryCriteria
)并给出一个例子。
不过,如果我们查看帐户库提供的 CreateAccount 流程,AccountInfo
是使用 UniqueIdentifier
创建的,只有 id
:
val newAccountInfo = AccountInfo(
name = name,
host = ourIdentity,
identifier = UniqueIdentifier(id = identifier)
)
而 UniqueIdentifier
的构造函数同时具有 externalId
和 id
:
data class UniqueIdentifier
constructor(val externalId: String? = null, val id: UUID = UUID.randomUUID())
因此,实际上,如果确实引入了 externalId 来支持帐户查询,那么金库查询实际上使用的是 UniqueIdentifier.id
of AccountInfo
而不是它的 externalId
(假设没有人创建 AccountInfo
手动覆盖 CreateAccount()
函数,正如我怀疑的那样)。