【发布时间】: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