mirror of
https://github.com/logos-messaging/specs.git
synced 2026-01-02 14:13:06 +00:00
Merge 5645b8bc1a213d68d749c02dda6237fd070de63e into c5fe03e5166e5f8032c445d02a23d57a88a5fe81
This commit is contained in:
commit
76c0269c21
196
standards/application/qaku.md
Normal file
196
standards/application/qaku.md
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
---
|
||||||
|
title: WAKU-APP-QAKU
|
||||||
|
name: Waku App Qaku
|
||||||
|
category: Standards Track
|
||||||
|
tags: waku
|
||||||
|
editor:
|
||||||
|
contributors:
|
||||||
|
- Jimmy Debe <jimmy@status.im>
|
||||||
|
---
|
||||||
|
|
||||||
|
## Abstract
|
||||||
|
|
||||||
|
This document describes the different components of the Qaku web application.
|
||||||
|
Qaku is a Waku web applications that utilizes Waku protocols to provide a private and
|
||||||
|
censorship-resistent question and answer service.
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
The Qaku web application Waku is a family of robust,
|
||||||
|
censorship-resistant communication protocols designed to enable privacy-focused messaging for the decentralized web.
|
||||||
|
Using Wak
|
||||||
|
Current Q&A platforms are controlled by centralized organizations who have the ability to remove,
|
||||||
|
block and censor content published by any user.
|
||||||
|
This could cause a user to not express their ideas or ask reall questions with fear of prosecution by a thrid party.
|
||||||
|
|
||||||
|
Qaku uses some [10/WAKU](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/10/waku2.md) protocols to create a decentralized,
|
||||||
|
censorship-resistant Q&A forum.
|
||||||
|
The user can create a Q&A board with a identity address which publicly shared with other peers.
|
||||||
|
Questions and answers are sent directly to other peers without the need of storing and/or retrieving the content from a centralized provider.
|
||||||
|
Familiar features like upvoting, sharable links, and board moderation are also capable.
|
||||||
|
|
||||||
|
## Specification
|
||||||
|
|
||||||
|
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
|
||||||
|
“SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and
|
||||||
|
“OPTIONAL” in this document are to be interpreted as described in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt).
|
||||||
|
|
||||||
|
A Q&A board is a `content-topic` which is made available by on the Waku network.
|
||||||
|
Users subscribe to the `content-topic` using [12/WAKU2-FILTER](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/12/filter.md) and
|
||||||
|
to listen to new published messages.
|
||||||
|
Each message is identified by its `message_type`.
|
||||||
|
A collection of questions are the children of a `content-topic`,
|
||||||
|
while a collection of answers are the children of a question.
|
||||||
|
All clients MUST have an `identity` recognized by the network to publish new content.
|
||||||
|
|
||||||
|
### Identity
|
||||||
|
|
||||||
|
All clients MUST have `identity` consisting of a public address identifier in the form of a hexadecimal string.
|
||||||
|
Clients generate cryptographic key pair, public and private keys, and
|
||||||
|
the private key MAY be encrypt a password.
|
||||||
|
Public addresses are derived from the public keys as a hexadecimal string.
|
||||||
|
This address SHOULD be recongized by the other clients in the network to idenitify clients.
|
||||||
|
|
||||||
|
Each `identity` SHOULD be stored locally.
|
||||||
|
The address SHOULD be used to sign and verify messages.
|
||||||
|
|
||||||
|
### Creating a New Board
|
||||||
|
|
||||||
|
A client creating a new Q&A board is identitied as the `owner`.
|
||||||
|
The `owner` MAY share the `content-topic` with other clients,
|
||||||
|
as the `owner`is the first client to know the `content-topic` for the new board.
|
||||||
|
At the time of creation, the `owner` SHOULD create a `ControlMessage` to configure a Q&A board
|
||||||
|
and publish to the Waku network.
|
||||||
|
|
||||||
|
|
||||||
|
#### Control Message
|
||||||
|
|
||||||
|
This message contains the initial Q&A board configuration.
|
||||||
|
The `ControlMessage` SHOULD only be updated by the `owner`.
|
||||||
|
|
||||||
|
The `ControlMessage` is a JSON object:
|
||||||
|
|
||||||
|
- It MUST include a title name
|
||||||
|
- It MAY include a list of client public addresses identified as `admin`.
|
||||||
|
- It SHOULD include the public address of the `owner`, identity explianed [below](#Identity).
|
||||||
|
- It SHOULD include the start and end date for clients to publish a new post.
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
"ControlMessage" : [
|
||||||
|
title: string,
|
||||||
|
id: string,
|
||||||
|
enabled: boolean,
|
||||||
|
timestamp: number, // time the ControlMessage is created
|
||||||
|
owner: string, // the public address of the owner
|
||||||
|
admins: string[],
|
||||||
|
moderation: boolean,
|
||||||
|
description: string,
|
||||||
|
updated: number,
|
||||||
|
startDate: number, // optional, enforced by the application
|
||||||
|
allowsParticipantsReplies: number // optional, enforced by the application
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
`admins`:
|
||||||
|
- A list of client `identity` that are able to moderate the Q&A board
|
||||||
|
|
||||||
|
`id`:
|
||||||
|
- MAY be generated from the `title` value, `timestamp` value, and the `owner` public address value.
|
||||||
|
- RECOMMENDED hash using SHA256
|
||||||
|
|
||||||
|
`moderation`:
|
||||||
|
|
||||||
|
- If the question can be moderated by the `owner` and `admins`.
|
||||||
|
- It MUST be enforced by the application, see [messages](#Messsages)
|
||||||
|
|
||||||
|
Clients subscribed to the Q&A board `content-topic` using the [12/WAKU2-FILTER](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/12/filter.md),
|
||||||
|
MUST be able to view the `ControlMessage`.
|
||||||
|
|
||||||
|
### Other Message Types
|
||||||
|
|
||||||
|
The Waku network processes real-time message updates, which enables new questions and
|
||||||
|
answers to be acceisble quickly.
|
||||||
|
All questions and answers are published by the user or
|
||||||
|
the `owner` using [19/WAKU2-LIGHTPUSH](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/19/lightpush.md) on the Waku network.
|
||||||
|
Using the [13/WAKU-STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md) protocol,
|
||||||
|
published messages are stored by Waku store nodes.
|
||||||
|
When clients subscribe to a Q&A board, the message history is retrieved from [13/WAKU-STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md) nodes.
|
||||||
|
|
||||||
|
Clients messages published to a Q&A board's `content-topic` SHOULD remain accessible on the Waku network.
|
||||||
|
No client will be able to remove the message once published.
|
||||||
|
The `admins` and `owner` MAY moderate certain published messages making some content not visible to all users.
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
"ModerationMessage" : [
|
||||||
|
"hash": string, // The hash of the QuestionMessage
|
||||||
|
"moderated": boolean
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Question Message
|
||||||
|
|
||||||
|
The `QuestionMessage` type is generated by clients publishing a new question to a Q&A board.
|
||||||
|
Each question MAY have an `author` whos value is the publishing client's `identity`.
|
||||||
|
The client does not need to be the `owner` of the Q&A board.
|
||||||
|
Also the `owner` can not retrict any `identity` from publishing a message.
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
"QuestionMessage" : [
|
||||||
|
"question": string, // The question being published
|
||||||
|
"timestamp": number, // the time when the question being published
|
||||||
|
"author": identity // the identity of the client
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Answered Message
|
||||||
|
|
||||||
|
The `AnswerMessage` type is generated by clients publishing a answer to a question.
|
||||||
|
Each `AnswerMessage` SHOULD have a parent `QuestionMessage` type.
|
||||||
|
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
"AnsweredMessage" : [
|
||||||
|
questionId: string, // The parent QuestionMessage
|
||||||
|
hash: string, // Hash of the text
|
||||||
|
text: string, // The answer content
|
||||||
|
timestamp: number // The time of publishing the answer content
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Upvote Message
|
||||||
|
|
||||||
|
A `UpVoteMessage` is an optional feature that MUST be enforced by the web appliciation.
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
"UpVoteMessage" : [
|
||||||
|
questionId: string, The hash of the question
|
||||||
|
hash: string, // hash of the message
|
||||||
|
type: string, // the upvote for which message type (AnswerMessage or QuestionMessage)
|
||||||
|
timestamp: number, // the time of the upvote
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Copyright
|
||||||
|
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [10/WAKU](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/10/waku2.md)
|
||||||
|
- [12/WAKU2-FILTER](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/12/filter.md)
|
||||||
|
- [19/WAKU2-LIGHTPUSH](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/19/lightpush.md)
|
||||||
|
- [13/WAKU-STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md)
|
||||||
Loading…
x
Reference in New Issue
Block a user