Чрезмерные метаданные при получении всех состояний в хранилище Test Corda

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

Когда я вызываю эту функцию, она возвращает состояния, но также возвращает чрезмерное количество повторяющихся метаданных, что делает вывод для 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". Есть ли какие-то флаги, опции или просто способ вернуть чистую версию контракта без лишних данных. Меня интересуют только переменные из контракта, не более того.

0
0
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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 }

Примечание: ключевым битом здесь является сопоставление с состояние.данные.

Другие вопросы по теме