--- title: WAKU-APP-QAKU name: Waku App Qaku category: Standards Track tags: waku editor: contributors: - Jimmy Debe --- ## Abstract The document describes the different components of the Qaku web application. Qaku is a Waku web applications that utilizes some Waku protocols to provide a private and censorship-resistent question and answer service. ## Background Waku is a family of robust, censorship-resistant communication protocols designed to enable privacy-focused messaging for the decentralized web. 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 aims to solve this by utilizing a few [10/WAKU]() protocols to create a Q&A forum. The user can create a Q&A board with a wallet address, send questions or answers directly to other peers without the need of storing and/or retrieving the content from a centralized server/domain. 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). Clients publish questions to a `content-topic` address which is held by the Waku Network. A collection of questions are owned by the `content-topic`, while a collection of answers are owned by the questions. All clients MUST have and identity recognized by the network to publish new content. More on identity [below](#identity). ### 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 all initial Q&A board. 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[], // a list of addresses moderation: boolean, // description: string, updated: number, startDate: number, endDate?: number, allowsParticipantsReplies: number, delegationInfo?: DelegationInfo ] } ``` `id`: - MAY be generated from the `title` value, `timestamp` value, and the `owner` public address value. - MAY be hexadecimal characters of SHA-256*** Clients subscribed to the Q&A board `content-topic`, using the [12/WAKU2-FILTER](), MUST be able to view the `ControlMessage`. ### 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. ### Messages The Waku network processes real-time message updates, which enables new questions and answers to be acceisble quickly. A conec ulti Messages are sent to a `content_topic` that are identified as a `message_type`. The [13/WAKU-STORE]() nodes provide historical storage of the Qaku messages. The following `message_type`s used in Qaku include: - Question Message - Answered Message - Upvote Message - Moderation Message - Poll Message #### Question Message The `QuestionMessage` type is generated by any user asking a new question on a Qaku board. - ```js { "QuestionMessage" : [ "question": string, "timestamp": number, "author?": identity, "delegationInfo?": delegationInfo ] } ``` #### Answered Message The `AnswerMessage` type is generated by any sending an answer to the Qaku board. - ```js { "AnswerMessage" : [ hash: string, text: string, timestamp: number, delegationInfo?: delegationInfo ] } ``` #### Upvote Message ```js { "UpVoteMessage" : [ questionId: string, hash: string, type: UpvoteType, timestamp: number, delegationInfo?: DelegationInfo; ] } ``` The owner MUST be able to enable and disable questions added to the board. When a new question is created, the interface SHOULD lis Qaku uses the following [10/WAKU]() protocols: - the [19/WAKU2-LIGHTPUSH](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/19/lightpush.md) to push a message type to the Waku network. - the [12/WAKU2-FILTER]() to subscribe to Waku `content_topic` and listen to messages published to that topic. - the [13/WAKU-STORE]() to query and load old messages from the Waku network for users. - A new `content_topic` is created when a new Q&A board is created. - All questions and answer are pushed to the content_topic ## Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). ## References