diff options
| -rw-r--r-- | 63.md | 61 |
1 files changed, 61 insertions, 0 deletions
| @@ -0,0 +1,61 @@ | |||
| 1 | NIP-63 | ||
| 2 | ====== | ||
| 3 | |||
| 4 | Relay-based Paywalls | ||
| 5 | -------------------- | ||
| 6 | |||
| 7 | `draft` `optional` | ||
| 8 | |||
| 9 | This NIP specifies how relays can support _paywalled content_. Well, "paywall" is a misnomer as this NIP doesn't imply payment necessarily, it's agnostic about that, so better call it **premium content**. | ||
| 10 | |||
| 11 | The idea is that a _content-creator_ should be able to manage a list of _premium-reader_ who have access to their premium content, then choose some specific relays to publish their content based on their known support for this NIP. | ||
| 12 | |||
| 13 | Relays that support this NIP (as they could indicate in their [NIP-11](11.md) responses) should receive the list of users and use it together with [NIP-42](42.md) authentication in order to decide what content will be readable by each requester. | ||
| 14 | |||
| 15 | ### Premium event | ||
| 16 | |||
| 17 | Any event can be premium, all it needs is a [NIP-70](70.md) `["-"]` tag and another tag `["nip63"]` that clearly indicates its situation. | ||
| 18 | |||
| 19 | Because normal relays won't care about these tags it's enough for the _content-creator_ to release the event to these relays in order to make it "public" to everybody. | ||
| 20 | |||
| 21 | ### Membership Event | ||
| 22 | |||
| 23 | Membership events must be sent directly to the relays that will implement the paywall. By default relays should not serve these events to anyone, only to the _content-creator_ directly. Because of this, these lists can be kept reasonably private as long as the _content-creator_ is discrete in their publishing, but can also be made public by being published to other relays. | ||
| 24 | |||
| 25 | The lists are constituted of one event for each _premium-reader_, and their removal/update must be done with a [NIP-09](09.md) deletion request. | ||
| 26 | |||
| 27 | ```yaml | ||
| 28 | { | ||
| 29 | "kind": 1163, | ||
| 30 | "pubkey": "<content-creator>", | ||
| 31 | "tags": [ | ||
| 32 | ["p", "<premium-reader>"] | ||
| 33 | ], | ||
| 34 | // ...other fields | ||
| 35 | } | ||
| 36 | ``` | ||
| 37 | |||
| 38 | ### Relay behavior | ||
| 39 | |||
| 40 | A relay that implements this NIP should: | ||
| 41 | |||
| 42 | - signal `63` in its `supported_nips` NIP-11 field; | ||
| 43 | - accept `kind:1163` events and not serve them to anyone except to their creator; | ||
| 44 | - accept deletion requests for such events; | ||
| 45 | - accept premium events containing `["-"]` and `["nip63"]` tags only from their creator; | ||
| 46 | - only serve the premium events to users that have a matching `kind:1163`; | ||
| 47 | - serve an `AUTH` challenge to any client opening a connection immediately. | ||
| 48 | |||
| 49 | ### Client behavior | ||
| 50 | |||
| 51 | A client doesn't have to do much in order to access premium content: if a client is already very liberal with its authentication policies it will automatically perform NIP-42 AUTH whenever it connects to the relay; otherwise it may want to check if such relay supports `63` before deciding. | ||
| 52 | |||
| 53 | After that, any `REQ`s should include premium content automatically and transparently. This means that while constructiing a normal "following" feed a client will get the premium content automatically and place it in front of the user. | ||
| 54 | |||
| 55 | A client may decide to display these events differently if they have the `["nip63"]` tag. | ||
| 56 | |||
| 57 | ### Future additions | ||
| 58 | |||
| 59 | - more private list membership: perhaps doing an HMAC with the public key of the reader and a key that is shared with the relays will be enough for this. | ||
| 60 | - tiered membership: custom tiers for fine-grained content access control can be added by adding more tags to the `kind:1163` event and more items to the `["nip63"]` tag. | ||
| 61 | - teaser events: perhaps a `["nip63", "teaser"]` special tag could cause an event to be displayed only to those that do not have access to its premium counterpart, this would also be managed by the relay. | ||