# 목차


0. 글을 시작하며

프로젝트 내부의 함수를 보면 블록 포지션 탐색에서는 24번의 Infura API 호출을, 토큰 추적에서는 그 이상의 API 호출을 진행한다. 사실 말도 안되는 API 호출 수다.😂 실제 서비스로는 아예 사용할 수 없을 정도의 시간소요일 것이다.

일차적으로 코드 구현은 진행했으니 이제는 성능 개선을 위해 머리를 굴려보자!

1. 블록 포지션 탐색 로직을 개선하기

더 머지(2022-09-15) 에서 시간이 조금 흐른 지금은 블록(슬롯) 의 생성이 12초로 고정이 되었다 할 수 있을 정도로 안정된 블록 생성 시간을 보이고 있다.

그렇다면 블록 포지션을 탐색하는 로직을 일차적으로 숫자 계산을 통해 추정하고, 이를 호출 해 원하는 블록을 가져오는지, 그렇지 않다면 그 때 블록 포지션 함수를 실행하는 로직 개선으로 Infura 호출 수를 줄일 수 있다.

예를 들어, 2025년 1월 6일 자정 즈음에 생성된 블록 번호가 21561709번 인데, 만약 1월 5일 자정에 생성된 블록 번호를 21561709 - ( 24 * 60 * 60 / 12 = 7200 ) = 21554509번이라고 추정할 수 있다.

이더스캔에서 21554509번 블록을 보면 1월 4일 23시 50분 11초에 생성되었음을 알 수 있고 5일 자정에 꽤나 가까운 블록이다. 이 근처에 블록을 탐색하면 자정에 생성된 블록을 찾을 수 있을 것이고, 기존의 무지성적인 이진탐색 보다 확실한 성능 개선을 가져갈 수 있을 것이다. (물론 PoW 당시의 블록 포지션 검색은 다른 방법을 고안해야할 것이다.)

24번의 호출을 1~5번의 호출로 줄일 수 있다면 실로 엄청난 성능 개선이지 않을까!

curl -X 'GET' \\
  '<https://jungho.dev/api-tracker/v1/get/getBlockPosition?date=2025-01-06>' 
  
{
  "blockTimestamp": {
    "timestamp": 1736121600,
    "hexTimestamp": "0x677b1d00",
    "date": "2025-01-06T00:00:00Z"
  },
  "blockPosition": {
    "low": 21561709,
    "lowHex": "0x149016d",
    "lowTimestamp": 1736121599,
    "lowTimestampHex": "0x677b1cff",
    "high": 21561710,
    "highHex": "0x149016e",
    "highTimestamp": 1736121611,
    "highTimestampHex": "0x677b1d0b"
  }
}

2. Infura 호출 수를 줄이기