【问题标题】:'Get Unconsumed total From Corda Vault''从 Corda Vault 获取未使用的总数'
【发布时间】:2021-06-09 21:01:50
【问题描述】:

在兑换令牌后,我在获取新总数时遇到了一些问题。例如,如果我创建并发行一个 300 的代币,然后兑换 100 个代币,当我查询未使用的代币时,我希望保险库查询给我 200 的结果。相反,我得到 300。

这是我的代码:

public final class TestFlow {
    private TestFlow() {}

    @Data
    @StartableByRPC
    @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    public static final class FindCurrencyByAccountIdAndCurrencyNameFlow extends FlowLogic < StateAndRef < CurrencyTokenType >> {
        @NonNull
        String accountId;
        @NonNull
        String currencyName;
        Vault.StateStatus vaultStatus;

        @Override
        @Suspendable
        public StateAndRef < CurrencyTokenType > call() throws FlowException {
            val accountService = getServiceHub().cordaService(KeyManagementBackedAccountService.class);
            val account = Objects.requireNonNull(accountService.accountInfo(UUID.fromString(accountId))).getState().getData();
            val anonymousParty = subFlow(new RequestKeyForAccount(account));
            val search = createQuery(account, anonymousParty, vaultStatus);

            return getServiceHub()
                .getVaultService()
                .trackBy(CurrencyTokenType.class, search.getCriteria(), search.getPageSpec(), search.getSorting())
                .getSnapshot()
                .getStates()
                .stream()
                .filter(it - > it.getState().getData().getName().equals(StringUtils.capitalize(currencyName)))
                .findFirst()
                .orElse(null);
        }
    }

    private static SearchQuery createQuery(final AccountInfo account, final AnonymousParty anonymousParty, final Vault.StateStatus vaultStatus) {
        val contractStateTypes = ImmutableSet.of(CurrencyTokenType.class);
        val vaultCriteria = new QueryCriteria.VaultQueryCriteria(vaultStatus, contractStateTypes);

        val linearIds = ImmutableList.of(account.getIdentifier());
        val dealParty = ImmutableList.of(anonymousParty);
        val dealCriteria = new QueryCriteria.LinearStateQueryCriteria(dealParty, null);
        val linearCriteria = new QueryCriteria.LinearStateQueryCriteria(dealParty, linearIds, vaultStatus, null);
        val dealOrLinearIdCriteria = dealCriteria.or(linearCriteria);
        val criteria = dealOrLinearIdCriteria.and(vaultCriteria);

        val pageSpec = new PageSpecification(1, 10);
        val sortByUid = new Sort.SortColumn(new SortAttribute.Standard(Sort.LinearStateAttribute.UUID), Sort.Direction.DESC);
        val sorting = new Sort(ImmutableSet.of(sortByUid));

        return new SearchQuery(criteria, sorting, pageSpec);
    }

    @Data
    @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    private static class SearchQuery {
        @NonNull
        QueryCriteria criteria;
        @NonNull
        Sort sorting;
        @NonNull
        PageSpecification pageSpec;
    }
}

我一定是在文档中遗漏了一些东西,因为我无法弄清楚这一点。任何帮助将不胜感激。

【问题讨论】:

    标签: java blockchain corda


    【解决方案1】:

    仅基于此示例,您可能会有些困惑。

    为了清楚起见,您希望在单独的文件中拥有仅执行查询的代码。交易中的代币更新将在流程完成后完成。也许将您创建的其中一些函数定义为单独的流,这样可以更容易地阐明和分离操作顺序。

    查看 samples-kotlin,了解一些使用令牌的 kotlin 应用示例。

    https://github.com/corda/samples-kotlin/tree/master/Tokens

    具体来说,您需要查看这个令牌被用作支付股息标记的示例,这应该可以帮助您找到问题。

    https://github.com/corda/samples-kotlin/blob/master/Tokens/stockpaydividend/workflows/src/main/kotlin/net/corda/samples/stockpaydividend/flows/PayDividend.kt

    【讨论】:

    • “感谢您的来信。这与使用帐户库有什么关系?这就是我感到困惑的地方”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2018-10-27
    相关资源
    最近更新 更多