# Hyperledger Caliper

## Intro

Hyperledger Caliper는 미리 정의된 Use Case로 다양한 블록체인 솔루션을 테스트하고 일련의 성능 테스트 결과를 얻을 수 있는 블록체인 성능 벤치 마크 프레임 워크를 의미한다.&#x20;

* 지원해 주고 있는 하이퍼레저 계열 솔루션(프로젝트): Fabric , Sawtooth, iroha, composer, burrow, besu

![Supported project list](https://2837883091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL3wrd9YkzoOQE1asZU%2F-M0R-CL4I6BsDnrCw3G0%2F-M0R-veuA6MELREq88uV%2FUntitled.png?alt=media\&token=b9960464-6b49-47d4-990a-886e7ca234c4)

성능 측정 대상이 되는 솔루션과 측정 지표에 대해서 개발자가 직접적으로 추가 가능하도록 구현되어 있으며, 차후 버전이 업데이트되면 지원되는 프로젝트와 측정 지표가 추가될 것으로 예상된다.

## 지원하는 측정 지표

* 성공률(Success rate)
* 트랜잭션/읽기 처리량(Transaction/Read throughput)
  * 트랜잭션 처리량 = Total committed transactions / Total time in seconds @ #committed nodes
    * 커밋된 총 트랜잭션 수 = (총 트랜잭션 수 - 유효하지 않은 총 트랜잭션 수)
  * 읽기 처리량(RPS, reads per second): 읽기 및 쿼리 기능 처리 수/초
* 트랜잭션/읽기 대기 시간(Transaction/Read latency(minimum, maximum, average, percentile))
  * 트랜잭션 대기 시간 = (Confirmation time @ network threshold) – submitting time
    * 블록체인을 구성하는 모든 노드에서 측정되어야 하며, 평균 및 표준 편차를 계산하여 제공할 수 있어야 함
  * 읽기 대기 시간 = Read Response Time - Read Request Time
* 리소스 소비: CPU, Memory, Network IO,…..

> 성능 측정 지표에 대한 연구는 PSWG([Hyperledger Performance and Scale Working Group](https://wiki.hyperledger.org/groups/pswg/performance-and-scale-wg))에서 맡고 있으며, 더 자세한 내용은 <https://www.hyperledger.org/wp-content/uploads/2018/10/HL_Whitepaper_Metrics_PDF_V1.01.pdf>  에서 확인할 수 있다.

## 프로젝트 구조

Hyperledger Caliper는 Benchmark Layer, Interface & Core Layer, Adaptation Layer 3가지 layer로 구성되어 있다.

![Structure of Hyperledger Caliper](https://2837883091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL3wrd9YkzoOQE1asZU%2F-M0R6i5ojYPuLEGuqlhb%2F-M0R7fR2WXSKj1x_9AwK%2FUntitled1.png?alt=media\&token=f1009028-7943-4d9b-a0b2-2948036039b2)

1. Benchmark Layer: 블록체인에 대해 구현된 테스트 케이스 + Benchmark Engine
   * 각 테스트에는 백엔드 블록체인 네트워크와 테스트를 정의하는 구성 파일이 있으며, 이 테스트는 블록체인 시스템의 성능을 테스트하는데 직접적으로 사용됨
   * 개발자가 프레임워크를 이해하고 자체 테스트를 신속하게 구현할 수 있도록 기본 벤치마크 엔진이 구현되어 있음
2. Interface & Core Layer: 성능 측정 도구 내 핵심 기능과 NBI를 지원하는 계층&#x20;
   * 블록체인 운영 인터페이스 (Blockchain NBI) : 스마트 컨트랙트 배포, 호출, 원장으로부터 쿼리 상태를 가져오는 등의 기능을 수행
   * 리소스 모니터 : CPU, 메모리, 네트워크 I/O 등 백엔드 블록체인 시스템의 리소스 소비 상태 조회
   * 성능 분석기 : 블록체인 NBI를 호출하는 동안 기록한 성능 측정 결과를 출력
   * 보고서 생성기 : HTML 형식의 테스트 보고서를 생성
3. Adaptation Layer: 측정 대상이 되는 다양한 블록체인 솔루션을 Caliper 프레임워크에 맞게 통합/변환해주는 계층
   * Adapter는 Caliper NBI를 측정 대상 블록체인 솔루션에 따라 변환해주는 역할을 수행하는데 SUT(BlockChain System Under Test)마다 구현되며 해당 블록체인이 사용하는 기본 SDK 또는 RESTFUL API를 사용함

### Caliper Benchmark Engine

#### **Master**

1. 초기화 : 이 단계에서 마스터는 블록체인 구성 파일을 사용하여 내부 블록체인 개체를 만들고 초기화하며 구성에 지정된 스마트 컨트랙트(체인코드)를 배포하고 블록체인 시스템 리소스를 모니터링
2. 테스트 : 마스터는 벤치 마크 구성 파일에 따라 테스트를 수행(스케줄에 따라 반복 수행). 작업은 정의된 작업 부하에 따라 생성되고 클라이언트에 할당
3. 보고 : 각 테스트 라운드의 진행에 따른 성능 측정 결과가 HTML 형식의 보고서로 자동 생성

#### **Clients**

* Local Client
  * Workload는 분할되어 하위 프로세스에 똑같이 할당되고 하위 프로세스는 일시적으로 생성된 컨텍스트를 사용하여 블록체인 클라이언트 역할을 수행, 블록체인 시스템과 상호작용
* Zookeeper: 여러개의 Zookeeper 클라이언트가 독립적으로 시작되어 테스트 작업을 수행

{% hint style="info" %}
v0.2.0부터 zookeeper client는 사용하지 않음\
&#x20;(<https://github.com/hyperledger/caliper/releases/tag/v0.2.0?fbclid=IwAR0lPbKlwGCPdBk6PTdrUtkaYaWHQsyuAcUP9VkjkkC9D-aSf4sSHY7Lexk>)
{% endhint %}

**사용자 정의 테스트 모듈(User Defined Test Module)**

1. init(): 벤치 마크 구성파일에서 읽은 사용자 정의 인수 뿐만 아니라 주어진 블록체인 객체 및 컨텍스트로 각 테스트 라운드가 시작될 때 클라이언트에 의해 호출되는 기능
2. run(): 스마트 컨트랙트가 호출되어 트랜잭션이 생성되고 Caliper의 API에 따라 성능 측정을 수행
3. end(): 각 테스트 라운드가 끝날 때 마다 호출하는 함수. 테스트에 따른 리소스 및 컨텍스트 해제

## Reference

<https://jeongbincom.tistory.com/71>

<https://racoonlotty.tistory.com/56>
