我可以分别收回每个帐户的代币余额。通过这两种方法,可以算出分别回收余额的方法:
方法1
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)
方法2
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,但是它不起作用。
在下面的链接中,有一种方法可以通过在银行查询来恢复余额。 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进行多个查询要好。
我做了一个vaultquery的FungibleToken与外部ID所需的帐户。该查询返回所请求帐户的所有状态/令牌,我在研究答案。
我按持有人对每个州/令牌进行了分组,并通过holder.owningKey检索了accountInfo并增加了amount.quantity。也就是说,我手动进行了总和。
我相信这是满足我需求的简单解决方案。