NIP-02는 사용자의 팔로우 목록을 저장하는 kind 3 이벤트를 정의한다. 이 이벤트는 홈 피드, 답글 알림, 그리고 많은 릴레이 선택 전략의 기본 입력이다.

작동 방식

Kind 3 이벤트는 팔로우하는 pubkey를 나열하는 p 태그를 포함한다:

{
  "id": "d7a8f...",
  "pubkey": "a3b9c...",
  "created_at": 1734912000,
  "kind": 3,
  "tags": [
    ["p", "91cf9..af5f", "wss://alicerelay.example.com", "alice"],
    ["p", "14aeb..8dad", "wss://bobrelay.example.com", "bob"],
    ["p", "612ae..982b", "", ""]
  ],
  "content": "",
  "sig": "e4f8a..."
}

p 태그에는 네 가지 위치가 있다: 태그 이름, 팔로우하는 pubkey (hex), 선택적 릴레이 URL 힌트, 그리고 선택적 “petname” (로컬 닉네임). 릴레이 힌트는 다른 클라이언트에게 해당 사용자의 이벤트를 어디서 찾을 수 있는지 알려준다. Petname은 상대방이 자체 선언한 표시 이름에 의존하지 않고 연락처에 기억하기 쉬운 이름을 지정할 수 있게 해준다.

대체 가능 동작

Kind 3은 대체 가능 범위(0, 3, 10000-19999)에 속하므로, 릴레이는 pubkey당 최신 버전만 보존한다. 새 사용자를 팔로우하면 클라이언트가 기존의 모든 팔로우에 새 팔로우를 추가한 완전한 새 kind 3을 발행한다. 이는 팔로우 목록이 매번 완전해야 함을 의미하며, 증분 업데이트를 발행할 수 없다.

왜 중요한가

홈 피드를 구성하려면, 클라이언트가 사용자의 kind 3을 가져와 모든 p 태그 pubkey를 추출한 다음 해당 작성자들의 kind 1 이벤트를 구독한다:

["REQ", "home", {"kinds": [1], "authors": ["91cf9...", "14aeb...", "612ae..."], "limit": 50}]

릴레이가 일치하는 노트를 반환하면 클라이언트가 렌더링한다. Kind 3의 릴레이 힌트는 클라이언트가 각 팔로우 사용자에 대해 어떤 릴레이에 쿼리할지 알 수 있게 도와준다.

오래된 소셜 상태가 가장 먼저 나타나는 곳이기도 하다. 쿼리하는 릴레이에 사용자의 최신 kind 3이 없으면, 팔로우가 다른 곳에 여전히 존재하더라도 피드가 비어 보일 수 있다. 여러 릴레이의 결과를 병합하는 클라이언트가 단일 릴레이를 신뢰하는 클라이언트보다 일반적으로 더 나은 복구를 보인다.

Petname과 아이덴티티

Petname 필드는 탈중앙화된 명명 체계를 가능하게 한다. 사용자가 프로필에서 주장하는 이름을 신뢰하는 대신 자신만의 라벨을 지정할 수 있다. 클라이언트는 “alice (내 여동생)“처럼 표시할 수 있는데, “alice"는 kind 0 프로필에서 가져오고 “내 여동생"은 사용자가 지정한 petname이다. 이는 전역 사용자 이름이 제공할 수 없는 맥락을 제공한다.

상호운용성 참고사항

Kind 3 이벤트는 대체 가능하고 완전해야 하므로, 클라이언트는 업데이트 시 알 수 없는 태그를 보존해야 한다. 다른 클라이언트가 추가한 태그를 사용자의 클라이언트가 이해하지 못한다면, 무작정 덮어쓰면 데이터가 손실된다.

릴레이 힌트와 petname에도 같은 주의가 적용된다. 선택적 필드이지만, 쓰기 시 삭제하면 다른 클라이언트의 경험을 조용히 악화시킬 수 있다. 안전한 업데이트 경로는 알려진 최신 kind 3을 로드하고, 이해하는 태그만 수정하고, 나머지는 유지한 다음 전체 이벤트를 재발행하는 것이다.


주요 출처:

언급된 뉴스레터:

같이 보기: