From 29696eb364d8a0cd609efa85b450c174c5806eda Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 9 Nov 2024 08:53:01 -0300 Subject: [PATCH 01/10] rename kind:11 as "forum thread root". --- 29.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/29.md b/29.md index 885dae4..ed57e51 100644 --- a/29.md +++ b/29.md @@ -66,9 +66,9 @@ These are the events expected to be found in NIP-29 groups. These events generally can be sent by all members of a group and they require the `h` tag to be present so they're attached to a specific group. -- *text root note* (`kind:11`) +- *thread root post* (`kind:11`) -This is the basic unit of a "microblog" root text note sent to a group. +This is the basic unit of a forum-like root thread post sent to a group. ```jsonc "kind": 11, From 39154346bb691191a1fc734e53d5eda08a1eec79 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 9 Nov 2024 08:56:29 -0300 Subject: [PATCH 02/10] remove kind:10 and note that kind:1111 could be used. --- 29.md | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/29.md b/29.md index ed57e51..b02cad2 100644 --- a/29.md +++ b/29.md @@ -66,12 +66,12 @@ These are the events expected to be found in NIP-29 groups. These events generally can be sent by all members of a group and they require the `h` tag to be present so they're attached to a specific group. -- *thread root post* (`kind:11`) +- _chat message_ (`kind:9`) -This is the basic unit of a forum-like root thread post sent to a group. +This is the basic unit of a _chat message_ sent to a group. ```jsonc - "kind": 11, + "kind": 9, "content": "hello my friends lovers of pizza", "tags": [ ["h", ""], @@ -80,19 +80,12 @@ This is the basic unit of a forum-like root thread post sent to a group. // other fields... ``` -- *threaded text reply* (`kind:12`) - -This is the basic unit of a "microblog" reply note sent to a group. It's the same as `kind:11`, except for the fact that it must be used whenever it's in reply to some other note (either in reply to a `kind:11` or a `kind:12`). `kind:12` events SHOULD use NIP-10 markers, leaving an empty relay url: - -* `["e", "", "", "root"]` -* `["e", "", "", "reply"]` - -- *chat message* (`kind:9`) +- _thread root post_ (`kind:11`) -This is the basic unit of a _chat message_ sent to a group. +This is the basic unit of a forum-like root thread post sent to a group. ```jsonc - "kind": 9, + "kind": 11, "content": "hello my friends lovers of pizza", "tags": [ ["h", ""], @@ -101,15 +94,9 @@ This is the basic unit of a _chat message_ sent to a group. // other fields... ``` -- *chat message threaded reply* (`kind:10`) - -Similar to `kind:12`, this is the basic unit of a chat message sent to a group. This is intended for in-chat threads that may be hidden by default. Not all in-chat replies MUST use `kind:10`, only when the intention is to create a hidden thread that isn't part of the normal flow of the chat (although clients are free to display those by default too). - -`kind:10` SHOULD use NIP-10 markers, just like `kind:12`. - -- other events: +- _other events_: -Groups may also accept other events, like long-form articles, calendar, livestream, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. +Groups may also accept other events, like [NIP-22](22.md) comments as threaded replies to both chats messages and threads, long-form articles, calendar, livestreams, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. ### User-related group management events From b58f02925e7ea05e9f104041cb6e42d146ab4c54 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 9 Nov 2024 08:56:43 -0300 Subject: [PATCH 03/10] rename kind:9000 to "put-user" instead of "add-user". --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/29.md b/29.md index b02cad2..5526b74 100644 --- a/29.md +++ b/29.md @@ -156,7 +156,7 @@ Each moderation action uses a different kind and requires different arguments, w | kind | name | tags | | --- | --- | --- | -| 9000 | `add-user` | `p` with pubkey hex and optional roles | +| 9000 | `put-user` | `p` with pubkey hex and optional roles | | 9001 | `remove-user` | `p` with pubkey hex | | 9002 | `edit-metadata` | fields from `kind:39000` to be modified | | 9005 | `delete-event` | | From 18bdc0ce8c80b68cd8e2c30c0dfd12c43e8b8bc0 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 9 Nov 2024 15:41:25 -0300 Subject: [PATCH 04/10] nip29: add missing "e" tag in kind:9005. --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/29.md b/29.md index 5526b74..e4673dd 100644 --- a/29.md +++ b/29.md @@ -159,7 +159,7 @@ Each moderation action uses a different kind and requires different arguments, w | 9000 | `put-user` | `p` with pubkey hex and optional roles | | 9001 | `remove-user` | `p` with pubkey hex | | 9002 | `edit-metadata` | fields from `kind:39000` to be modified | -| 9005 | `delete-event` | | +| 9005 | `delete-event` | `e` with event id hex | | 9007 | `create-group` | | | 9008 | `delete-group` | | | 9009 | `create-invite` | | From b8a5447e264333f1fb009fce9ea631c3d1009db9 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 9 Nov 2024 15:37:10 -0500 Subject: [PATCH 05/10] adds missing single letter tags --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 73e3f18..9bc2599 100644 --- a/README.md +++ b/README.md @@ -261,23 +261,32 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | name | value | other parameters | NIP | | ----------------- | ------------------------------------ | ------------------------------- | -------------------------------------------------- | -| `e` | event id (hex) | relay URL, marker, pubkey (hex) | [01](01.md), [10](10.md) | -| `p` | pubkey (hex) | relay URL, petname | [01](01.md), [02](02.md) | | `a` | coordinates to an event | relay URL | [01](01.md) | +| `A` | root address | relay URL | [22](22.md) | | `d` | identifier | -- | [01](01.md) | -| `-` | -- | -- | [70](70.md) | +| `e` | event id (hex) | relay URL, marker, pubkey (hex) | [01](01.md), [10](10.md) | +| `E` | root event i | relay URL | [22](22.md) | +| `f` | currency code | -- | [69](69.md) | | `g` | geohash | -- | [52](52.md) | | `h` | group id | -- | [29](29.md) | | `i` | external identity | proof, url hint | [35](35.md), [39](39.md), [73](73.md) | +| `I` | root external identity | -- | [22](22.md) | | `k` | kind | -- | [18](18.md), [25](25.md), [72](72.md), [73](73.md) | +| `K` | root scope | -- | [22](22.md) | | `l` | label, label namespace | -- | [32](32.md) | | `L` | label namespace | -- | [32](32.md) | | `m` | MIME type | -- | [94](94.md) | +| `p` | pubkey (hex) | relay URL, petname | [01](01.md), [02](02.md) | | `q` | event id (hex) | relay URL, pubkey (hex) | [18](18.md) | | `r` | a reference (URL, etc) | -- | [24](24.md), [25](25.md) | | `r` | relay url | marker | [65](65.md) | +| `s` | status | -- | [69](69.md) | | `t` | hashtag | -- | [24](24.md), [34](34.md), [35](35.md) | +| `u` | url | -- | [61](61.md), [98](98.md) | | `x` | infohash | -- | [35](35.md) | +| `y` | platform | -- | [69](69.md) | +| `z` | order number | -- | [69](69.md) | +| `-` | -- | -- | [70](70.md) | | `alt` | summary | -- | [31](31.md) | | `amount` | millisatoshis, stringified | -- | [57](57.md) | | `bolt11` | `bolt11` invoice | -- | [57](57.md) | From 926a51e72206dfa71b9950a0ce58b54a7422aad2 Mon Sep 17 00:00:00 2001 From: "Nostr.Band" <124499563+nostrband@users.noreply.github.com> Date: Tue, 12 Nov 2024 01:35:42 +0100 Subject: [PATCH 06/10] Nip46 upgrade part2: remove nip05 and create_account, clarify nostrconnect, cleanup, add nip05 signer metadata (#1553) --- 46.md | 169 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 81 insertions(+), 88 deletions(-) diff --git a/46.md b/46.md index c356a9c..60850aa 100644 --- a/46.md +++ b/46.md @@ -6,7 +6,7 @@ Nostr Remote Signing ## Changes -`remote-signer-key` is introduced, passed in bunker url, clients must differentiate between `remote-signer-pubkey` and `user-pubkey`, must call `get_public_key` after connect. +`remote-signer-key` is introduced, passed in bunker url, clients must differentiate between `remote-signer-pubkey` and `user-pubkey`, must call `get_public_key` after connect, nip05 login is removed, create_account moved to another NIP. ## Rationale @@ -25,6 +25,14 @@ This NIP describes a method for 2-way communication between a remote signer and All pubkeys specified in this NIP are in hex format. +## Overview + +1. _client_ generates `client-keypair`. This keypair doesn't need to be communicated to _user_ since it's largely disposable. _client_ might choose to store it locally and they should delete it on logout; +2. A connection is established (see below), _remote-signer_ learns `client-pubkey`, _client_ learns `remote-signer-pubkey`. +3. _client_ uses `client-keypair` to send requests to _remote-signer_ by `p`-tagging and encrypting to `remote-signer-pubkey`; +4. _remote-signer_ responds to _client_ by `p`-tagging and encrypting to the `client-pubkey`. +5. _client_ requests `get_public_key` to learn `user-pubkey`. + ## Initiating a connection There are two ways to initiate a connection: @@ -37,66 +45,16 @@ _remote-signer_ provides connection token in the form: bunker://?relay=&relay=&secret= ``` -_user_ pastes this token on _client_, which then uses the details to connect to _remote-signer_ via the specified relays. Optional secret can be used for single successfully established connection only, _remote-signer_ SHOULD ignore new attempts to establish connection with old optional secret. +_user_ passes this token to _client_, which then sends `connect` request to _remote-signer_ via the specified relays. Optional secret can be used for single successfully established connection only, _remote-signer_ SHOULD ignore new attempts to establish connection with old secret. -### Direct connection initiated by the client +### Direct connection initiated by the _client_ -In this case, basically the opposite direction of the first case, _client_ provides a connection token (or encodes the token in a QR code) and _remote-signer_ initiates a connection via the specified relays. +_client_ provides a connection token in the form: ``` -nostrconnect://?relay=&metadata= +nostrconnect://?relay=&metadata=&secret= ``` - -## The flow - -1. _client_ generates `client-keypair`. This keypair doesn't need to be communicated to _user_ since it's largely disposable. _client_ might choose to store it locally and they should delete it on logout; -2. _client_ gets `remote-signer-pubkey` (either via a `bunker://` connection string or a NIP-05 login-flow; shown below); -3. _client_ use `client-keypair` to send requests to _remote-signer_ by `p`-tagging and encrypting to `remote-signer-pubkey`; -4. _remote-signer_ responds to _client_ by `p`-tagging and encrypting to the `client-pubkey`. - -### Example flow for signing an event - -- `remote-signer-pubkey` is `fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52` -- `user-pubkey` is also `fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52` -- `client-pubkey` is `eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86` - -#### Signature request - -```js -{ - "kind": 24133, - "pubkey": "eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86", - "content": nip04({ - "id": , - "method": "sign_event", - "params": [json_stringified(<{ - content: "Hello, I'm signing remotely", - kind: 1, - tags: [], - created_at: 1714078911 - }>)] - }), - "tags": [["p", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52"]], // p-tags the remote-signer-pubkey -} -``` - -#### Response event - -```js -{ - "kind": 24133, - "pubkey": "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52", - "content": nip04({ - "id": , - "result": json_stringified() - }), - "tags": [["p", "eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86"]], // p-tags the client-pubkey -} -``` - -#### Diagram - -![signing-example](https://i.nostr.build/P3gW.png) +_user_ passes this token to _remote-signer_, which then sends `connect` *response* event to the `client-pubkey` via the specified relays. Client discovers `remote-signer-pubkey` from connect response author. `secret` value MUST be provided to avoid connection spoofing, _client_ MUST validate the `secret` returned by `connect` response. ## Request Events `kind: 24133` @@ -125,11 +83,11 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](04.md) encrypted ### Methods/Commands -Each of the following are methods that the client sends to the remote signer. +Each of the following are methods that the _client_ sends to the _remote-signer_. | Command | Params | Result | | ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- | -| `connect` | `[, , ]` | "ack" | +| `connect` | `[, , ]` | "ack" OR `` | | `sign_event` | `[<{kind, content, tags, created_at}>]` | `json_stringified()` | | `ping` | `[]` | "pong" | | `get_relays` | `[]` | `json_stringified({: {read: , write: }})` | @@ -138,11 +96,10 @@ Each of the following are methods that the client sends to the remote signer. | `nip04_decrypt` | `[, ]` | `` | | `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` | | `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` | -| `create_account` | `[<username>, <domain>, <optional_email>, <optional_requested_permissions>]` | `<newly_created_user_pubkey>` | ### Requested permissions -The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later. +The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later. Same permission format may be used for `perms` field of `metadata` in `nostrconnect://` string. ## Response Events `kind:24133` @@ -171,54 +128,90 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](04.md) encrypted - `results` is a string of the result of the call (this can be either a string or a JSON stringified object) - `error`, _optionally_, it is an error in string form, if any. Its presence indicates an error with the request. -### Auth Challenges +## Example flow for signing an event + +- `remote-signer-pubkey` is `fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52` +- `user-pubkey` is also `fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52` +- `client-pubkey` is `eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86` -An Auth Challenge is a response that a remote signer can send back when it needs the user to authenticate via other means. This is currently used in the OAuth-like flow enabled by signers like [Nsecbunker](https://github.com/kind-0/nsecbunkerd/). The response `content` object will take the following form: +### Signature request -```json +```js { - "id": <request_id>, - "result": "auth_url", - "error": <URL_to_display_to_end_user> + "kind": 24133, + "pubkey": "eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86", + "content": nip04({ + "id": <random_string>, + "method": "sign_event", + "params": [json_stringified(<{ + content: "Hello, I'm signing remotely", + kind: 1, + tags: [], + created_at: 1714078911 + }>)] + }), + "tags": [["p", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52"]], // p-tags the remote-signer-pubkey } ``` -Clients should display (in a popup or new tab) the URL from the `error` field and then subscribe/listen for another response from the remote signer (reusing the same request ID). This event will be sent once the user authenticates in the other window (or will never arrive if the user doesn't authenticate). It's also possible to add a `redirect_uri` url parameter to the auth_url, which is helpful in situations when a client cannot open a new window or tab to display the auth challenge. - -#### Example event signing request with auth challenge +### Response event -![signing-example-with-auth-challenge](https://i.nostr.build/W3aj.png) +```js +{ + "kind": 24133, + "pubkey": "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52", + "content": nip04({ + "id": <random_string>, + "result": json_stringified(<signed-event>) + }), + "tags": [["p", "eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86"]], // p-tags the client-pubkey +} +``` -## Appendix +### Diagram -### NIP-05 Login Flow +![signing-example](https://i.nostr.build/P3gW.png) -Clients might choose to present a more familiar login flow, so users can type a NIP-05 address instead of a `bunker://` string. -When the user types a NIP-05 the client: +## Auth Challenges -- Queries the `/.well-known/nostr.json` file from the domain for the NIP-05 address provided to get the user's pubkey (this is the `user-pubkey`) -- In the same `/.well-known/nostr.json` file, queries for the `nip46` key to get the relays that the remote signer will be listening on. -- Now the client has enough information to send commands to the remote signer on behalf of the user. +An Auth Challenge is a response that a _remote-signer_ can send back when it needs the _user_ to authenticate via other means. The response `content` object will take the following form: -### OAuth-like Flow +```json +{ + "id": <request_id>, + "result": "auth_url", + "error": <URL_to_display_to_end_user> +} +``` -#### Remote signer discovery via NIP-89 +_client_ should display (in a popup or new tab) the URL from the `error` field and then subscribe/listen for another response from the _remote-signer_ (reusing the same request ID). This event will be sent once the user authenticates in the other window (or will never arrive if the user doesn't authenticate). -In this last case, most often used to facilitate an OAuth-like signin flow, the client first looks for remote signers that have announced themselves via NIP-89 application handler events. +### Example event signing request with auth challenge -First the client will query for `kind: 31990` events that have a `k` tag of `24133`. +![signing-example-with-auth-challenge](https://i.nostr.build/W3aj.png) -These are generally shown to a user, and once the user selects which remote signer to use and provides the `user-pubkey` they want to use (via npub, pubkey, or nip-05 value), the client can initiate a connection. Note that it's on the user to select the _remote-signer_ that is actually managing the `user-keypair` that they would like to use in this case. If the `user-pubkey` is managed on another _remote-signer_ the connection will fail. +## Appendix -In addition, it's important that clients validate that the pubkey of the announced _remote-signer_ matches the pubkey of the `_` entry in the `/.well-known/nostr.json` file of the remote signer's announced domain. +### Announcing _remote-signer_ metadata -Clients that allow users to create new accounts should also consider validating the availability of a given username in the namespace of remote signer's domain by checking the `/.well-known/nostr.json` file for existing usernames. Clients can then show users feedback in the UI before sending a `create_account` event to the remote signer and receiving an error in return. Ideally, remote signers would also respond with understandable error messages if a client tries to create an account with an existing username. +_remote-signer_ MAY publish it's metadata by using [NIP-05](05.md) and [NIP-89](89.md). With NIP-05, a request to `<remote-signer>/.well-known/nostr.json?name=_` MAY return this: +``` +{ + "names":{ + "_": <remote-signer-app-pubkey>, + }, + "nip46": { + "relays": ["wss://relay1","wss://relay2"...], + "nostrconnect_url": "https://remote-signer-domain.com/<nostrconnect>" + } +} +``` -#### Example Oauth-like flow to create a new user account with Nsecbunker +The `<remote-signer-app-pubkey>` MAY be used to verify the domain from _remote-signer_'s NIP-89 event (see below). `relays` SHOULD be used to construct a more precise `nostrconnect://` string for the specific `remote-signer`. `nostrconnect_url` template MAY be used to redirect users to _remote-signer_'s connection flow by replacing `<nostrconnect>` placeholder with an actual `nostrconnect://` string. -Coming soon... +### Remote signer discovery via NIP-89 -## References +_remote-signer_ MAY publish a NIP-89 `kind: 31990` event with `k` tag of `24133`, which MAY also include one or more `relay` tags and MAY include `nostrconnect_url` tag. The semantics of `relay` and `nostrconnect_url` tags are the same as in the section above. -- [NIP-04 - Encryption](04.md) +_client_ MAY improve UX by discovering _remote-signers_ using their `kind: 31990` events. _client_ MAY then pre-generate `nostrconnect://` strings for the _remote-signers_, and SHOULD in that case verify that `kind: 31990` event's author is mentioned in signer's `nostr.json?name=_` file as `<remote-signer-app-pubkey>`. From 3e540a38e2da3e4ce93f50b2fb6f9009721db10d Mon Sep 17 00:00:00 2001 From: Asai Toshiya <to.asai.60@gmail.com> Date: Thu, 14 Nov 2024 22:43:44 +0900 Subject: [PATCH 07/10] update kinds table. --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9bc2599..ffda69c 100644 --- a/README.md +++ b/README.md @@ -108,9 +108,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `7` | Reaction | [25](25.md) | | `8` | Badge Award | [58](58.md) | | `9` | Group Chat Message | [29](29.md) | -| `10` | Group Chat Threaded Reply | [29](29.md) | +| `10` | Group Chat Threaded Reply | 29 (deprecated) | | `11` | Group Thread | [29](29.md) | -| `12` | Group Thread Reply | [29](29.md) | +| `12` | Group Thread Reply | 29 (deprecated) | | `13` | Seal | [59](59.md) | | `14` | Direct Message | [17](17.md) | | `16` | Generic Repost | [18](18.md) | @@ -127,6 +127,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `1040` | OpenTimestamps | [03](03.md) | | `1059` | Gift Wrap | [59](59.md) | | `1063` | File Metadata | [94](94.md) | +| `1111` | Comment | [22](22.md) | | `1311` | Live Chat Message | [53](53.md) | | `1617` | Patches | [34](34.md) | | `1621` | Issues | [34](34.md) | From 8f112857a256f2a6af943a28d45f30b363d1627a Mon Sep 17 00:00:00 2001 From: Asai Toshiya <to.asai.60@gmail.com> Date: Fri, 15 Nov 2024 08:34:58 +0900 Subject: [PATCH 08/10] fix typo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ffda69c..cbd45cf 100644 --- a/README.md +++ b/README.md @@ -266,7 +266,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `A` | root address | relay URL | [22](22.md) | | `d` | identifier | -- | [01](01.md) | | `e` | event id (hex) | relay URL, marker, pubkey (hex) | [01](01.md), [10](10.md) | -| `E` | root event i | relay URL | [22](22.md) | +| `E` | root event id | relay URL | [22](22.md) | | `f` | currency code | -- | [69](69.md) | | `g` | geohash | -- | [52](52.md) | | `h` | group id | -- | [29](29.md) | From eca0a83d097e274bc1c4b416315b5f2e924f7e02 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona <vitor@vitorpamplona.com> Date: Thu, 14 Nov 2024 16:53:33 -0500 Subject: [PATCH 09/10] Moves deprecated stuff to the bottom --- 10.md | 57 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/10.md b/10.md index 94db4fa..c1d5068 100644 --- a/10.md +++ b/10.md @@ -10,33 +10,6 @@ On "e" and "p" tags in Text Events (kind 1) ## Abstract This NIP describes how to use "e" and "p" tags in text events, especially those that are replies to other text events. It helps clients thread the replies into a tree rooted at the original event. -## Positional "e" tags (DEPRECATED) ->This scheme is in common use; but should be considered deprecated. - -`["e", <event-id>, <relay-url>]` as per NIP-01. - -Where: - - * `<event-id>` is the id of the event being referenced. - * `<relay-url>` is the URL of a recommended relay associated with the reference. Many clients treat this field as optional. - -**The positions of the "e" tags within the event denote specific meanings as follows**: - - * No "e" tag: <br> - This event is not a reply to, nor does it refer to, any other event. - - * One "e" tag: <br> - `["e", <id>]`: The id of the event to which this event is a reply. - - * Two "e" tags: `["e", <root-id>]`, `["e", <reply-id>]` <br> - `<root-id>` is the id of the event at the root of the reply chain. `<reply-id>` is the id of the article to which this event is a reply. - - * Many "e" tags: `["e", <root-id>]` `["e", <mention-id>]`, ..., `["e", <reply-id>]`<br> -There may be any number of `<mention-ids>`. These are the ids of events which may, or may not be in the reply chain. -They are citing from this event. `root-id` and `reply-id` are as above. - ->This scheme is deprecated because it creates ambiguities that are difficult, or impossible to resolve when an event references another but is not a reply. - ## Marked "e" tags (PREFERRED) `["e", <event-id>, <relay-url>, <marker>, <pubkey>]` @@ -62,3 +35,33 @@ When replying to a text event E the reply event's "p" tags should contain all of Example: Given a text event authored by `a1` with "p" tags [`p1`, `p2`, `p3`] then the "p" tags of the reply should be [`a1`, `p1`, `p2`, `p3`] in no particular order. + +## Deprecated Positional "e" tags + +This scheme is not in common use anymore and is here just to keep backward compatibility with older events on the network. + +Positional `e` tags are deprecated because they create ambiguities that are difficult, or impossible to resolve when an event references another but is not a reply. + +They use simple `e` tags without any marker. + +`["e", <event-id>, <relay-url>]` as per NIP-01. + +Where: + + * `<event-id>` is the id of the event being referenced. + * `<relay-url>` is the URL of a recommended relay associated with the reference. Many clients treat this field as optional. + +**The positions of the "e" tags within the event denote specific meanings as follows**: + + * No "e" tag: <br> + This event is not a reply to, nor does it refer to, any other event. + + * One "e" tag: <br> + `["e", <id>]`: The id of the event to which this event is a reply. + + * Two "e" tags: `["e", <root-id>]`, `["e", <reply-id>]` <br> + `<root-id>` is the id of the event at the root of the reply chain. `<reply-id>` is the id of the article to which this event is a reply. + + * Many "e" tags: `["e", <root-id>]` `["e", <mention-id>]`, ..., `["e", <reply-id>]`<br> +There may be any number of `<mention-ids>`. These are the ids of events which may, or may not be in the reply chain. +They are citing from this event. `root-id` and `reply-id` are as above. \ No newline at end of file From 8794be6775a6264a82ed8044b14f3c5e4eb01122 Mon Sep 17 00:00:00 2001 From: Josh Brown <josh@roadfiresoftware.com> Date: Fri, 15 Nov 2024 11:14:19 -0500 Subject: [PATCH 10/10] Fix typo in NIP-29 --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/29.md b/29.md index e4673dd..f0ba8ab 100644 --- a/29.md +++ b/29.md @@ -26,7 +26,7 @@ Group identifiers must be strings restricted to the characters `a-z0-9-_`. When encountering just the `<host>` without the `'<group-id>`, clients can choose to connect to the group with id `_`, which is a special top-level group dedicated to relay-local discussions. -Group identifiers in most cases should be random or pseudo-random, as that mitigates message replay confusiong and ensures they can be migrated or forked to other relays easily without risking conflicting with other groups using the same id in these new relays. This isn't a hard rule, as, for example, in `unmanaged` and/or ephemeral relays groups might not want to migrate ever, so they might not care about this. Notably, the `_` relay-local group isn't expected to be migrated ever. +Group identifiers in most cases should be random or pseudo-random, as that mitigates message replay confusion and ensures they can be migrated or forked to other relays easily without risking conflicting with other groups using the same id in these new relays. This isn't a hard rule, as, for example, in `unmanaged` and/or ephemeral relays groups might not want to migrate ever, so they might not care about this. Notably, the `_` relay-local group isn't expected to be migrated ever. ## The `h` tag