Как сделать, чтобы запрос хранилища Corda возвращал сумму или сумму токенов - PullRequest
0 голосов
/ 23 апреля 2020

При использовании SDK для учетной записи и токена - у меня есть следующая функция, которая берет учетную запись и идентификатор токена и возвращает любые токены, которые есть у данной учетной записи (имя токена и сумма).

Как сделать так, чтобы запрос хранилища возвращал сумму значений токена?

fun getTokenBy(
        serviceHub: ServiceHub,
        account: AccountInfo,
        tokenId: String,
        status: Vault.StateStatus
    ): List<StateAndRef<FungibleToken>> {
        val issuerParty =
            serviceHub.identityService.partiesFromName(Constants.MASTER_NODE_NAME, false).first()
        val token = Token.getInstance(tokenId)

        val issuerCriteria = QueryCriteria.VaultCustomQueryCriteria(builder {
            PersistentFungibleToken::issuer.equal(issuerParty)
        }, status)

        val tokenClassCriteria = QueryCriteria.VaultCustomQueryCriteria(builder {
            PersistentFungibleToken::tokenClass.equal(token.tokenClass)
        }, status)

        val tokenIdentifierCriteria = QueryCriteria.VaultCustomQueryCriteria(builder {
            PersistentFungibleToken::tokenIdentifier.equal(token.tokenIdentifier)
        }, status)

        val accountCriteria = QueryCriteria.VaultQueryCriteria(
            status = status,
            externalIds = listOf(account.identifier.id)
        )

        val criteria = issuerCriteria.and(tokenClassCriteria).and(tokenIdentifierCriteria).and(accountCriteria)
        return serviceHub.vaultService.queryBy<FungibleToken>(criteria = criteria).states
    }

1 Ответ

0 голосов
/ 24 апреля 2020

Я предполагаю, что вы пытаетесь рассчитать остаток на определенном счете.

  1. Ваш метод не практичен и может фактически взломать sh ваш узел; представьте, было ли на счете 10000 токенов; Вы запрашиваете хранилище, вы получаете 10 000 токенов в наборе результатов, вы через них oop (200 записей на странице) и вычисляете сумму в цикле.
  2. Вместо этого вы должны делегировать эту операцию базе данных, то есть вы должны написать запрос на Corda, который будет выглядеть примерно так:
    select sum(quantity) 
    from fungible_token 
    where token_type = 'USD' and issuer = 'US Mint' and holder = 'd3t0x';
    
  3. Приведенный выше запрос всегда будет возвращать 1 строка, вместо того, чтобы получить 10000 строк.
  4. Для достижения вышеуказанного вы можете использовать функции, которые поставляются с QueryUtilities (часть SDK).
  5. Ниже мое решение:
// Query vault for balance.
QueryCriteria heldByAccount = new QueryCriteria.VaultQueryCriteria().withExternalIds(
                                 Collections.singletonList(accountInfo.getIdentifier()
                                                                              .getId()));
QueryCriteria queryCriteria = QueryUtilitiesKt
  // Specify token type and issuer.
  .tokenAmountWithIssuerCriteria(tokenType, issuer)
  // Specify account.
  .and(heldByAccount)
  // Group by token type and aggregate.
  .and(QueryUtilitiesKt.sumTokenCriteria());

Vault.Page<FungibleToken> results = proxy.vaultQueryByCriteria(queryCriteria, 
                                                             FungibleToken.class);
Amount<TokenType> totalBalance = QueryUtilitiesKt.rowsToAmount(tokenType, results);
У меня есть несколько полезных советов в моей статье о Tokens SDK.
...