# Reddit
## User stories
* Any user can create a subreddit
* Any user can join a subreddit
* Any member in a subreddit can create a post in that subreddit
* Any member in a subreddit can read and comment on posts in that subreddit
* Any member can edit/remove their own posts
* Any member can cast up/down votes on any post or comment
How best to design these stories
* Moderator can remove inappropriate posts in its subreddit
* Moderators earn the role by creating subreddits or being nominated by another moderator
* Admin can edit/remove all posts
## Entry relationship diagram
```mermaid
graph TD
subgraph Reddit DNA
subgraph subreddit DNA
Subreddit1
Subreddit2
end
subgraph conversations zome
subgraph comments
Comment1
Comment2
end
subgraph posts
Post1
Post2
end
end
subgraph user zome
Alice
Bob
Chris
David
end
Subreddit1 -- has_post --> Post1
Subreddit2 -- has_post --> Post2
Post1 -- has_comment --> Comment1
Post2 -- has_comment --> Comment2
Comment1 -.for_post.-> Post1
Comment2 -.for_post.-> Post2
Alice -- creates --> Post1
Bob -- creates --> Post2
Chris -- creates --> Comment1
Comment1 -.authored_by.-> Chris
David -- creates --> Comment2
Comment2 -.authored_by.-> David
Alice -- member_of --> Subreddit1
Bob -- member_of --> Subreddit2
Post1 -.author.-> Alice
Post1 -.for_subreddit.-> Subreddit1
Post2 -.author.-> Bob
Post2 -.for_subreddit.-> Subreddit2
end
```
```rust
Entry "anchor" {
struct Anchor {
anchor_type: String,
anchor_text: String
}
Links: {
reddit->subreddit,
users->user
}
}
Entry "subreddit" {
struct Subreddit {
creator_address: Address,
name: String,
description: String
}
Links: {
subreddit->post
}
}
Entry "vote" {
Enum Vote {
UpVote,
DownVote,
}
struct VoteCast {
vote: Vote,
voter: Address,
timestamp: u64
}
}
Entry "post" {
struct Post {
text: String,
author: Address,
subreddit: Address,
timestamp: u64,
votes: Vec<VoteCast>
}
Links: {
post->comment
}
}
Entry "comment" {
struct Comment {
post: Address, // implicit link
author: Address, // implicit link
text: String
timestamp: u64,
votes: Vec<VoteCast>
}
Links: {
}
}
Entry "user" {
struct User {
name: String
}
Links: {
user->subreddit,
user->post,
user->comment
}
}
```
Validation
Subreddit
create - must be a member of reddit
Post
create - must be a member of subreddit and post must be signed
edit - must be author of the post
delete - must be author of the post
read - must be a member of the subreddit??
Comment - must be a member of subreddit and comment must be signed
Vote
castVote -
* must be a member of subreddit to cast a vote
* can only upVote, downVote once per post or comment
* can remove a vote if the agent is the original voter
Reputation-
Influenced by aggregates of
* [Number of upVotes + number of downVotes] by post or comment
* voteCasts? - how do vote casting influence reputation?
Queries needed to support votes/reputation -
For each agent
* votes (separated by up/down) received per authored post or comment
* vote cast per post or comment authored by other agents
* trends over time?
Detect/Prevent abuse & gaming?
* votes accepted only validated according to the policy (e.g. one vote per post/comment from each agent)
* pattern of votes for (voter, author)
* pattern of votes from a voter
* pattern of votes from voter group?
TO prevent threats to system integrity from sybil attacks where an adversary tries to overcome the system’s validation rules by spawning a large number of compromised nodes.
We have to construct domain-specific membrane functions that validates an agent when it requests to join the network.
- nodes to inform others of bad actors
- nodes to validate agent before joining
Eventual Consistency -
When do we know we've collected "all" votes?
* what's the cutoff signal?