nips/81.md

2.2 KiB

NIP-81

Relationship Status

draft optional

This NIP defines two new event kinds (30382 and 30383) to document the relationship between two keys.

Both kinds offer public and private tags to describe that relationship. Private tags are JSON Stringified, NIP-44-encrypted to the signer's keys and placed inside the .content of the event.

Public Relationship Status

Event kind 30382 is used when the relationship itself is public. The d tag contains the target public key in hex.

{
  "kind": 30382,
  "tags": [
    ["d", "e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411"],
    ["n", "follow"],
    ["n", "bitcoiner"],
    ["n", "6064460175057025"]
  ],
  "content": nip44Encrypt(JSON.stringify([
    ["petname", "NVK (Coldcard)"],
    ["summary", "Owes me a beer"]
  ])),
  // ...other fields
}

petname SHOULD be rendered instead of the person's display name in all interfaces when the signer of this event is logged in.

Relationship Categories

Optional n tags ["n", "<identifier>"] add the target key to event sets. This allows clients to query by n and download all members of a set.

Set identifier can be human readable and public or not.

For private cases, a new event kind named "Event Set Names" (kind:10008) uses map tags to store the set name. Clients SHOULD display the name instead of the identifier if the identifier is present in this event.

{
  "kind": 10008,
  "content": nip44Encrypt(JSON.stringify([
    ["map", "<identifier>", "<name>"],
    ["map", "bitcoiner", "bitcoiner"], 
    ["map", "6064460175057025", "debtor"]
  ])),
  // ...other fields
}

Private Relationship Status

For relationships that must remain private (e.g private follows, client lists, etc), the event kind 31383 uses a similar structure but with a hashed d tag using NIP-44's hkdf function.

{
  "kind": 31383,
  "tags": [
    ["d", sha256(hkdf(private_key, salt: 'nip81') || "<pubkey>")],
    ["n", "6064460175057025"],
  ],
  "content": nip44Encrypt(JSON.stringify([
    ["p", "<pubkey>", "<relay url>"],
    ["n", "client-list"],
    ["petname", "<My buddy>"],
    ["summary", "<Summary of the relationship>"],
  ])),
  // ...other fields
}