Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 196 additions & 0 deletions standards/application/qaku.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
---
title: WAKU-APP-QAKU
name: Waku App Qaku
category: Standards Track
tags: waku
editor:
contributors:
- Jimmy Debe <[email protected]>
---

## 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