Получение информации с помощью linearId (простой запрос к узлу Corda) - PullRequest
0 голосов
/ 11 июня 2018

Мы создаем базовый пример PoC с помощью Corda.Прямо сейчас у нас есть основной Cordapp, который отправляет сообщение String с одного узла на другой.

Это работает нормально, но следующие шаги - извлечь одно сообщение с использованием API.

У нас есть этот путь квосстановить все, но нам нужен только один.

@GET
@Path("cases")
@Produces(MediaType.APPLICATION_JSON)
public List<StateAndRef<CaseState>> getCases();
    return rpcOps.vaultQuery(CaseState.class).getStates();
}

Мы уже пробовали вот так:

@GET
@Path("cases/{caseId}")
@Produces(MediaType.APPLICATION_JSON)
public StateAndRef<CaseState> getCase(@PathParam("caseId") String caseId) throws InterruptedException, ExecutionException  {

    UniqueIdentifier id = new UniqueIdentifier.fromString("caseId");
    QueryCriteria criteria = new QueryCriteria.LinearStateQueryCriteria(null, InmutableList.of(id), Vault.StateStatus.UNCONSUMED, null);
    return rpcOps.vaultQueryBy(CaseState.class).queryBy(criteria).getStates().get(0);

}

Можете ли вы помочь мне?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Попытка восстановить UniqueIdentifier из externalId не будет работать, так как вы не знаете, что такое UUID.

Полный конструктор для LinearStateQueryCriteria:

data class LinearStateQueryCriteria @JvmOverloads constructor(
    val participants: List<AbstractParty>? = null,
    val uuid: List<UUID>? = null,
    val externalId: List<String>? = null,
    override val status: Vault.StateStatus = Vault.StateStatus.UNCONSUMED,
    override val contractStateTypes: Set<Class<out ContractState>>? = null)

Таким образом, вам нужно использовать полный конструктор и запросить хранилище, используя следующие критерии:

QueryCriteria criteria = new QueryCriteria.LinearStateQueryCriteria(
        null, 
        null, 
        ImmutableList.of("caseId"), 
        Vault.StateStatus.UNCONSUMED, 
        null);

Обратите внимание, что здесь мы не указываем UUID, но мыуказав externalId.

0 голосов
/ 12 июня 2018

Я сделал это в моих Cordapps, выполняя запросы к неизрасходованным состояниям требуемого типа, а затем просто фильтруя возвращаемый результат, чтобы получить то, что нужно.Например, ниже приведен пример фильтрации состояния учетной записи по linearID (как требуется в вашем примере)

    //Query the vault for unconsumed states and then for account states
    val criteria = QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.UNCONSUMED)
    val customerStates = serviceHub.vaultService.queryBy<Account.State>(criteria)
    //Filter the customer states to find a matching linearId
    val filteredStates = customerStates.states.filter {
        it.state.data.linearId == linearId
    }

Надеюсь, это поможет!

...