Corda Accounts and Tokens - 如何在列表中取得平衡

Corda Accounts and Tokens - How to get balance in list

我可以分别恢复每个账户的代币余额。 通过这两种方法,它可以单独恢复余额:

方法一

val heldByAccount = QueryCriteria.VaultQueryCriteria().withExternalIds(accountId)
val queryCriteria = tokenAmountWithIssuerCriteria(myTokenType, issuer)
        .and(heldByAccount)
        .and(sumTokenCriteria())
val results = serviceHub.vaultService.queryBy(
        contractStateType = FungibleToken::class.java,
        criteria = queryCriteria)
val tokenbalance = rowsToAmount(myTokenType, results)

方法二

val sumAmount = builder { PersistentFungibleToken::amount.sum() }
val sumAmountCriteria = QueryCriteria.VaultCustomQueryCriteria(sumAmount)
val heldByAccount = QueryCriteria.VaultQueryCriteria().withExternalIds(accountId)

val sumAmountFromDB = serviceHub.vaultService.queryBy(
        contractStateType = FungibleToken::class.java,
        criteria = heldByAccount.and(sumAmountCriteria)
).otherResults

在我的场景中,我需要多次恢复多个帐户的余额,单独执行很慢。 是否可以通过按帐户对余额进行分组来在单个查询中恢复帐户列表的余额?

我尝试在 PersistentFungibleToken::holder 列中使用 groupByColumns,但没有用。

在下面的 link 中有一种通过查询银行恢复余额的方法。 https://www.corda.net/blog/cordas-accounts-tokens-making-blockchain-more-inclusive/

我 运行 在我的数据库上执行下面的查询,它确实恢复了余额。有谁知道这是否是从帐户列表中恢复余额的唯一方法?

select ACCOUNTS.IDENTIFIER, sum(FUNGIBLE_TOKEN.AMOUNT)
from VAULT_STATES, FUNGIBLE_TOKEN, STATE_PARTY, PK_HASH_TO_EXT_ID_MAP, ACCOUNTS
where VAULT_STATES.TRANSACTION_ID = FUNGIBLE_TOKEN.TRANSACTION_ID
and VAULT_STATES.OUTPUT_INDEX = FUNGIBLE_TOKEN.OUTPUT_INDEX
and VAULT_STATES.TRANSACTION_ID = STATE_PARTY.TRANSACTION_ID
and VAULT_STATES.OUTPUT_INDEX = STATE_PARTY.OUTPUT_INDEX
and PK_HASH_TO_EXT_ID_MAP.PUBLIC_KEY_HASH = STATE_PARTY.PUBLIC_KEY_HASH
and ACCOUNTS.IDENTIFIER::text = PK_HASH_TO_EXT_ID_MAP.EXTERNAL_ID
group by ACCOUNTS.IDENTIFIER

我找到了一个解决方案,我不知道它是最优雅的还是最高效的,但它比绑定到数据库结构要好,也比在数据库中用 SUM 进行多次查询要好。

我使用所需帐户的 externalIds 创建了 FungibleTokenvaultquery。此查询 returns 所请求帐户的所有状态/代币,我正在研究答案。

我按持有者对每个状态/令牌进行分组,按 holder.owningKey 检索 accountInfo 并增加 amount.quantity。也就是我手动算的。

我相信这是一个满足我需要的简单解决方案。