본문으로 건너뛰기

자체 RPC 노드 운영하기

이 튜토리얼은 Status Network용 자체 Remote Procedure Call (RPC) 노드를 설정하고 운영하는 과정을 안내합니다. 자체 RPC 노드를 운영함으로써 Status Network와의 상호작용에 대한 더 큰 제어권을 얻고, 프라이버시를 강화하며, 제3자 서비스에 대한 의존도를 줄일 수 있습니다.

시작하기

Status Network RPC Tools 레포지토리는 자체 RPC 노드를 실행하는 데 필요한 모든 도구, 제네시스 파일 및 설정 스크립트를 제공합니다.

전체 설정 가이드

자세한 설정 지침, 전제 조건, 시스템 요구 사항 및 단계별 가이드는 레포지토리의 공식 README를 참조하세요.

노드 옵션

설정 스크립트는 선택할 수 있는 두 가지 노드 구현을 제공합니다:

필요에 따라 둘 중 하나 또는 둘 다 동시에 실행할 수 있습니다.

노드 실행 상태 확인

아래 예제에서 Besu를 사용하는 경우 <YOUR_CLIENT_PORT>8545로, Geth를 사용하는 경우 8445로 바꾸세요.

기본 확인

노드가 실행되면 올바르게 작동하는지 확인하세요:

# 현재 블록 번호가 포함된 응답을 받아야 합니다.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
http://localhost:<YOUR_CLIENT_PORT>

상태 및 동기화 확인

전반적인 노드 상태 확인:

# 노드의 동기화 상태를 확인합니다. 노드가 동기화 완료된 경우 false를 반환합니다.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' \
http://localhost:<YOUR_CLIENT_PORT>

# 노드의 연결된 피어(peer) 수를 확인합니다 (0보다 커야 함)
curl -X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' \
http://localhost:<YOUR_CLIENT_PORT>

정상 구동하는 노드는 다음을 표시해야 합니다:

  • eth_blockNumber가 신뢰할 수 있는 참조(공개 RPC 또는 블록 탐색기 등)와 일치
  • eth_syncingfalse를 반환 (완전히 동기화됨)
  • net_peerCount가 0보다 큼 (피어에 연결됨)

WebSocket 지원

노드는 실시간 이벤트 구독을 위한 WebSocket 연결도 지원합니다:

# WebSocket 엔드포인트
ws://localhost:8546 # Besu
ws://localhost:8446 # Geth

WebSocket 연결

구독 예제

// 새 블록 헤더 구독
{"jsonrpc":"2.0","method":"eth_subscribe","params":["newHeads"],"id":1}

// 필터와 일치하는 로그 구독
{"jsonrpc":"2.0","method":"eth_subscribe","params":["logs",{"address":"0x..."}],"id":1}

// 구독 취소
{"jsonrpc":"2.0","method":"eth_unsubscribe","params":["0x..."],"id":1}

고급 기능

배치 요청

노드는 효율성 향상을 위해 배치 JSON-RPC 요청을 지원합니다:

  • 기본 배치 제한: 배치당 최대 1,024개
  • 구성: --rpc-http-max-batch-size로 조정 가능 (무제한은 1로 설정)
  • 최대 요청 크기: 5 MB (기본값 --rpc-http-max-request-content-length)

리소스 집약적 메소드

응답 시간이 길어질 수 있는 메소드 사용에 주의하세요:

메소드응답 시간참고
eth_getLogs (큰 범위)200ms ~ 수 초제한된 범위와 블룸 필터 사용
eth_estimateGas200ms ~ 수 초부하가 높거나 복잡한 컨트랙트의 경우 느려질 수 있음
성능 팁

프로덕션 사용을 위해 낮은 수천 단위의 읽기 RPS로 시작하고 특정 워크로드와 하드웨어 테스트를 기반으로 수평 확장하세요.

문제 해결

일반적인 문제

  1. 포트가 이미 사용 중

    # 포트 8545(Besu) 또는 8445(Geth)를 사용하는 프로세스 확인
    lsof -i :8545
    lsof -i :8445

    # 필요한 경우 프로세스 종료
    kill -9 <PID>
  2. Docker 컨테이너 문제

    # 실행 중인 컨테이너 확인
    docker ps

    # 컨테이너 로그 보기
    docker compose logs -f

    # 컨테이너 재시작
    docker compose restart
  3. 노드가 동기화되지 않음

    • 인터넷 연결 확인
    • 충분한 디스크 공간이 있는지 확인
    • Docker 컨테이너 로그 확인: docker compose logs
    • 시스템이 최소 요구 사항을 충족하는지 확인
  4. RPC 엔드포인트가 응답하지 않음

    • 컨테이너가 실행 중인지 확인: docker ps
    • 방화벽 설정 확인
    • RPC 포트(8545, 8445)가 접근 가능한지 확인
    • 오류에 대한 컨테이너 로그 검토

노드 모니터링

# Docker 컨테이너 상태 확인
docker compose ps

# 컨테이너 로그 모니터링
docker compose logs -f

# 디스크 사용량 모니터링
df -h

# 네트워크 연결 확인
netstat -tulpn | grep :8545
netstat -tulpn | grep :8445

저장공간 준비하기

디스크 공간 요구 사항

노드의 성장률을 고려하여 스토리지 용량을 계획하세요:

  • 초기 크기: 약 200 GB (2초 블록 기준 6개월 간 약 12M 트랜잭션 생성)
  • 성장률: 보통, 네트워크 활동에 따라 다름
  • 권장: 여유 공간을 위한 2 TB Gen4 NVMe
성장률 고려하기

지속적인 운영을 보장하기 위해 항상 현재 요구 사항을 초과하는 추가 스토리지 용량을 대비하세요.

보안 고려 사항

자체 RPC 노드를 운영할 때:

  1. 방화벽 구성: 필요한 포트(8545, 8445)만 노출
  2. 접근 제어: 프로덕션 사용을 위한 인증 구현 고려
  3. 네트워크 격리: RPC 엔드포인트를 인터넷에 직접 노출하지 않음
  4. 정기 업데이트: 노드 소프트웨어와 Docker 이미지를 최신 상태로 유지
  5. 백업: 노드 구성을 정기적으로 백업 (데이터는 필요시 재동기화 가능)
  6. 속도 제한: 여러 사용자에게 노출하는 경우 속도 제한 구현
프로덕션 배포

프로덕션 사용을 위해 속도 제한으로 인해 공개 RPC 엔드포인트에 의존하지 마세요. 자체 프라이빗 RPC 노드를 운영하면 더 나은 안정성과 성능을 제공합니다.

성능 최적화

RPC 노드 성능을 최적화하려면:

  1. SSD 스토리지: 더 나은 I/O 성능을 위해 Gen4 NVMe 스토리지 사용
  2. 충분한 RAM: 캐싱을 위한 적절한 메모리 확보 (32~48 GB 권장)
  3. 네트워크 대역폭: 동기화 및 피어 통신을 위한 안정적인 1+ Gbps 연결
  4. CPU 리소스: 트랜잭션 검증을 위한 적절한 처리 능력 (8~12 코어 권장)
  5. 수평 확장: 트래픽이 많은 애플리케이션의 경우 로드 밸런서 뒤에서 여러 노드 실행

지원

문제가 발생하면:

추가 리소스