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因为:

这是为了支持 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 的构造函数同时具有 externalIdid:

data class UniqueIdentifier
   constructor(val externalId: String? = null, val id: UUID = UUID.randomUUID())

因此,实际上,如果确实引入了 externalId 来支持帐户查询,那么金库查询实际上使用的是 UniqueIdentifier.id of AccountInfo 而不是它的 externalId(假设没有人创建 AccountInfo 手动覆盖 CreateAccount() 函数,正如我怀疑的那样)。