Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relationship status #761

Draft
wants to merge 32 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
a3292f4
First Draft
vitorpamplona Sep 4, 2023
b7aa64d
Quick adjustments
vitorpamplona Sep 4, 2023
0006b13
adds privately
vitorpamplona Sep 4, 2023
5cc0c93
correct typo
sudocarlos Sep 4, 2023
fe00ddd
Merge pull request #1 from sudocarlos/patch-1
vitorpamplona Sep 6, 2023
dc4af5d
Refines proposal to make relationships private.
vitorpamplona Feb 7, 2024
bd1755f
Improves formatting
vitorpamplona Feb 7, 2024
73a2aab
Optional n tag
vitorpamplona Feb 7, 2024
225be8a
correcting the example
vitorpamplona Feb 7, 2024
0f4edef
Switch to random UUID for better security.
vitorpamplona Feb 7, 2024
c31a504
Updating NIP-81 to add private and public statuses
vitorpamplona Feb 12, 2024
6868e02
formatting
vitorpamplona Feb 12, 2024
ee6d4e6
enhancing the example with private ntags
vitorpamplona Feb 12, 2024
1bcbd31
wording
vitorpamplona Feb 12, 2024
df362d1
formatting
vitorpamplona Feb 12, 2024
873569c
formatting
vitorpamplona Feb 12, 2024
fbb5aba
Merge remote-tracking branch 'upstream/master' into relationship-status
vitorpamplona Feb 12, 2024
1e7da2b
Moves to 10008 kind for name maps
vitorpamplona Feb 12, 2024
3ff65d1
Adds edge cases
vitorpamplona Feb 12, 2024
a401682
renames nicknames to petnames
vitorpamplona Feb 14, 2024
61898c0
Simplifying statuses
vitorpamplona Mar 19, 2024
4482a41
Creating two event kinds.
vitorpamplona Mar 19, 2024
a3a6784
Update 81.md
vitorpamplona May 10, 2024
08d8b1e
Update 81.md
vitorpamplona May 10, 2024
a5ff486
Update 81.md
vitorpamplona May 10, 2024
89e8124
Merge remote-tracking branch 'upstream/master' into relationship-status
vitorpamplona May 10, 2024
bae459a
Updates relationship status to use event sets.
vitorpamplona May 11, 2024
a8c573f
adds public relationship status to the readme
vitorpamplona May 11, 2024
4e0b5fa
Aligning the Private Relationship status Kind with the other PRs
vitorpamplona Jun 20, 2024
3ba8526
Fixing kind numbers
vitorpamplona Jun 20, 2024
8cb2ebc
Merge remote-tracking branch 'upstream/master' into relationship-status
vitorpamplona Oct 11, 2024
8dafaf8
moves event set names to the right position on readme
vitorpamplona Oct 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions 81.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
NIP-81
======

Relationship Status
-------------------

`draft` `optional`

This NIP defines two new event kinds (`30382` and `31382`) 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](44.md)-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.

```js
{
"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.

```js
{
"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 `31382` uses a similar structure but with a hashed `d` tag using [NIP-44](44.md)'s `hkdf` function.

```js
{
"kind": 31382,
"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
}
```
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-73: External Content IDs](73.md)
- [NIP-75: Zap Goals](75.md)
- [NIP-78: Application-specific data](78.md)
- [NIP-81: Relationship Status](81.md)
- [NIP-84: Highlights](84.md)
- [NIP-89: Recommended Application Handlers](89.md)
- [NIP-90: Data Vending Machines](90.md)
Expand Down Expand Up @@ -154,6 +155,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `10005` | Public chats list | [51](51.md) |
| `10006` | Blocked relays list | [51](51.md) |
| `10007` | Search relays list | [51](51.md) |
| `10008` | Event Set Names | [81](81.md) |
| `10009` | User groups | [51](51.md), [29](29.md) |
| `10015` | Interests list | [51](51.md) |
| `10030` | User emoji list | [51](51.md) |
Expand Down Expand Up @@ -191,13 +193,15 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `30078` | Application-specific Data | [78](78.md) |
| `30311` | Live Event | [53](53.md) |
| `30315` | User Statuses | [38](38.md) |
| `30382` | Public Relationship Status | [81](81.md) |
| `30388` | Slide Set | [Corny Chat][cornychat-slideset] |
| `30402` | Classified Listing | [99](99.md) |
| `30403` | Draft Classified Listing | [99](99.md) |
| `30617` | Repository announcements | [34](34.md) |
| `30618` | Repository state announcements | [34](34.md) |
| `30818` | Wiki article | [54](54.md) |
| `30819` | Redirects | [54](54.md) |
| `31382` | Private Relationship Status | [81](81.md) |
| `31388` | Link Set | [Corny Chat][cornychat-linkset] |
| `31890` | Feed | [NUD: Custom Feeds][NUD: Custom Feeds] |
| `31922` | Date-Based Calendar Event | [52](52.md) |
Expand Down