Merge 5645b8bc1a213d68d749c02dda6237fd070de63e into c5fe03e5166e5f8032c445d02a23d57a88a5fe81

This commit is contained in:
Jimmy Debe 2025-11-21 10:05:52 -05:00 committed by GitHub
commit 76c0269c21
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View 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)