nips/81.md

87 lines
2.3 KiB
Markdown
Raw Normal View History

2023-09-04 15:35:30 +00:00
NIP-81
======
Relationship Status
-------------------
2023-09-04 15:35:30 +00:00
`draft` `optional`
2023-09-04 15:35:30 +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.
2023-09-04 15:35:30 +00:00
Since statuses change over time, this event is defined as a _parameterized replaceable event_ with a single `d` tag as a random UUID per pubkey.
2024-02-07 22:59:27 +00:00
Optional `n` tags add the target key to an unbound list.
2023-09-04 15:35:30 +00:00
The private tags are stringified, NIP-44-encrypted and placed inside the `.content` of the event.
Examples:
Public Status
```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
}
```
Private Status
2023-09-04 15:35:30 +00:00
```js
{
"kind": 30382,
"tags": [
["d", "<randomUUID>"],
["n", "Clients"]
2023-09-04 15:35:30 +00:00
],
"content": nip44Encrypt(JSON.stringify([
["p", "<pubkey>", "relay"]
2023-09-04 15:41:59 +00:00
["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>"]
])),
2023-09-04 15:35:30 +00:00
...other fields
}
```
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.
Clients MAY filter by `kind:30382`, with or without `n` tags, to determine how to assemble feeds, group messages, and when to display content.
### Private `n`-tags
Clients MAY hide human readable `n`-tags behind a code and list their code maps in `kind:10007` using the `n_name` tag.
```js
{
"kind": 10007,
"content": nip44Encrypt(JSON.stringify([
["n_name", "<Code used in other events>", "<Name>"],
["n_name", "Clients", "Clients"] // public list of my Clients
["n_name", "6064460175057025", "Idiot"] // private list of idiots
])),
// ...other fields
}
```
### Deterministic `d`-Tag.
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_tag = sha256(nip81_key || bobs_pub)
kates_tag = sha256(nip81_key || kates_pub)
```