Direct Shreds - UDP 포워딩 (Raw Shreds)

ERPC Dedicated Shreds를 사용 중이라면, raw Shreds를 UDP를 통해 직접 운영하는 리스너로 포워딩할 수 있습니다. 이는 Solana의 가장 빠른 관측 계층으로, Geyser gRPC보다도 앞서며 RPC/WebSocket보다는 훨씬 앞섭니다. SDK에는 간단한 Rust 샘플이 포함되어 있으며, new-token detection을 사용하는 이유는 단지 우리가 가장 자주 받는 질문이기 때문입니다.

왜 이것이 가장 빠른 경로인가

  • Shreds가 가장 먼저 도착합니다: validator 간 Shreds는 Geyser gRPC나 RPC/WebSocket보다 먼저 도달하므로, 지연에 민감한 흐름에서 이벤트를 가장 일찍 확인할 수 있습니다.
  • UDP는 오버헤드를 최소화합니다: 연결 설정, 재전송, 순서 보장이 없으며, validator 간의 on-wire 포맷과 일치합니다.
  • 트레이드오프: finalization 이전 데이터는 누락되거나/순서가 어긋나거나/실패할 수 있으므로, 이를 속도를 얻는 대가의 일부로 처리해야 합니다.
참고: 공유 Shreds gRPC endpoint는 TCP로 동작하므로 UDP Shreds보다 느립니다.

Solana Stream SDK로 시도해보기

  • 샘플 코드 (shreds-udp-rs, Rust): new-token detection은 흔한 예시일 뿐이니, 직접 원하는 대상으로 교체하세요.
    https://github.com/ValidatorsDAO/solana-stream/tree/main/temp-release/shreds-udp-rs
  • Dedicated Shreds 사용자: Shreds sender를 샘플의 ip:port로 지정하면 감지 결과를 확인할 수 있습니다.
  • 아직 UDP를 사용하지 않나요? 로컬이나 자체 서버에서 실행하여 로그를 살펴보고 hook을 커스터마이즈해보세요.

UDP 패킷이 도착하지 않는 경우

목적지를 설정하면 UDP 포워딩이 자동으로 시작됩니다. heartbeat로 활성화할 필요가 없으며, heartbeat 응답이 UNIMPLEMENTED여도 포워딩이 비활성화되었다는 의미는 아닙니다.
먼저 호스트의 네트워크 인터페이스에서 트래픽을 캡처합니다. 플레이스홀더를 해당 stream에 표시된 ERPC 소스 IP와 설정한 목적지 포트로 바꾸세요.
Linux (tcpdump):
bash
sudo tcpdump -ni any 'udp dst port <DESTINATION_PORT> and src host <ERPC_SOURCE_IP>'
Windows (Pktmon, 관리자 권한으로 실행):
powershell
pktmon filter add ERPC-UDP -t UDP -i <ERPC_SOURCE_IP> -p <DESTINATION_PORT>
pktmon start --capture --comp nics --log-mode real-time
  1. 캡처 결과가 계속 0이면 OS 방화벽과 OS 외부 방화벽을 모두 확인하세요. Hetzner에서는 Cloud Firewall 또는 스위치 포트의 Robot Firewall이 트래픽을 차단할 수 있습니다. AWS에서는 Security Group과 subnet의 Network ACL을 확인하세요.
  2. <ERPC_SOURCE_IP>/32에서 목적지 포트 <DESTINATION_PORT>로 들어오는 UDP를 허용하세요. ERPC는 동적 UDP 소스 포트를 사용하므로 소스 포트를 제한하지 마세요.
  3. 캡처에는 패킷이 보이지만 애플리케이션에서 수신하지 못한다면 localhost 대신 0.0.0.0:<DESTINATION_PORT>에 receiver를 바인딩한 뒤 로컬 방화벽과 socket/process 설정을 확인하세요.
규칙을 변경한 후에도 패킷이 도착하지 않으면 캡처 시간, 패킷 수, 소스 IP, 목적지 IP, 목적지 포트를 Support에 보내 주세요.

리소스