diff --git a/91.md b/91.md new file mode 100644 index 0000000000..c4e6ef7495 --- /dev/null +++ b/91.md @@ -0,0 +1,20 @@ +# NIP-91: AND Operator in Filters + +Enable `AND` within a single tag filter by using an `&` modifier in filters for indexable tags. + +``` +filters: { + "kinds": [1], + "&t": ["meme", "cat"], + "#t": ["meme", "cat", "black", "white"] +} +// returns kind `1` events with `t` tags that have both "meme" and "cat" that have the tag "black" or "white" by NIP-91 relays, whereas relays without NIP-91 return entire result for local intersection. +``` + +## Rules + +- `AND` **MUST** take precedence over `OR` by relays +- Any tag value used in `AND` **SHOULD** be ignored in `OR` by relays supporting NIP-91 +- Tag values used in `AND` by libraries and clients **MUST** include standard `OR` tags [`#`] for compatibility with relays that do not support NIP-91. +- libraries and clients `SHOULD` run `&` post-filters after recieving results from relays; already standard practice. + diff --git a/README.md b/README.md index dd2e812ac1..5f8a2c3b72 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-84: Highlights](84.md) - [NIP-89: Recommended Application Handlers](89.md) - [NIP-90: Data Vending Machines](90.md) +- [NIP-91: AND filters](91.md) - [NIP-92: Media Attachments](92.md) - [NIP-94: File Metadata](94.md) - [NIP-96: HTTP File Storage Integration](96.md) @@ -201,6 +202,17 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos [lnpub]: https://github.com/shocknet/Lightning.Pub/blob/master/proto/autogenerated/client.md [joinstr]: https://gitlab.com/1440000bytes/joinstr/-/blob/main/NIP.md +## Filters + +| kind | description | NIP | +| --------------- | -------------------------- | ------------------------ | +| `authors` | by pubkey | [01](01.md) | +| `ids` | by ids | [01](01.md) | +| `kinds` | by kinds | [01](01.md) | +| `#{}` | by indexable tag (OR) | [01](01.md) | +| `&{}` | by indexable tag (AND) | [91](91.md) | +| `search` | by search times | [50](50.md) | + ## Message types ### Client to Relay