Simplifying statuses

This commit is contained in:
Vitor Pamplona 2024-03-19 16:01:55 -04:00
parent a401682a58
commit 61898c0cd0

85
81.md
View File

@ -6,85 +6,68 @@ Relationship Status
`draft` `optional` `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. Event `kind:30382` documents a "Relationship Status" between two keys and uses private and public tags to describe that relationship.
Optional `n` tags add the target key to unbound lists. Since statuses change over time, this event is defined as a _parameterized replaceable event_ with a single `d` tag that identifies the target key.
The private tags are JSON Stringified, [NIP-44](44.md)-encrypted and placed inside the `.content` of the event. When the relationship is public, the `d` tag is the same as the `p`-tag.
Example of Public Status
```js ```js
{ {
"kind": 30382, "kind": 30382,
"tags": [ "tags": [
["d", "<randomUUID>"], ["d", "e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411"],
["n", "Client List"], ["n", "Follow"],
["n", "Special Holidays List"], ["n", "Bitcoiners"],
["p", "<pubkey>", "relay"], ["n", "6064460175057025"]
["trust_level", "1"], ["p", "e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411", "<relay>"],
["petname", "<My buddy>"],
["summary", "<Summary of the relationship>"]
],
"content": "",
// ...other fields
}
```
Example of Private Status
```js
{
"kind": 30382,
"tags": [
["d", "<randomUUID>"],
["n", "Clients List"],
["n", "6064460175057025"], // see private n-tags below
], ],
"content": nip44Encrypt(JSON.stringify([ "content": nip44Encrypt(JSON.stringify([
["p", "<pubkey>", "relay"], ["petname", "NVK (Coldcard)"],
["petname", "<My buddy>"], ["summary", "Owes me a beer"]
["summary", "<Summary of the relationship>"],
["nip82secret", "<secret used to decrypt medical data for this pubkey>"]
])), ])),
// ...other fields // ...other fields
} }
``` ```
The private tags are JSON Stringified, [NIP-44](44.md)-encrypted to the signer's keys and placed inside the `.content` of the event.
`petname` SHOULD be used instead of the person's display name in all interfaces `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. ### Relationship Categories
Clients MAY filter by `kind:30382`, with or without `n` tags, to determine how to assemble feeds, group messages, and when to display content. Optional `n` tags `["n", "<list code>"]` add the target key to unbound lists. This allows clients to query by `n` and download all members of a list.
Web of Trust processors MAY use `kind:30382` as directional edges in the Web of Trust graph. List `codes` can be human readable or not. A new event kind named "Unbound List Names" (`kind:10008`) uses `map` tags to display the list name. Clients SHOULD display the `name` instead of the `code` if the `code` is present in this list.
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.
```js ```js
{ {
"kind": 10008, "kind": 10008,
"content": nip44Encrypt(JSON.stringify([ "content": nip44Encrypt(JSON.stringify([
["map", "<Code used in other events>", "<Human readable name>"], ["map", "<code>", "<name>"],
["map", "Clients List", "Clients List"], // public list of my Clients ["map", "Bitcoiners", "Bitcoiners"],
["map", "6064460175057025", "Idiots"] // private list of idiots ["map", "6064460175057025", "Debtors"]
])), ])),
// ...other fields // ...other fields
} }
``` ```
### Deterministic `d`-Tags. ### Private Relationship Status
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. For relationships that MUST remain private, a deterministic `d`-Tag is calculated using [NIP-44](44.md)'s `hkdf` function and a `sha256` hash between the signer's private key and the pubkey of the `p` tag.
``` ```js
nip81_key = hkdf(private_key, salt: 'nip81') {
bobs_d_tag = sha256(nip81_key || bobs_pub) "kind": 30382,
kates_d_tag = sha256(nip81_key || kates_pub) "tags": [
["d", sha256(hkdf(private_key, salt: 'nip81') || "<pubkey>")],
],
"content": nip44Encrypt(JSON.stringify([
["p", "<pubkey>", "relay"],
["n", "Clients List"],
["petname", "<My buddy>"],
["summary", "<Summary of the relationship>"],
])),
// ...other fields
}
``` ```