2023-09-04 15:35:30 +00:00
NIP-81
======
2024-02-12 16:42:10 +00:00
Relationship Status
-------------------
2023-09-04 15:35:30 +00:00
2024-02-07 22:54:20 +00:00
`draft` `optional`
2023-09-04 15:35:30 +00:00
2024-02-12 16:46:33 +00:00
Event `kind:30382` documents a "Relationship Status" between two pubkeys 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 that identifies each pair of keys.
2023-09-04 15:35:30 +00:00
2024-02-12 16:46:33 +00:00
Optional `n` tags add the target key to unbound lists.
2024-02-07 22:59:27 +00:00
2024-02-12 16:46:33 +00:00
The private tags are JSON Stringified, [NIP-44 ](44.md )-encrypted and placed inside the `.content` of the event.
2023-09-04 15:35:30 +00:00
2024-02-12 16:49:47 +00:00
Example of Public Status
2024-02-12 16:42:10 +00:00
```js
{
"kind": 30382,
"tags": [
["d", "< randomUUID > "],
["n", "Clients"],
["n", "Developers"],
["p", "< pubkey > ", "relay"],
["trust_level", "1"],
["nickname", "< My buddy > "],
["summary", "< Summary of the relationship > "]
],
"content": "",
// ...other fields
}
```
2024-02-12 16:49:47 +00:00
Example of Private Status
2023-09-04 15:35:30 +00:00
```js
{
"kind": 30382,
"tags": [
2024-02-07 23:33:15 +00:00
["d", "< randomUUID > "],
2024-02-12 16:48:35 +00:00
["n", "Clients"],
["n", "6064460175057025"], // see private n-tags below
2023-09-04 15:35:30 +00:00
],
2024-02-12 16:42:10 +00:00
"content": nip44Encrypt(JSON.stringify([
2024-02-12 16:51:45 +00:00
["p", "< pubkey > ", "relay"],
["nickname", "< My buddy > "],
2023-09-04 15:35:30 +00:00
["summary", "< Summary of the relationship > "],
2024-02-07 23:00:19 +00:00
["nip82secret", "< secret used to decrypt medical data for this pubkey > "]
2024-02-12 16:42:10 +00:00
])),
2024-02-12 16:51:45 +00:00
// ...other fields
2023-09-04 15:35:30 +00:00
}
```
2023-09-04 15:41:59 +00:00
`nickname` SHOULD be used instead of the person's display name in all interfaces
2023-09-04 15:35:30 +00:00
Profile screens MAY display the summary of the relationship and allow the user to change the tags of this event.
2024-02-07 22:54:20 +00:00
Clients MAY filter by `kind:30382` , with or without `n` tags, to determine how to assemble feeds, group messages, and when to display content.
2024-02-12 16:42:10 +00:00
### Private `n`-tags
2024-02-12 16:57:50 +00:00
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.
2024-02-12 16:42:10 +00:00
```js
{
2024-02-12 16:57:50 +00:00
"kind": 10008,
2024-02-12 16:42:10 +00:00
"content": nip44Encrypt(JSON.stringify([
2024-02-12 16:57:50 +00:00
["map", "< Code used in other events > ", "< Human readable name > "],
["map", "Clients", "Clients"], // public list of my Clients
["map", "6064460175057025", "Idiots"] // private list of idiots
2024-02-12 16:42:10 +00:00
])),
// ...other fields
}
```
2024-02-12 16:46:33 +00:00
### Deterministic `d`-Tags.
2024-02-12 16:42:10 +00:00
2024-02-12 16:46:33 +00:00
For private use cases that must contain deterministic d-Tags, the recommendation is to use [NIP-44 ](44.md )'s `hkdf` function and use a hash between the user's private key and the pubkey of the `p` tag.
2024-02-12 16:42:10 +00:00
```
nip81_key = hkdf(private_key, salt: 'nip81')
2024-02-12 16:46:33 +00:00
bobs_d_tag = sha256(nip81_key || bobs_pub)
kates_d_tag = sha256(nip81_key || kates_pub)
2024-02-12 16:42:10 +00:00
```