nips/81.md
2024-02-14 15:01:55 -05:00

3.0 KiB

NIP-81

Relationship Status

draft optional

Event kind:30382 documents a "Relationship Status" between two keys, the signer and a p-tag, and uses private and public tags to enhance the description of that relationship. Since statuses change over time, this event is defined as a parameterized replaceable event with a single d tag whole value identifies the key pair.

Optional n tags add the target key to unbound lists.

The private tags are JSON Stringified, NIP-44-encrypted and placed inside the .content of the event.

Example of Public Status

{
  "kind": 30382,
  "tags": [
    ["d", "<randomUUID>"],
    ["n", "Client List"],
    ["n", "Special Holidays List"],
    ["p", "<pubkey>", "relay"],
    ["trust_level", "1"],
    ["petname", "<My buddy>"],
    ["summary", "<Summary of the relationship>"]
  ],
  "content": "",
  // ...other fields
}

Example of Private Status

{
  "kind": 30382,
  "tags": [
    ["d", "<randomUUID>"],
    ["n", "Clients List"],
    ["n", "6064460175057025"], // see private n-tags below
  ],
  "content": nip44Encrypt(JSON.stringify([
    ["p", "<pubkey>", "relay"],
    ["petname", "<My buddy>"],
    ["summary", "<Summary of the relationship>"],
    ["nip82secret", "<secret used to decrypt medical data for this pubkey>"]
  ])),
  // ...other fields
}

petname SHOULD be used instead of the person's display name in all interfaces

Profile screens MAY display the summary of the relationship and allow the user to change the tags of this event.

Clients MAY filter by kind:30382, with or without n tags, to determine how to assemble feeds, group messages, and when to display content.

Web of Trust processors MAY use kind:30382 as directional edges in the Web of Trust graph.

Multiple p-tags in a single kind:30382 represent a group of individuals that SHOULD be considered as of one entity. The other tags decribe the relationship to the entity and not individual keys.

Having one p-tag in multiple d-tags represent separate statuses for the same pubkey based on their participation in a list n

Private n-tags

Clients MAY hide human readable n-tags behind a code and list their code maps in the new "Unbound List Names" event kind (kind:10008), using the map tag from code to name.

{
  "kind": 10008,
  "content": nip44Encrypt(JSON.stringify([
    ["map", "<Code used in other events>", "<Human readable name>"],
    ["map", "Clients List", "Clients List"], // public list of my Clients
    ["map", "6064460175057025", "Idiots"] // private list of idiots
  ])),
  // ...other fields
}

Deterministic d-Tags.

For private use cases that must contain deterministic d-Tags, the recommendation is to use NIP-44's hkdf function and use a hash between the user's private key and the pubkey of the p tag.

nip81_key = hkdf(private_key, salt: 'nip81') 
bobs_d_tag = sha256(nip81_key || bobs_pub)
kates_d_tag = sha256(nip81_key || kates_pub)