hyperledger fabric totalQueryLimit

hop6·2021년 5월 22일
0

hyperledger fabric를 사용하게 되면 원장에서 state를 가져오는 작업을 필수적으로 하게 된다.
고려해야 될 것이 여러 가지가 있겠지만, 여기서는 totalQueryLimit의 문제에 대해 다루려 한다.

hyperledger fabric의 core.yaml 파일에서 설정할 수 있는 totalQueryLimit의 default 값은 100000 이다.

이는,
GetStateByRange,
GetStateByRangeWithPagination,
GetStateByPartialCompositeKey
와 같이 startKey, endKey를 이용하여 범위에 대한 쿼리를 하는 경우, 해당 조건에 일치하는 데이터가 100000개 이하면 정상적으로 처리 되지만, 그 이상이면 정상적으로 처리가 되지 않는다.

예를들어, 해당 범위 내 데이터를 모두 구하는 작업을 수행하려 하고, 실제 범위 내 데이터 개수가 140000개라면, 내가 이 작업에서 얻을 수 있는 결과 값은 100000개 뿐이다. 이는 큰 문제가 된다.

core.yaml안 totalQueryLimit 값을 늘리면 간단히 해결되지 않을까 생각이 들 수 있으나, 우발적, 악의적인 요청으로 수 많은 쿼리 요청이 들어온다면 블록체인 네트워크에 좋지 않은 영향을 끼칠 수 있다.
(실제로는 transaction time out이 30초이기 때문에 totalQueryLimit을 늘리더라도, 크게 악영향을 끼칠 것 같지는 않다. 단, 30초가 넘어가면 요청이 거절되고, 원하는 데이터를 받을 수 없어 문제 해결이 되진 않는다.)

해결 방법

  1. 범위 내 데이터를 전부 요청하는 GetStateByRange, GetStateByPartialCompositeKey는 지양하고, Pagination 사용을 지향한다.
  2. 해당 범위 내 데이터가 totalQueryLimit보다 클 경우, totalQueryLimit 크기 만큼씩 Pagination 하여 받아주어야 한다.
getStateByRangeWitPagination 리턴값인 meta를 이용하면 된다.
meta.GetBookmark(), meta.GetFetchedRecordsCount() ...

2021-10-10 추가 ) Pagination 예제

0개의 댓글