Избыточные метаданные при получении всех состояний в хранилище Test Corda - PullRequest
0 голосов
/ 06 апреля 2019

Я тестирую Corda 4 Cordapp и настраиваю весенний веб-сервер, чтобы совершать вызовы API для моих cordapps.У меня есть один API под названием `` `get-all-contract1-states``", который делает именно то, что говорит.Он получает все мои контрактные состояния в хранилище.

Когда я вызываю эту функцию, она возвращает состояния, но также возвращает чрезмерное количество повторяющихся метаданных, делая вывод для 1 состояния длиной более 600 тыс. Строк.

@GetMapping(value = "/get-contract1-states", produces = arrayOf(MediaType.APPLICATION_JSON_VALUE))
fun getContract1s()  = rpcOps.vaultQueryBy(criteria = VaultQueryCriteria(status = Vault.StateStatus.ALL), paging = PageSpecification(DEFAULT_PAGE_NUM, 200), sorting = Sort(emptySet()), contractStateType = contract1State::class.java).states

Большинство изповторяющиеся метаданные (которые составляют около 85% от 600 тыс. строк) находятся в конце Json относительно "zero":false,"one":false,"fieldSize":256,"fieldName":"SecP256R1Field".Существуют ли какие-либо флаги, варианты или просто любой способ вернуть чистую версию контракта без такого большого количества лишних данных.Я забочусь только о переменных из контракта, не более того.

1 Ответ

0 голосов
/ 08 апреля 2019

То, что у вас есть, вернет вам коллекцию:

data class Page<out T : ContractState>(val states: List<StateAndRef<T>>,
                                           val statesMetadata: List<StateMetadata>,
                                           val totalStatesAvailable: Long,
                                           val stateTypes: StateStatus,
                                           val otherResults: List<Any>)

Следовательно, почему вы получаете все метаданные. В этом объекте данных вам нужны состояния (которые на самом деле возвращают StateAndRef), а затем просто состояние внутри каждого из них.

Следующий код должен получить то, что вы ищете:

@GetMapping(value = "/get-contract1-states", produces = arrayOf(MediaType.APPLICATION_JSON_VALUE))
        fun getContract1s()  = proxy.vaultQueryBy(criteria = QueryCriteria.VaultQueryCriteria(status =
        Vault.StateStatus.ALL), paging = PageSpecification(DEFAULT_PAGE_NUM, 200),
                sorting = Sort(emptySet()), contractStateType = IOUState::class.java).states.map { it.state.data }

Примечание: ключевой бит здесь соответствует state.data

...