通常,如果执行返回超过200个结果的vault查询,则需要提供
PageSpecification
定义如何返回结果。这是为了防止返回太多结果时出现内存溢出错误。下面是使用
:
val vaultSnapshot = serviceHub.vaultService.queryBy<ContractState>(
criteria = VaultQueryCriteria(UNCONSUMED),
paging = PageSpecification(DEFAULT_PAGE_NUM, 200))
FinalityFlow
呼叫
NodeVaultService.loadStates
,这就是抛出错误的地方。从Corda 3.2开始,
NodeVaultService.loadStates
不做任何事情来阻止它一次请求超过200个结果,从而导致抛出分页错误。这件事已经解决了
master
private fun loadStates(refs: Collection<StateRef>): Collection<StateAndRef<ContractState>> {
val states = mutableListOf<StateAndRef<ContractState>>()
if (refs.isNotEmpty()) {
val refsList = refs.toList()
val pageSize = PageSpecification().pageSize
(0..(refsList.size - 1) / pageSize).forEach {
val offset = it * pageSize
val limit = minOf(offset + pageSize, refsList.size)
val page = queryBy<ContractState>(QueryCriteria.VaultQueryCriteria(stateRefs = refsList.subList(offset, limit))).states
states.addAll(page)
}
}
return states
}