mirror of
https://github.com/Discreetly/server.git
synced 2026-01-07 19:53:55 -05:00
repo work
This commit is contained in:
40
Discreetly.md
Normal file
40
Discreetly.md
Normal file
@@ -0,0 +1,40 @@
|
||||
## Overview
|
||||
|
||||
Discreetly is an open protocol anonymous chat system.
|
||||
|
||||
The example scenario I am going to use throughout this document is a chat room for Steam games, where the barrier to entry for a room is a certain threshold of achievments accomplished in the game (20% by default?)
|
||||
|
||||
## Rooms
|
||||
|
||||
A room can be created by the server owner/admin, with certain criteria/barrier to entry.
|
||||
|
||||
### Karma Culling
|
||||
|
||||
In an anonmyous chat, it is (basically) impossible to know who said something the large majority didn't agree with, but you can prove that you _didn't_ say something. So we can use this to exclude very bad actors using a karma system where users can upvote or downvote messages, which under the hood are non-inclusion proofs, essentially saying "i didn't create this post, and I did or didn't like this".
|
||||
|
||||
> This non-inclusion proof includes a new "transiition identity commitment".
|
||||
|
||||
After a certain trigger (maybe a certain amount of time like 1 day to start and over time move to every 30 days? or after a certain action on chain), the group can choose to transition, where the server would generate a new version of the room, and everyone would have to make a new semaphore proof with either their old identity commitment or a new one, and everyone who wants to participate in the room would have to make a non-inclusion proof for any of the messages that broke some UPVOTE/DOWNVOTE threshold (configurable by the server, something like 2x more downvotes than upvotes, and [over 20 votes total] | [10% of the room] | [the lowest voted post]).
|
||||
|
||||
This would result in multiple iterations of a room, one for each transition, and the rate limit would change per iteration.
|
||||
|
||||
- Most Recent Room (T)
|
||||
- 1s
|
||||
- T-1
|
||||
- 10s
|
||||
- T-2
|
||||
- 100s // 1:40
|
||||
- T-3
|
||||
- 1000s // 16:40
|
||||
- T-4
|
||||
- 10000s // 2:46:40
|
||||
- T-5
|
||||
- 100000s // 27:46:40 // 1 day 3 hours 46 minutes 40 seconds
|
||||
- T-6
|
||||
- 1000000s // 11:13:46:40 // 11 days 13 hours 46 minutes 40 seconds
|
||||
- T-7
|
||||
- 10000000s // 1:03:13:46:40 // 1 month 3 days 13 hours 46 minutes 40 seconds
|
||||
- T-8
|
||||
- 100000000s // 11:09:03:13:46:40 // 11 months 9 days 3 hours 13 minutes 46 seconds 40 milliseconds
|
||||
- T-9
|
||||
- 1000000000s // 3:01:09:03:13:46:40 // 3 years 1 month 9 days 3 hours 13 minutes 46 seconds 40 milliseconds
|
||||
78
PLAN.md
Normal file
78
PLAN.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# ZK-Chat v2
|
||||
|
||||
## Credential Storage
|
||||
* Localstorage
|
||||
* Start with this, its easy, but not super secure
|
||||
* Cryptkeeper?
|
||||
* Sismo?
|
||||
* Zupass?
|
||||
* Walletconnect/metamask?
|
||||
|
||||
## Group Creation
|
||||
|
||||
* Admin (me) can make groups
|
||||
* by invite code
|
||||
* Permission to add 1 identity commitment
|
||||
* Gated Room Ideas (that you can watch, but can't participate in)
|
||||
* Steam Games!
|
||||
* ZK Stamps!
|
||||
* Events!
|
||||
* Devconnect
|
||||
|
||||
|
||||
### Types of Rooms/Groups
|
||||
| Type | Read | Write | Encrypted | Centralized | RLN Protected |
|
||||
| ------- | ------------- | ------------------------------- | ------------------- | ----------- | ------------- |
|
||||
| Gated | Y | via link/code for specific room | N | Y | Y |
|
||||
| ------- | ------------- | ------------------------------- | ------------------- | ----------- | ------------- |
|
||||
| Public? | Y | via link/code for all rooms | N | Y | Y |
|
||||
| Private | via link/code | via link/code for specific room | N | Y | Y |
|
||||
| Secure | via link/code | via link/code for specific room | Y (shared password) | Y | Y |
|
||||
| DM-P2P | via link/code | via link/code for specific room | Y (shared password) | N (p2p) | ? |
|
||||
|
||||
* Start with Gated Rooms
|
||||
|
||||
## Open Questions
|
||||
* P2P v Centralized?
|
||||
* Rate Limits?
|
||||
* Group Membership on contract?
|
||||
* Staking by tiers with different rate limits?
|
||||
* Should messages be ephemeral/temporary? (the last day?)
|
||||
|
||||
### Front End
|
||||
discreetly.chat will be the front end and backend
|
||||
#### Stack
|
||||
* Nuxtjs
|
||||
* websockets
|
||||
|
||||
#### Login
|
||||
* Cryptkeeper
|
||||
* Metamask
|
||||
* Walletconnect
|
||||
* Sismo
|
||||
* Zupass
|
||||
|
||||
### Back End
|
||||
discreetly.chat will be the front end and backend
|
||||
|
||||
stakers.chat will be a standalone backend for eth stakers
|
||||
|
||||
#### Stack
|
||||
* Javascript / Typescript
|
||||
* Node?
|
||||
* Libp2p?
|
||||
* Shorter development cycle
|
||||
* Dev process is annoying
|
||||
* One language stack which is nice
|
||||
* Python
|
||||
* Library compatibility issues with RLNjs and maybe any other ZK libraries
|
||||
* I could write it really fast
|
||||
* I miss python
|
||||
|
||||
#### Database
|
||||
|
||||
* Libp2p?
|
||||
* Waku?
|
||||
* IPFS?
|
||||
* Firebase?
|
||||
* SQLite? <- Leaning this way, keep all config/registration stuff in sqlite, and all messages in RAM/ephemeral
|
||||
12
README.md
Normal file
12
README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Dev
|
||||
|
||||
`npm i`
|
||||
|
||||
## Run Redis
|
||||
|
||||
Need to have a redis instance running
|
||||
|
||||
## Run the backend
|
||||
|
||||
`npm i`
|
||||
`npm run dev`
|
||||
14
package-lock.json
generated
14
package-lock.json
generated
@@ -13,7 +13,7 @@
|
||||
"body-parser": "^1.20.2",
|
||||
"cors": "^2.8.5",
|
||||
"discreetly-claimcodes": "^1.0.5",
|
||||
"discreetly-interfaces": "^0.1.3",
|
||||
"discreetly-interfaces": "^0.1.5",
|
||||
"dotenv": "^16.3.1",
|
||||
"express": "^4.18.2",
|
||||
"poseidon-lite": "^0.2.0",
|
||||
@@ -938,9 +938,9 @@
|
||||
"integrity": "sha512-ygx8rKtiweDg/Qj5qbHVy31osFV+CcGrNNtxDpeqqRnkO9tkqH9CvtdPJuR3R0R8vzT7kyBTwmN0LGQe3/aXhQ=="
|
||||
},
|
||||
"node_modules/discreetly-interfaces": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/discreetly-interfaces/-/discreetly-interfaces-0.1.3.tgz",
|
||||
"integrity": "sha512-9NC8KZukSB18/lR3hjHDO1WqMdsxxN0JXu6wOR/0mZ1eCNUkuh4sKkf/8C5xuU7NM0o/sK7wAm3/H0MR4DOkcg==",
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/discreetly-interfaces/-/discreetly-interfaces-0.1.5.tgz",
|
||||
"integrity": "sha512-RcdBvop3n8K4xlvD6/P9APD7nKhONNon++fh5UdDqa3bjWxLtZsaHna7pTfIuymjUmimDrqiMVB6JCS3ys4MFw==",
|
||||
"dependencies": {
|
||||
"poseidon-lite": "^0.2.0",
|
||||
"rlnjs": "^3.1.4"
|
||||
@@ -3116,9 +3116,9 @@
|
||||
"integrity": "sha512-ygx8rKtiweDg/Qj5qbHVy31osFV+CcGrNNtxDpeqqRnkO9tkqH9CvtdPJuR3R0R8vzT7kyBTwmN0LGQe3/aXhQ=="
|
||||
},
|
||||
"discreetly-interfaces": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/discreetly-interfaces/-/discreetly-interfaces-0.1.3.tgz",
|
||||
"integrity": "sha512-9NC8KZukSB18/lR3hjHDO1WqMdsxxN0JXu6wOR/0mZ1eCNUkuh4sKkf/8C5xuU7NM0o/sK7wAm3/H0MR4DOkcg==",
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/discreetly-interfaces/-/discreetly-interfaces-0.1.5.tgz",
|
||||
"integrity": "sha512-RcdBvop3n8K4xlvD6/P9APD7nKhONNon++fh5UdDqa3bjWxLtZsaHna7pTfIuymjUmimDrqiMVB6JCS3ys4MFw==",
|
||||
"requires": {
|
||||
"poseidon-lite": "^0.2.0",
|
||||
"rlnjs": "^3.1.4"
|
||||
|
||||
Reference in New Issue
Block a user