프로젝트 내부의 함수를 보면 블록 포지션 탐색에서는 24번의 Infura API 호출을, 토큰 추적에서는 그 이상의 API 호출을 진행한다. 사실 말도 안되는 API 호출 수다.😂 실제 서비스로는 아예 사용할 수 없을 정도의 시간소요일 것이다.
일차적으로 코드 구현은 진행했으니 이제는 성능 개선을 위해 머리를 굴려보자!
더 머지(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"
}
}