mirror of
https://github.com/nostr-protocol/nips.git
synced 2024-12-22 16:35:52 -05:00
131 lines
4.2 KiB
Markdown
131 lines
4.2 KiB
Markdown
|
NIP-0A
|
|||
|
======
|
|||
|
|
|||
|
Discrete query messages - "FOLLOWS" and "FOLLOWERS"
|
|||
|
---------------------------------------------------
|
|||
|
|
|||
|
'draft' 'optional'
|
|||
|
|
|||
|
## Discrete query messages
|
|||
|
|
|||
|
Discrete query messages aim for relays to provide essential, quick and efficient searching methods instead of using the "REQ" message.
|
|||
|
|
|||
|
Each discrete query message should have a single function and be simple enough to obtain results from tables with indexes to ensure quick searching.
|
|||
|
|
|||
|
This NIP determines two discreet query messages, "FOLLOWS" and "FOLLOWERS."
|
|||
|
|
|||
|
### "FOLLOWS"
|
|||
|
|
|||
|
"FOLLOWS" has the messaging pattern following.
|
|||
|
|
|||
|
- ["FOLLOWS", <subscription_id>, ["npub1", "npub2", ...] ]
|
|||
|
|
|||
|
Once the message is received, the relay should return each npub's follow list based on the latest kind 3 event.
|
|||
|
|
|||
|
The result is much simpler than the original kind 3 event such as:
|
|||
|
|
|||
|
``` json
|
|||
|
["FOLLOWS", <subscription_id>,
|
|||
|
{
|
|||
|
"pubkey": "npub1",
|
|||
|
"follows": [
|
|||
|
["91cf9..4e5ca", "wss://alicerelay.com/", "alice"],
|
|||
|
["14aeb..8dad4", "wss://bobrelay.com/nostr", "bob"],
|
|||
|
["612ae..e610f", "ws://carolrelay.com/ws", "carol"]
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"pubkey": "npub2",
|
|||
|
"follows": [
|
|||
|
...
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"pubkey": "npub3",
|
|||
|
"follows": [
|
|||
|
...
|
|||
|
]
|
|||
|
},
|
|||
|
...
|
|||
|
]
|
|||
|
```
|
|||
|
### "FOLLOWERS"
|
|||
|
|
|||
|
"FOLLOWERS" has the following messaging pattern.
|
|||
|
|
|||
|
- ["FOLLOWERS", <subscription_id>, ["npub1", "npub2", ...] ]
|
|||
|
|
|||
|
Once the message is received, the relay should return the follower list of each npub based on aggregating all the latest kind 3 events of all the npubs.
|
|||
|
The result from the relay has the following pattern.
|
|||
|
|
|||
|
``` json
|
|||
|
["FOLLOWERS", <subscription_id>,
|
|||
|
{
|
|||
|
"pubkey": "npub1",
|
|||
|
"followers": [
|
|||
|
["91cf9..4e5ca", "wss://alicerelay.com/", "alice"],
|
|||
|
["14aeb..8dad4", "wss://bobrelay.com/nostr", "bob"],
|
|||
|
["612ae..e610f", "ws://carolrelay.com/ws", "carol"]
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"pubkey": "npub2",
|
|||
|
"followers": [
|
|||
|
...
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"pubkey": "npub3",
|
|||
|
"followers": [
|
|||
|
...
|
|||
|
]
|
|||
|
},
|
|||
|
...
|
|||
|
]
|
|||
|
```
|
|||
|
|
|||
|
## Communication between clients and relays
|
|||
|
|
|||
|
### From client to relay:
|
|||
|
|
|||
|
The following message will be used to manage a query session, including "FOLLOWS" and "FOLLOWERS" already described above.
|
|||
|
|
|||
|
- ["CLOSE", <subscription_id>], used to stop the ongoing querying session.
|
|||
|
|
|||
|
### From relay to client
|
|||
|
|
|||
|
Relays can send the following messages.
|
|||
|
|
|||
|
["EOSE", <subscription_id>], used to indicate the end of searching and the beginning of a new searching session.
|
|||
|
["CLOSED", <subscription_id>, <message>], used to indicate that the subscription was ended on the server side.
|
|||
|
["NOTICE", <message>], used to send a human-readable message in case of an error.
|
|||
|
|
|||
|
## Appendix - managing the latest follows and followers of each npub
|
|||
|
|
|||
|
To obtain follows and followers of each npub from a relay, it should have an aggregated list of all the follows of the npubs that stored kind-3 to the relay such as:
|
|||
|
|
|||
|
| npub(indexed) | follow(indexed) | main_relay | petname |
|
|||
|
|:-:|:-:|:-:|:-:|
|
|||
|
| **npub1** | npub2 | wss://relay1.net | Bob |
|
|||
|
| **npub1** | npub3 | wss://relay1.net | Carol |
|
|||
|
| **npub1** | npub4 | wss://relay2.net | Dave |
|
|||
|
| npub2 | npub1 | wss://relay1.net | Alice |
|
|||
|
| npub2 | npub3 | wss://relay1.net | Carol |
|
|||
|
| npub2 | npub4 | wss://relay2.net | David |
|
|||
|
| npub4 | npub1 | wss://relay1.net | |
|
|||
|
| npub4 | npub2 | wss://relay1.net | |
|
|||
|
|
|||
|
Both the "npub" and "follow" columns must be indexed in the database. That way, by searching "npub" with a specific "follow," the relay can search for followers quickly.
|
|||
|
|
|||
|
| npub(indexed) | follow(indexed) | main_relay | petname |
|
|||
|
|:-:|:-:|:-:|:-:|
|
|||
|
| *npub2* | **npub1** | wss://relay1.net | Alice |
|
|||
|
| *npub4* | **npub1** | wss://relay1.net | |
|
|||
|
| npub1 | npub2 | wss://relay1.net | Bob |
|
|||
|
| npub4 | npub2 | wss://relay1.net | |
|
|||
|
| npub1 | npub3 | wss://relay1.net | Carol |
|
|||
|
| npub2 | npub3 | wss://relay1.net | Carol |
|
|||
|
| npub1 | npub4 | wss://relay2.net | Dave |
|
|||
|
| npub2 | npub4 | wss://relay2.net | David |
|
|||
|
|
|||
|
("npub1" is followed by "npub2" and "npub4")
|