diff --git a/320.md b/320.md new file mode 100644 index 00000000..8311aea3 --- /dev/null +++ b/320.md @@ -0,0 +1,80 @@ +# Nostr Rating Mass + +## Problem +Ratings give the reputation for a **person**, **service** or **product**. They are important for creating an open and free-market. +It helps participants make decisions based on what their peers previously experienced with that person, services or product. + +Having a rating system in an open and decentralized system (like `nostr`) is hard because anyone can join and give ratings. +Thus bots will be created to overtake the honest human's votes. + +Some solutions have been proposed for this problem, but none of them is satisfactory (see [first comment](https://gist.github.com/motorina0/874912282d2419be4eaf89de8d0c4464?permalink_comment_id=4597165#gistcomment-4597165)). + +## Suggested Solution +In order to avoid spam, each rating must have associated with it the proof that a tiny fee has been paid. The fee should not be paid to a centralized service that can cheat (see [first comment](https://gist.github.com/motorina0/874912282d2419be4eaf89de8d0c4464?permalink_comment_id=4597165#gistcomment-4597165)), but to an impartial, decentralized system (like the bitcoin blockchain). + +### Rating Mass +A user can register its `public key` in a [Merkle tree](https://en.wikipedia.org/wiki/Merkle_tree) and the root of the tree is then persisted (by a specialized service) on the bitcoin blockchain using the `OP_RETURN` operator (thus paying a fee). Similarly with what [open-timestamps](https://opentimestamps.org/) does. + +If the `public key` is registered as the root of the tree then the `rating mass` is `1`, if it is registered on the second level then the `rating mass` is `1/2` (there can be two leaves). The lower one goes in the tree, the more leaves it can register, but also the less each leaf is worth (`rating mass` is `1/2``n` where `n` is the depth - starting at `0`). + +The properties of the tree are: +- Each leaf is of the form: `[, , ]`. +- Leaves can exist at any level. The closer to the tree root a leaf is, the more valuable it is. + +
+ +![rating-points-tree drawio(4)](https://user-images.githubusercontent.com/2951406/245187057-bb6ba330-e766-4c59-9519-1f2b09b4501c.png) + +Highlighted in the image is the path to leaf `[4, 0, a728...]` which is composed of `4` elements: `[hash([4,1,a728...]), H2, H7, H9]`. This path has a `rating mass` of `1/4`. + +For the above example (image), the public key `a728...` (yellow rectangles) has purchased `9 rating options` with a total mass of `0.8125` (`2 * 1/2``2` + `2 * 1/2``4` + `4 * 1/2``5`), whereas public key `1acf...` (purple rectangles) has purchased `3 rating options` with a mass of `0.1875` (`3 * 1/2``4`). The total mass of the tree will always be `1` (eg: `0.8125 + 0.1875`), because everybody knows that `1+2+4+⋯+2``𝑛` = `2``𝑛+1`` - 1`. + +### Rating Mass is not the Rating Value +The `rating value` can be an integer between `1 and 5`, or it can be a float between `0 and 1` (see this [NIP-32 PR](https://github.com/nostr-protocol/nips/pull/532)), or any other rating system. + +The `rating mass` represents the importance or intensity that a user gives to a particular rating. It also guarantees that the rating is not spam. + +For example I might dislike a film and give it a `rating value` of `2 stars` and a `rating mass` of `0.03125` (consume a leaf on level `5` of the tree: `1/2``5`). Or I might dislike that the Uber driver just dropped me off in a bad neighborhood and give it a `rating value` of `2 stars`, but a `rating mass` of `0.5` (consume a leaf on level `1` of the tree: `1/2``1`, more intense). + + +### Using Rating Mass in Nostr +Ratings in `nostr` can be achieved by publishing a particular event (see this [NIP-32 PR](https://github.com/nostr-protocol/nips/pull/532) to get an idea of how the event could look like) and attaching a `rating mass` to the event. + +This rating event should be a [Parameterized Replaceable Events (NIP-33)](https://github.com/nostr-protocol/nips/blob/master/33.md) and have these additional tags representing the `rating mass`: + +```json +{ + "kind": 30030, + "pubkey": , + "tags": [ + ["tx-id", ], + ["output-index", ], + ["leaf", , , ], + ["leaf-path", , , ...], + ["d", , , , , , ...)>], + ... + ], + "content": "...", + ... +} +``` + +The `d` tag is the most important one because it aggregates all the other values and because it is the one used to replace the [NIP-33](https://github.com/nostr-protocol/nips/blob/master/33.md) event. This means that the same `leaf` **cannot be used in two different rating events**. Trying to reuse the `leaf` will simply replace the previous rating event. On the other hand, if I have "consumed" one of my ratings for liking a song that I later discover it was plagiarised then I can take that rating back and reuse it one something else. + +> **Note** +> The `public key` in the `leaf` must be the same as the `public key` of the event creator. + +> **Note** +> Rating events without a `rating mass` or which have a very long path (are almost free) should not be taken into consideration + +### Next Steps +- detailed doc for the tree structures +- create a services that allows users to buy `rating mass` + - the user selects the levels it wants to register it public key at + - the services computes the cost + - the user pays the invoice and receives the full tree + +- create a service that computes ratings based on the `rating mass` assigned to each rating event + - this can be part of the relay, or a standalone service + +- integrate with social media clients, market clients, etc \ No newline at end of file