Updating NIP-81 to add private and public statuses

This commit is contained in:
Vitor Pamplona 2024-02-12 11:42:10 -05:00
parent 0f4edef69f
commit c31a5043a3

65
81.md
View File

@ -1,18 +1,41 @@
NIP-81 NIP-81
====== ======
Private Relationship Status Relationship Status
--------------------------- -------------------
`draft` `optional` `draft` `optional`
A new `kind:30382` event documents a "Private Relationship Status" between two users of the network. Event `kind:30382` documents a "Relationship Status" between two pubkeys and uses private and public tags to enhance the description of that relationship.
It is defined as a _parameterized replaceable event_ with a single `d` tag as a random UUID per pubkey. An optional `n` tag adds the target key to an unbound list. 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.
The other tags are stringified, NIP-44-encrypted and placed inside the `.content` of the event. Optional `n` tags add the target key to an unbound list.
For example: 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
```js ```js
{ {
@ -21,12 +44,12 @@ For example:
["d", "<randomUUID>"], ["d", "<randomUUID>"],
["n", "Clients"] ["n", "Clients"]
], ],
"content": "<NIP-44 encrypted Stringified TAG-List( "content": nip44Encrypt(JSON.stringify([
["p", "<pubkey>", "relay"] ["p", "<pubkey>", "relay"]
["nickname", "<My buddy>"] ["nickname", "<My buddy>"]
["summary", "<Summary of the relationship>"], ["summary", "<Summary of the relationship>"],
["nip82secret", "<secret used to decrypt medical data for this pubkey>"] ["nip82secret", "<secret used to decrypt medical data for this pubkey>"]
)", ])),
...other fields ...other fields
} }
``` ```
@ -36,3 +59,29 @@ For example:
Profile screens MAY display the summary of the relationship and allow the user to change the tags of this event. 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. 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)
```