NIP-65는 사용자가 읽기와 쓰기에 선호하는 릴레이를 알리는 kind 10002 이벤트를 정의한다. 이 메타데이터는 다른 사용자와 클라이언트가 분산 릴레이 네트워크에서 콘텐츠를 찾는 데 도움을 주며, 부하를 분산하고 검열 저항성을 향상시키는 “outbox 모델"을 가능하게 한다.

구조

릴레이 목록은 사용자가 알리려는 각 릴레이에 대한 r 태그를 포함하는 교체 가능 이벤트(kind 10002)이다. 이 이벤트는 같은 pubkey의 이전 릴레이 목록을 대체한다.

{
  "id": "a1b2c3d4e5f6...",
  "pubkey": "abcd1234...",
  "created_at": 1736726400,
  "kind": 10002,
  "tags": [
    ["r", "wss://relay.damus.io", "read"],
    ["r", "wss://nos.lol"],
    ["r", "wss://relay.nostr.band", "write"]
  ],
  "content": "",
  "sig": "sig1234..."
}

r 태그는 릴레이 WebSocket URL과 사용자가 해당 릴레이와 어떻게 상호작용하는지를 나타내는 선택적 마커를 포함한다. read 마커는 사용자가 이 릴레이에서 이벤트를 소비한다는 의미이므로, 다른 사용자가 해당 릴레이에 게시해야 해당 사용자에게 도달할 수 있다. write 마커는 사용자가 이 릴레이에 게시한다는 의미이므로, 다른 사용자가 해당 릴레이를 구독해야 사용자의 콘텐츠를 볼 수 있다. 마커를 생략하면 읽기와 쓰기 모두를 의미한다.

content 필드는 릴레이 목록 이벤트에서 비어 있다.

Outbox 모델

NIP-65는 “outbox 모델"이라 불리는 분산 콘텐츠 배포 패턴을 가능하게 한다. 모든 사람이 같은 중앙 릴레이에 게시하고 읽는 대신, 사용자는 자신이 선호하는 릴레이에 게시하고 클라이언트는 각 사용자의 콘텐츠를 동적으로 찾아간다.

Alice가 Bob의 게시물을 찾고자 할 때, Alice의 클라이언트는 먼저 어떤 릴레이에서든 Bob의 kind 10002 이벤트를 가져온다. 그런 다음 Bob이 write로 표시한 릴레이를 추출한다. 그곳이 Bob이 게시하는 곳이기 때문이다. Alice의 클라이언트는 그 릴레이에서 Bob의 이벤트를 구독한다. Alice가 Bob에게 다이렉트 메시지를 보내고 싶을 때, 클라이언트는 대신 Bob의 read 릴레이를 찾아 그곳에 메시지를 게시한다.

Outbox 모델을 따르는 클라이언트는 팔로우하는 사용자의 NIP-65 이벤트에 나열된 릴레이에 대한 연결을 유지한다. 새로운 계정을 발견할 때마다 새로운 릴레이에 동적으로 연결한다. 여러 팔로우 사용자의 목록에 나타나는 릴레이가 우선시되는데, 그 릴레이에 연결하면 사용자의 소셜 그래프를 더 많이 서비스할 수 있기 때문이다.

이 아키텍처는 검열 저항성을 향상시킨다. 어떤 단일 릴레이도 모든 사용자의 콘텐츠를 저장하거나 서비스할 필요가 없기 때문이다. 하나의 릴레이가 오프라인이 되거나 사용자를 차단해도, 해당 사용자의 콘텐츠는 나열된 다른 릴레이에서 이용 가능하다.

왜 중요한가

NIP-65는 릴레이 선택을 하드코딩된 클라이언트 기본값에서 사용자가 게시하는 라우팅 메타데이터로 전환한다. 이를 통해 클라이언트는 모든 사용자가 같은 릴레이 세트를 사용한다고 가정하는 대신, 각 계정의 실제 게시 및 읽기 습관에 적응할 수 있다.

복잡성도 클라이언트로 이동한다. Outbox 모델을 잘 사용하려면 클라이언트에 릴레이 캐싱, 재시도 로직, 릴레이 목록이 없거나 오래된 경우의 폴백 동작이 필요하다. 이 사양은 탐색성을 개선하지만, 좋은 릴레이 선택 휴리스틱의 필요성을 없애지는 않는다.

릴레이 힌트와의 관계

NIP-65는 다른 NIP 전반에 걸쳐 발견되는 릴레이 힌트를 보완한다. 누군가를 ["p", "pubkey", "wss://hint.relay"]로 태그할 때, 힌트는 클라이언트에게 해당 특정 참조를 어디서 찾을지 알려준다. NIP-65는 사용자가 제어하는 권위 있는 선호 릴레이 목록을 제공하고, 힌트는 더 빠른 발견을 위해 개별 이벤트에 내장된 바로가기를 제공한다.

비공개 메시징의 경우 NIP-65가 전부가 아니다. 공개 콘텐츠 라우팅은 kind 10002를 사용하지만, 최신 비공개 메시징 스택은 종종 NIP-17 릴레이 목록과 같은 별도의 인박스 메타데이터에 의존하여 사용자가 DM 라우팅을 공개 게시 릴레이와 구분할 수 있게 한다.

모범 사례

릴레이 목록을 최신 상태로 유지하라. 폐쇄된 릴레이를 가리키는 오래된 항목은 다른 사용자가 당신을 찾기 어렵게 만든다. 중복성을 위해 최소 두세 개의 릴레이를 포함하여, 하나의 릴레이가 오프라인이 되어도 다른 릴레이를 통해 콘텐츠에 접근할 수 있도록 하라.

너무 많은 릴레이를 나열하는 것은 피하라. 1015개의 릴레이를 나열하면, 콘텐츠를 가져오려는 모든 클라이언트가 그 릴레이 모두에 연결해야 하므로 경험이 느려지고 네트워크 전체의 부하가 증가한다. 잘 선택된 35개의 릴레이가 모든 사람에게 부담을 주는 과도한 목록보다 낫다.

범용 릴레이와 사용하는 전문 릴레이를 혼합하라. 예를 들어, wss://relay.damus.io와 같은 인기 있는 범용 릴레이, 지역 특화 릴레이, 참여하는 특정 커뮤니티의 릴레이를 나열할 수 있다.


주요 출처:

언급된 뉴스레터:

같이 보기: