Warm tip: This article is reproduced from serverfault.com, please click

Corda Accounts and Tokens-如何在清单中取得平衡

(Corda Accounts and Tokens - How to get balance in list)

发布于 2020-12-02 02:04:05

我可以分别收回每个帐户的代币余额。通过这两种方法,可以算出分别回收余额的方法:

方法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
Questioner
Marcos Pupo
Viewed
0
Marcos Pupo 2020-12-11 21:32:29

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

我做了一个vaultqueryFungibleToken外部ID所需的帐户。该查询返回所请求帐户的所有状态/令牌,我在研究答案。

我按持有人对每个州/令牌进行了分组,并通过holder.owningKey检索了accountInfo并增加了amount.quantity。也就是说,我手动进行了总和。

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