mirror of
https://github.com/vacp2p/rfc-index.git
synced 2026-01-09 22:08:07 -05:00
790 lines
54 KiB
HTML
790 lines
54 KiB
HTML
<!DOCTYPE HTML>
|
|
<html lang="en" class="ayu" dir="ltr">
|
|
<head>
|
|
<!-- Book generated using mdBook -->
|
|
<meta charset="UTF-8">
|
|
<title>56/Communities - Vac RFC</title>
|
|
|
|
|
|
<!-- Custom HTML head -->
|
|
|
|
<meta name="description" content="">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="theme-color" content="#ffffff">
|
|
|
|
<link rel="icon" href="../../favicon.svg">
|
|
<link rel="shortcut icon" href="../../favicon.png">
|
|
<link rel="stylesheet" href="../../css/variables.css">
|
|
<link rel="stylesheet" href="../../css/general.css">
|
|
<link rel="stylesheet" href="../../css/chrome.css">
|
|
<link rel="stylesheet" href="../../css/print.css" media="print">
|
|
|
|
<!-- Fonts -->
|
|
<link rel="stylesheet" href="../../FontAwesome/css/font-awesome.css">
|
|
<link rel="stylesheet" href="../../fonts/fonts.css">
|
|
|
|
<!-- Highlight.js Stylesheets -->
|
|
<link rel="stylesheet" href="../../highlight.css">
|
|
<link rel="stylesheet" href="../../tomorrow-night.css">
|
|
<link rel="stylesheet" href="../../ayu-highlight.css">
|
|
|
|
<!-- Custom theme stylesheets -->
|
|
<link rel="stylesheet" href="../../custom.css">
|
|
|
|
</head>
|
|
<body class="sidebar-visible no-js">
|
|
<div id="body-container">
|
|
<!-- Provide site root to javascript -->
|
|
<script>
|
|
var path_to_root = "../../";
|
|
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "ayu";
|
|
</script>
|
|
|
|
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
|
<script>
|
|
try {
|
|
var theme = localStorage.getItem('mdbook-theme');
|
|
var sidebar = localStorage.getItem('mdbook-sidebar');
|
|
|
|
if (theme.startsWith('"') && theme.endsWith('"')) {
|
|
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
|
}
|
|
|
|
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
|
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
|
}
|
|
} catch (e) { }
|
|
</script>
|
|
|
|
<!-- Set the theme before any content is loaded, prevents flash -->
|
|
<script>
|
|
var theme;
|
|
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
|
if (theme === null || theme === undefined) { theme = default_theme; }
|
|
var html = document.querySelector('html');
|
|
html.classList.remove('ayu')
|
|
html.classList.add(theme);
|
|
var body = document.querySelector('body');
|
|
body.classList.remove('no-js')
|
|
body.classList.add('js');
|
|
</script>
|
|
|
|
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
|
|
|
<!-- Hide / unhide sidebar before it is displayed -->
|
|
<script>
|
|
var body = document.querySelector('body');
|
|
var sidebar = null;
|
|
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
|
if (document.body.clientWidth >= 1080) {
|
|
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
|
sidebar = sidebar || 'visible';
|
|
} else {
|
|
sidebar = 'hidden';
|
|
}
|
|
sidebar_toggle.checked = sidebar === 'visible';
|
|
body.classList.remove('sidebar-visible');
|
|
body.classList.add("sidebar-" + sidebar);
|
|
</script>
|
|
|
|
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
|
<div class="sidebar-scrollbox">
|
|
<ol class="chapter"><li class="chapter-item expanded affix "><a href="../../index.html">Introduction</a></li><li class="chapter-item expanded "><a href="../../vac/index.html"><strong aria-hidden="true">1.</strong> Vac</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../vac/1/coss.html"><strong aria-hidden="true">1.1.</strong> 1/COSS</a></li><li class="chapter-item expanded "><a href="../../vac/2/mvds.html"><strong aria-hidden="true">1.2.</strong> 2/MVDS</a></li><li class="chapter-item expanded "><a href="../../vac/3/remote-log.html"><strong aria-hidden="true">1.3.</strong> 3/Remote Log</a></li><li class="chapter-item expanded "><a href="../../vac/4/mvds-meta.html"><strong aria-hidden="true">1.4.</strong> 4/MVDS Meta</a></li><li class="chapter-item expanded "><a href="../../vac/25/libp2p-dns-discovery.html"><strong aria-hidden="true">1.5.</strong> 25/Libp2p DNS Discovery</a></li><li class="chapter-item expanded "><a href="../../vac/32/rln-v1.html"><strong aria-hidden="true">1.6.</strong> 32/RLN-V1</a></li><li class="chapter-item expanded "><a href="../../vac/raw/index.html"><strong aria-hidden="true">1.7.</strong> Raw</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../vac/raw/consensus-hashgraphlike.html"><strong aria-hidden="true">1.7.1.</strong> Consensus Hashgraphlike</a></li><li class="chapter-item expanded "><a href="../../vac/raw/decentralized-messaging-ethereum.html"><strong aria-hidden="true">1.7.2.</strong> Decentralized Messaging Ethereum</a></li><li class="chapter-item expanded "><a href="../../vac/raw/eth-mls-offchain.html"><strong aria-hidden="true">1.7.3.</strong> ETH MLS Offchain</a></li><li class="chapter-item expanded "><a href="../../vac/raw/eth-mls-onchain.html"><strong aria-hidden="true">1.7.4.</strong> ETH MLS Onchain</a></li><li class="chapter-item expanded "><a href="../../vac/raw/deleted/eth-secpm.html"><strong aria-hidden="true">1.7.5.</strong> ETH SecPM</a></li><li class="chapter-item expanded "><a href="../../vac/raw/gossipsub-tor-push.html"><strong aria-hidden="true">1.7.6.</strong> Gossipsub Tor Push</a></li><li class="chapter-item expanded "><a href="../../vac/raw/logos-capability-discovery.html"><strong aria-hidden="true">1.7.7.</strong> Logos Capability Discovery</a></li><li class="chapter-item expanded "><a href="../../vac/raw/mix.html"><strong aria-hidden="true">1.7.8.</strong> Mix</a></li><li class="chapter-item expanded "><a href="../../vac/raw/noise-x3dh-double-ratchet.html"><strong aria-hidden="true">1.7.9.</strong> Noise X3DH Double Ratchet</a></li><li class="chapter-item expanded "><a href="../../vac/raw/rln-interep-spec.html"><strong aria-hidden="true">1.7.10.</strong> RLN Interep Spec</a></li><li class="chapter-item expanded "><a href="../../vac/raw/rln-stealth-commitments.html"><strong aria-hidden="true">1.7.11.</strong> RLN Stealth Commitments</a></li><li class="chapter-item expanded "><a href="../../vac/raw/rln-v2.html"><strong aria-hidden="true">1.7.12.</strong> RLN-V2</a></li><li class="chapter-item expanded "><a href="../../vac/raw/sds.html"><strong aria-hidden="true">1.7.13.</strong> SDS</a></li></ol></li><li class="chapter-item expanded "><a href="../../vac/template.html"><strong aria-hidden="true">1.8.</strong> Template</a></li></ol></li><li class="chapter-item expanded "><a href="../../waku/index.html"><strong aria-hidden="true">2.</strong> Waku</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../waku/standards/core/index.html"><strong aria-hidden="true">2.1.</strong> Standards - Core</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../waku/standards/core/10/waku2.html"><strong aria-hidden="true">2.1.1.</strong> 10/Waku2</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/11/relay.html"><strong aria-hidden="true">2.1.2.</strong> 11/Relay</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/12/filter.html"><strong aria-hidden="true">2.1.3.</strong> 12/Filter</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/13/store.html"><strong aria-hidden="true">2.1.4.</strong> 13/Store</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/14/message.html"><strong aria-hidden="true">2.1.5.</strong> 14/Message</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/15/bridge.html"><strong aria-hidden="true">2.1.6.</strong> 15/Bridge</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/17/rln-relay.html"><strong aria-hidden="true">2.1.7.</strong> 17/RLN Relay</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/19/lightpush.html"><strong aria-hidden="true">2.1.8.</strong> 19/Lightpush</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/31/enr.html"><strong aria-hidden="true">2.1.9.</strong> 31/ENR</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/33/discv5.html"><strong aria-hidden="true">2.1.10.</strong> 33/Discv5</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/34/peer-exchange.html"><strong aria-hidden="true">2.1.11.</strong> 34/Peer Exchange</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/36/bindings-api.html"><strong aria-hidden="true">2.1.12.</strong> 36/Bindings API</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/64/network.html"><strong aria-hidden="true">2.1.13.</strong> 64/Network</a></li><li class="chapter-item expanded "><a href="../../waku/standards/core/66/metadata.html"><strong aria-hidden="true">2.1.14.</strong> 66/Metadata</a></li></ol></li><li class="chapter-item expanded "><a href="../../waku/standards/application/index.html"><strong aria-hidden="true">2.2.</strong> Standards - Application</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../waku/standards/application/20/toy-eth-pm.html"><strong aria-hidden="true">2.2.1.</strong> 20/Toy ETH PM</a></li><li class="chapter-item expanded "><a href="../../waku/standards/application/26/payload.html"><strong aria-hidden="true">2.2.2.</strong> 26/Payload</a></li><li class="chapter-item expanded "><a href="../../waku/standards/application/53/x3dh.html"><strong aria-hidden="true">2.2.3.</strong> 53/X3DH</a></li><li class="chapter-item expanded "><a href="../../waku/standards/application/54/x3dh-sessions.html"><strong aria-hidden="true">2.2.4.</strong> 54/X3DH Sessions</a></li></ol></li><li class="chapter-item expanded "><a href="../../waku/standards/legacy/index.html"><strong aria-hidden="true">2.3.</strong> Standards - Legacy</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../waku/standards/legacy/6/waku1.html"><strong aria-hidden="true">2.3.1.</strong> 6/Waku1</a></li><li class="chapter-item expanded "><a href="../../waku/standards/legacy/7/data.html"><strong aria-hidden="true">2.3.2.</strong> 7/Data</a></li><li class="chapter-item expanded "><a href="../../waku/standards/legacy/8/mail.html"><strong aria-hidden="true">2.3.3.</strong> 8/Mail</a></li><li class="chapter-item expanded "><a href="../../waku/standards/legacy/9/rpc.html"><strong aria-hidden="true">2.3.4.</strong> 9/RPC</a></li></ol></li><li class="chapter-item expanded "><a href="../../waku/informational/index.html"><strong aria-hidden="true">2.4.</strong> Informational</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../waku/informational/22/toy-chat.html"><strong aria-hidden="true">2.4.1.</strong> 22/Toy Chat</a></li><li class="chapter-item expanded "><a href="../../waku/informational/23/topics.html"><strong aria-hidden="true">2.4.2.</strong> 23/Topics</a></li><li class="chapter-item expanded "><a href="../../waku/informational/27/peers.html"><strong aria-hidden="true">2.4.3.</strong> 27/Peers</a></li><li class="chapter-item expanded "><a href="../../waku/informational/29/config.html"><strong aria-hidden="true">2.4.4.</strong> 29/Config</a></li><li class="chapter-item expanded "><a href="../../waku/informational/30/adaptive-nodes.html"><strong aria-hidden="true">2.4.5.</strong> 30/Adaptive Nodes</a></li></ol></li><li class="chapter-item expanded "><a href="../../waku/deprecated/index.html"><strong aria-hidden="true">2.5.</strong> Deprecated</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../waku/deprecated/5/waku0.html"><strong aria-hidden="true">2.5.1.</strong> 5/Waku0</a></li><li class="chapter-item expanded "><a href="../../waku/deprecated/16/rpc.html"><strong aria-hidden="true">2.5.2.</strong> 16/RPC</a></li><li class="chapter-item expanded "><a href="../../waku/deprecated/18/swap.html"><strong aria-hidden="true">2.5.3.</strong> 18/Swap</a></li><li class="chapter-item expanded "><a href="../../waku/deprecated/fault-tolerant-store.html"><strong aria-hidden="true">2.5.4.</strong> Fault Tolerant Store</a></li></ol></li></ol></li><li class="chapter-item expanded "><a href="../../nomos/index.html"><strong aria-hidden="true">3.</strong> Nomos</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../nomos/raw/index.html"><strong aria-hidden="true">3.1.</strong> Raw</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../nomos/raw/nomosda-encoding.html"><strong aria-hidden="true">3.1.1.</strong> NomosDA Encoding</a></li><li class="chapter-item expanded "><a href="../../nomos/raw/nomosda-network.html"><strong aria-hidden="true">3.1.2.</strong> NomosDA Network</a></li><li class="chapter-item expanded "><a href="../../nomos/raw/p2p-hardware-requirements.html"><strong aria-hidden="true">3.1.3.</strong> P2P Hardware Requirements</a></li><li class="chapter-item expanded "><a href="../../nomos/raw/p2p-nat-solution.html"><strong aria-hidden="true">3.1.4.</strong> P2P NAT Solution</a></li><li class="chapter-item expanded "><a href="../../nomos/raw/p2p-network-bootstrapping.html"><strong aria-hidden="true">3.1.5.</strong> P2P Network Bootstrapping</a></li><li class="chapter-item expanded "><a href="../../nomos/raw/p2p-network.html"><strong aria-hidden="true">3.1.6.</strong> P2P Network</a></li><li class="chapter-item expanded "><a href="../../nomos/raw/sdp.html"><strong aria-hidden="true">3.1.7.</strong> SDP</a></li></ol></li><li class="chapter-item expanded "><a href="../../nomos/deprecated/index.html"><strong aria-hidden="true">3.2.</strong> Deprecated</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../nomos/deprecated/claro.html"><strong aria-hidden="true">3.2.1.</strong> Claro</a></li></ol></li></ol></li><li class="chapter-item expanded "><a href="../../codex/index.html"><strong aria-hidden="true">4.</strong> Codex</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../codex/raw/index.html"><strong aria-hidden="true">4.1.</strong> Raw</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../codex/raw/codex-block-exchange.html"><strong aria-hidden="true">4.1.1.</strong> Block Exchange</a></li><li class="chapter-item expanded "><a href="../../codex/raw/codex-marketplace.html"><strong aria-hidden="true">4.1.2.</strong> Marketplace</a></li></ol></li></ol></li><li class="chapter-item expanded "><a href="../../status/index.html"><strong aria-hidden="true">5.</strong> Status</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../status/24/curation.html"><strong aria-hidden="true">5.1.</strong> 24/Curation</a></li><li class="chapter-item expanded "><a href="../../status/28/featuring.html"><strong aria-hidden="true">5.2.</strong> 28/Featuring</a></li><li class="chapter-item expanded "><a href="../../status/55/1to1-chat.html"><strong aria-hidden="true">5.3.</strong> 55/1-to-1 Chat</a></li><li class="chapter-item expanded "><a href="../../status/56/communities.html" class="active"><strong aria-hidden="true">5.4.</strong> 56/Communities</a></li><li class="chapter-item expanded "><a href="../../status/61/community-history-service.html"><strong aria-hidden="true">5.5.</strong> 61/Community History Service</a></li><li class="chapter-item expanded "><a href="../../status/62/payloads.html"><strong aria-hidden="true">5.6.</strong> 62/Payloads</a></li><li class="chapter-item expanded "><a href="../../status/63/keycard-usage.html"><strong aria-hidden="true">5.7.</strong> 63/Keycard Usage</a></li><li class="chapter-item expanded "><a href="../../status/65/account-address.html"><strong aria-hidden="true">5.8.</strong> 65/Account Address</a></li><li class="chapter-item expanded "><a href="../../status/71/push-notification-server.html"><strong aria-hidden="true">5.9.</strong> 71/Push Notification Server</a></li><li class="chapter-item expanded "><a href="../../status/raw/index.html"><strong aria-hidden="true">5.10.</strong> Raw</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../status/raw/simple-scaling.html"><strong aria-hidden="true">5.10.1.</strong> Simple Scaling</a></li><li class="chapter-item expanded "><a href="../../status/raw/status-app-protocols.html"><strong aria-hidden="true">5.10.2.</strong> Status App Protocols</a></li><li class="chapter-item expanded "><a href="../../status/raw/status-mvds.html"><strong aria-hidden="true">5.10.3.</strong> Status MVDS</a></li><li class="chapter-item expanded "><a href="../../status/raw/url-data.html"><strong aria-hidden="true">5.10.4.</strong> URL Data</a></li><li class="chapter-item expanded "><a href="../../status/raw/url-scheme.html"><strong aria-hidden="true">5.10.5.</strong> URL Scheme</a></li></ol></li><li class="chapter-item expanded "><a href="../../status/deprecated/index.html"><strong aria-hidden="true">5.11.</strong> Deprecated</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../status/deprecated/3rd-party.html"><strong aria-hidden="true">5.11.1.</strong> 3rd Party</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/account.html"><strong aria-hidden="true">5.11.2.</strong> Account</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/client.html"><strong aria-hidden="true">5.11.3.</strong> Client</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/dapp-browser-API-usage.html"><strong aria-hidden="true">5.11.4.</strong> Dapp Browser API Usage</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/eips.html"><strong aria-hidden="true">5.11.5.</strong> EIPs</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/ethereum-usage.html"><strong aria-hidden="true">5.11.6.</strong> Ethereum Usage</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/group-chat.html"><strong aria-hidden="true">5.11.7.</strong> Group Chat</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/IPFS-gateway-for-sticker-Pack.html"><strong aria-hidden="true">5.11.8.</strong> IPFS Gateway for Sticker Pack</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/keycard-usage-for-wallet-and-chat-keys.html"><strong aria-hidden="true">5.11.9.</strong> Keycard Usage for Wallet and Chat Keys</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/notifications.html"><strong aria-hidden="true">5.11.10.</strong> Notifications</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/payloads.html"><strong aria-hidden="true">5.11.11.</strong> Payloads</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/push-notification-server.html"><strong aria-hidden="true">5.11.12.</strong> Push Notification Server</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/secure-transport.html"><strong aria-hidden="true">5.11.13.</strong> Secure Transport</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/waku-mailserver.html"><strong aria-hidden="true">5.11.14.</strong> Waku Mailserver</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/waku-usage.html"><strong aria-hidden="true">5.11.15.</strong> Waku Usage</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/whisper-mailserver.html"><strong aria-hidden="true">5.11.16.</strong> Whisper Mailserver</a></li><li class="chapter-item expanded "><a href="../../status/deprecated/whisper-usage.html"><strong aria-hidden="true">5.11.17.</strong> Whisper Usage</a></li></ol></li></ol></li></ol>
|
|
</div>
|
|
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
|
<div class="sidebar-resize-indicator"></div>
|
|
</div>
|
|
</nav>
|
|
|
|
<!-- Track and set sidebar scroll position -->
|
|
<script>
|
|
var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
|
|
sidebarScrollbox.addEventListener('click', function(e) {
|
|
if (e.target.tagName === 'A') {
|
|
sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
|
|
}
|
|
}, { passive: true });
|
|
var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
|
|
sessionStorage.removeItem('sidebar-scroll');
|
|
if (sidebarScrollTop) {
|
|
// preserve sidebar scroll position when navigating via links within sidebar
|
|
sidebarScrollbox.scrollTop = sidebarScrollTop;
|
|
} else {
|
|
// scroll sidebar to current active section when navigating via "next/previous chapter" buttons
|
|
var activeSection = document.querySelector('#sidebar .active');
|
|
if (activeSection) {
|
|
activeSection.scrollIntoView({ block: 'center' });
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<div id="page-wrapper" class="page-wrapper">
|
|
|
|
<div class="page">
|
|
<div id="menu-bar-hover-placeholder"></div>
|
|
<div id="menu-bar" class="menu-bar sticky">
|
|
<div class="left-buttons">
|
|
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
|
<i class="fa fa-bars"></i>
|
|
</label>
|
|
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
|
<i class="fa fa-paint-brush"></i>
|
|
</button>
|
|
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
|
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
|
</ul>
|
|
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
|
|
<i class="fa fa-search"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<h1 class="menu-title">Vac RFC</h1>
|
|
|
|
<div class="right-buttons">
|
|
<a href="../../print.html" title="Print this book" aria-label="Print this book">
|
|
<i id="print-button" class="fa fa-print"></i>
|
|
</a>
|
|
<a href="https://github.com/vacp2p/rfc-index" title="Git repository" aria-label="Git repository">
|
|
<i id="git-repository-button" class="fa fa-github"></i>
|
|
</a>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="search-wrapper" class="hidden">
|
|
<form id="searchbar-outer" class="searchbar-outer">
|
|
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
|
</form>
|
|
<div id="searchresults-outer" class="searchresults-outer hidden">
|
|
<div id="searchresults-header" class="searchresults-header"></div>
|
|
<ul id="searchresults">
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
|
<script>
|
|
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
|
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
|
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
|
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
|
});
|
|
</script>
|
|
|
|
<div id="content" class="content">
|
|
<main>
|
|
<h1 id="56status-communities"><a class="header" href="#56status-communities">56/STATUS-COMMUNITIES</a></h1>
|
|
<div class="rfc-meta">
|
|
<table>
|
|
<tr><th>Name</th><td>Status Communities that run over Waku v2</td></tr>
|
|
<tr><th>Slug</th><td>56</td></tr>
|
|
<tr><th>Status</th><td>draft</td></tr>
|
|
<tr><th>Category</th><td>Standards Track</td></tr>
|
|
<tr><th>Editor</th><td>Aaryamann Challani <p1ge0nh8er@proton.me></td></tr>
|
|
<tr><th>Contributors</th><td>Andrea Piana <andreap@status.im><br>Prem Chaitanya Prathi <prem@waku.org></td></tr>
|
|
</table>
|
|
</div>
|
|
<!-- timeline:start -->
|
|
<h2 id="timeline"><a class="header" href="#timeline">Timeline</a></h2>
|
|
<ul>
|
|
<li><strong>2025-12-22</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/b1a578393edf8487ccc97a5f25b25af9bf41efb3/docs/status/56/communities.md"><code>b1a5783</code></a> — Chore/mdbook updates (#237)</li>
|
|
<li><strong>2025-12-18</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/d03e699084774ebecef9c6d4662498907c5e2080/docs/status/56/communities.md"><code>d03e699</code></a> — ci: add mdBook configuration (#233)</li>
|
|
<li><strong>2025-03-07</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/f4b34afd1a1e198b0d99b911bf8b371b5b13a6b8/status/56/communities.md"><code>f4b34af</code></a> — Fix Linting Errors (#135)</li>
|
|
<li><strong>2025-02-21</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/9bed57e4ad5d6609202a18f581a00b2fd81f6acb/status/56/communities.md"><code>9bed57e</code></a> — docs: define basic sharding for Communities (#132)</li>
|
|
<li><strong>2025-01-02</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/dc7497a3123623f2834d80ebd3a7c77e0d605074/status/56/communities.md"><code>dc7497a</code></a> — add usage guidelines for waku content topics (#117)</li>
|
|
<li><strong>2024-09-13</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/3ab314d87d4525ff1296bf3d9ec634d570777b91/status/56/communities.md"><code>3ab314d</code></a> — Fix Files for Linting (#94)</li>
|
|
<li><strong>2024-08-05</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/eb25cd06d679e94409072a96841de16a6b3910d5/status/56/communities.md"><code>eb25cd0</code></a> — chore: replace email addresses (#86)</li>
|
|
<li><strong>2024-02-05</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/11bdc3bbb705afe1b493bbb40d61e2e6d7af6a6a/status/56/communities.md"><code>11bdc3b</code></a> — Update communities.md</li>
|
|
<li><strong>2024-02-01</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/83507420c3060f93acac0454276a69df40c4b52c/status/56/communities.md"><code>8350742</code></a> — Update and rename COMMUNITIES.md to communities.md</li>
|
|
<li><strong>2024-01-27</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/a786356887a5443d4624a076e878314b30aa4609/status/56/COMMUNITIES.md"><code>a786356</code></a> — Create COMMUNITIES.md</li>
|
|
</ul>
|
|
<!-- timeline:end -->
|
|
<h2 id="abstract"><a class="header" href="#abstract">Abstract</a></h2>
|
|
<p>This document describes the design of Status Communities over Waku v2,
|
|
allowing for multiple users to communicate in a discussion space.
|
|
This is a key feature for the Status messaging app.</p>
|
|
<h2 id="background-and-motivation"><a class="header" href="#background-and-motivation">Background and Motivation</a></h2>
|
|
<p>The purpose of Status communities, as specified in this document,
|
|
is allowing for large group chats.
|
|
Communities can have further substructure, e.g. specific channels.</p>
|
|
<p>Smaller group chats, on the other hand,
|
|
are out of scope for this document and
|
|
can be built over <a href="../55/1to1-chat.html">55/STATUS-1TO1-CHAT</a>.
|
|
We refer to these smaller group chats simply as "group chats",
|
|
to differentiate them from Communities.</p>
|
|
<p>For group chats based on <a href="../55/1to1-chat.html">55/STATUS-1TO1-CHAT</a>,
|
|
the key exchange mechanism MUST be X3DH,
|
|
as described in <a href="../../waku/standards/application/53/x3dh.html">53/WAKU2-X3DH</a>.</p>
|
|
<p>However, this method does not scale as the number of participants increases,
|
|
for the following reasons -</p>
|
|
<ol>
|
|
<li>The number of messages sent over the network increases with the number of participants.</li>
|
|
<li>Handling the X3DH key exchange for each participant is computationally expensive.</li>
|
|
</ol>
|
|
<p>Having multicast channels reduces the overhead of a group chat based on 1:1 chat.
|
|
Additionally, if all the participants of the group chat have a shared key,
|
|
then the number of messages sent over the network is reduced to one per message.</p>
|
|
<h2 id="terminology"><a class="header" href="#terminology">Terminology</a></h2>
|
|
<ul>
|
|
<li><strong>Community</strong>: A group of peers that can communicate with each other.</li>
|
|
<li><strong>Member</strong>: A peer that is part of a community.</li>
|
|
<li><strong>Admin</strong>: A member that has administrative privileges.
|
|
Used interchangeably with "owner".</li>
|
|
<li><strong>Channel</strong>: A designated subtopic for a community. Used interchangeably with "chat".</li>
|
|
</ul>
|
|
<h2 id="design-requirements"><a class="header" href="#design-requirements">Design Requirements</a></h2>
|
|
<p>Due to the nature of communities,
|
|
the following requirements are necessary for the design of communities -</p>
|
|
<ol>
|
|
<li>The creator of the Community is the owner of the Community.</li>
|
|
<li>The Community owner is trusted.</li>
|
|
<li>The Community owner can add or remove members from the Community.
|
|
This extends to banning and kicking members.</li>
|
|
<li>The Community owner can add, edit and remove channels.</li>
|
|
<li>Community members can send/receive messages
|
|
to the channels which they have access to.</li>
|
|
<li>Communities may be encrypted (private) or unencrypted (public).</li>
|
|
<li>A Community is uniquely identified by a public key.</li>
|
|
<li>The public key of the Community is shared out of band.</li>
|
|
<li>The metadata of the Community can be found by listening on a content topic
|
|
derived from the public key of the Community.</li>
|
|
<li>Community members run their own Waku nodes,
|
|
with the configuration described in <a href="#waku-protocols">Waku-Protocols</a>.
|
|
Light nodes solely implementing
|
|
<a href="../../waku/standards/core/19/lightpush.html">19/WAKU2-LIGHTPUSH</a>
|
|
may not be able to run their own Waku node with the configuration described.</li>
|
|
</ol>
|
|
<h2 id="design"><a class="header" href="#design">Design</a></h2>
|
|
<h3 id="cryptographic-primitives"><a class="header" href="#cryptographic-primitives">Cryptographic Primitives</a></h3>
|
|
<p>The following cryptographic primitives are used in the design -</p>
|
|
<ul>
|
|
<li>X3DH</li>
|
|
<li>Single Ratchet
|
|
<ul>
|
|
<li>The single ratchet is used to encrypt the messages sent to the Community.</li>
|
|
<li>The single ratchet is re-keyed when a member is added/removed from the Community.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h2 id="wire-format"><a class="header" href="#wire-format">Wire format</a></h2>
|
|
<!--
|
|
The wire format is described first to give an overview of the protocol.
|
|
It is referenced in the flow of community creation and community management.
|
|
More or less an intersection of https://github.com/status-im/specs/blob/403b5ce316a270565023fc6a1f8dec138819f4b0/docs/raw/organisation-channels.md
|
|
and https://github.com/status-im/status-go/blob/6072bd17ab1e5d9fc42cf844fcb8ad18aa07760c/protocol/protobuf/communities.proto,
|
|
|
|
-->
|
|
<pre><code class="language-protobuf">syntax = "proto3";
|
|
|
|
message IdentityImage {
|
|
// payload is a context based payload for the profile image data,
|
|
// context is determined by the `source_type`
|
|
bytes payload = 1;
|
|
// source_type signals the image payload source
|
|
SourceType source_type = 2;
|
|
// image_type signals the image type and method of parsing the payload
|
|
ImageType image_type = 3;
|
|
// encryption_keys is a list of encrypted keys that can be used to decrypt an
|
|
// encrypted payload
|
|
repeated bytes encryption_keys = 4;
|
|
// encrypted signals the encryption state of the payload, default is false.
|
|
bool encrypted = 5;
|
|
// SourceType are the predefined types of image source allowed
|
|
enum SourceType {
|
|
UNKNOWN_SOURCE_TYPE = 0;
|
|
|
|
// RAW_PAYLOAD image byte data
|
|
RAW_PAYLOAD = 1;
|
|
|
|
// ENS_AVATAR uses the ENS record's resolver get-text-data.avatar data
|
|
// The `payload` field will be ignored if ENS_AVATAR is selected
|
|
// The application will read and
|
|
// parse the ENS avatar data as image payload data, URLs will be ignored
|
|
// The parent `ChatMessageIdentity` must have a valid `ens_name` set
|
|
ENS_AVATAR = 2;
|
|
}
|
|
}
|
|
|
|
// SocialLinks represents social link associated with given chat identity (personal/community)
|
|
message SocialLink {
|
|
// Type of the social link
|
|
string text = 1;
|
|
// URL of the social link
|
|
string url = 2;
|
|
}
|
|
// ChatIdentity represents identity of a community/chat
|
|
message ChatIdentity {
|
|
// Lamport timestamp of the message
|
|
uint64 clock = 1;
|
|
// ens_name is the valid ENS name associated with the chat key
|
|
string ens_name = 2;
|
|
// images is a string indexed mapping of images associated with an identity
|
|
map<string, IdentityImage> images = 3;
|
|
// display name is the user set identity
|
|
string display_name = 4;
|
|
// description is the user set description
|
|
string description = 5;
|
|
string color = 6;
|
|
string emoji = 7;
|
|
repeated SocialLink social_links = 8;
|
|
// first known message timestamp in seconds
|
|
// (valid only for community chats for now)
|
|
// 0 - unknown
|
|
// 1 - no messages
|
|
uint32 first_message_timestamp = 9;
|
|
}
|
|
|
|
message Grant {
|
|
// Community ID (The public key of the community)
|
|
bytes community_id = 1;
|
|
// The member ID (The public key of the member)
|
|
bytes member_id = 2;
|
|
// The chat for which the grant is given
|
|
string chat_id = 3;
|
|
// The Lamport timestamp of the grant
|
|
uint64 clock = 4;
|
|
}
|
|
|
|
message CommunityMember {
|
|
// The roles a community member MAY have
|
|
enum Roles {
|
|
UNKNOWN_ROLE = 0;
|
|
ROLE_ALL = 1;
|
|
ROLE_MANAGE_USERS = 2;
|
|
ROLE_MODERATE_CONTENT = 3;
|
|
}
|
|
repeated Roles roles = 1;
|
|
}
|
|
|
|
message CommunityPermissions {
|
|
// The type of access a community MAY have
|
|
enum Access {
|
|
UNKNOWN_ACCESS = 0;
|
|
NO_MEMBERSHIP = 1;
|
|
INVITATION_ONLY = 2;
|
|
ON_REQUEST = 3;
|
|
}
|
|
|
|
// If the community should be available only to ens users
|
|
bool ens_only = 1;
|
|
// If the community is private
|
|
bool private = 2;
|
|
Access access = 3;
|
|
}
|
|
|
|
message CommunityAdminSettings {
|
|
// If the Community admin may pin messages
|
|
bool pin_message_all_members_enabled = 1;
|
|
}
|
|
|
|
message CommunityChat {
|
|
// A map of members in the community to their roles in a chat
|
|
map<string,CommunityMember> members = 1;
|
|
// The permissions of the chat
|
|
CommunityPermissions permissions = 2;
|
|
// The metadata of the chat
|
|
ChatIdentity identity = 3;
|
|
// The category of the chat
|
|
string category_id = 4;
|
|
// The position of chat in the display
|
|
int32 position = 5;
|
|
}
|
|
|
|
message CommunityCategory {
|
|
// The category id
|
|
string category_id = 1;
|
|
// The name of the category
|
|
string name = 2;
|
|
// The position of the category in the display
|
|
int32 position = 3;
|
|
}
|
|
|
|
message CommunityInvitation {
|
|
// Encrypted/unencrypted community description
|
|
bytes community_description = 1;
|
|
// The grant offered by the community
|
|
bytes grant = 2;
|
|
// The chat id requested to join
|
|
string chat_id = 3;
|
|
// The public key of the community
|
|
bytes public_key = 4;
|
|
}
|
|
|
|
message CommunityRequestToJoin {
|
|
// The Lamport timestamp of the request
|
|
uint64 clock = 1;
|
|
// The ENS name of the requester
|
|
string ens_name = 2;
|
|
// The chat id requested to join
|
|
string chat_id = 3;
|
|
// The public key of the community
|
|
bytes community_id = 4;
|
|
// The display name of the requester
|
|
string display_name = 5;
|
|
}
|
|
|
|
message CommunityCancelRequestToJoin {
|
|
// The Lamport timestamp of the request
|
|
uint64 clock = 1;
|
|
// The ENS name of the requester
|
|
string ens_name = 2;
|
|
// The chat id requested to join
|
|
string chat_id = 3;
|
|
// The public key of the community
|
|
bytes community_id = 4;
|
|
// The display name of the requester
|
|
string display_name = 5;
|
|
// Magnet uri for community history protocol
|
|
string magnet_uri = 6;
|
|
}
|
|
|
|
message CommunityRequestToJoinResponse {
|
|
// The Lamport timestamp of the request
|
|
uint64 clock = 1;
|
|
// The community description
|
|
CommunityDescription community = 2;
|
|
// If the request was accepted
|
|
bool accepted = 3;
|
|
// The grant offered by the community
|
|
bytes grant = 4;
|
|
// The community public key
|
|
bytes community_id = 5;
|
|
}
|
|
|
|
message CommunityRequestToLeave {
|
|
// The Lamport timestamp of the request
|
|
uint64 clock = 1;
|
|
// The community public key
|
|
bytes community_id = 2;
|
|
}
|
|
|
|
message CommunityDescription {
|
|
// The Lamport timestamp of the message
|
|
uint64 clock = 1;
|
|
// A mapping of members in the community to their roles
|
|
map<string,CommunityMember> members = 2;
|
|
// The permissions of the Community
|
|
CommunityPermissions permissions = 3;
|
|
// The metadata of the Community
|
|
ChatIdentity identity = 5;
|
|
// A mapping of chats to their details
|
|
map<string,CommunityChat> chats = 6;
|
|
// A list of banned members
|
|
repeated string ban_list = 7;
|
|
// A mapping of categories to their details
|
|
map<string,CommunityCategory> categories = 8;
|
|
// The admin settings of the Community
|
|
CommunityAdminSettings admin_settings = 10;
|
|
// If the community is encrypted
|
|
bool encrypted = 13;
|
|
// The list of tags
|
|
repeated string tags = 14;
|
|
}
|
|
</code></pre>
|
|
<p>Note: The usage of the clock is described in the <a href="#clock">Clock</a> section.</p>
|
|
<h3 id="functional-scope-and-shard-assignment"><a class="header" href="#functional-scope-and-shard-assignment">Functional scope and shard assignment</a></h3>
|
|
<p>We define two special <a href="../raw/status-app-protocols.html#functional-scope">functional scopes</a> for messages related to Status Communities:</p>
|
|
<ol>
|
|
<li>Global community control</li>
|
|
<li>Global community content</li>
|
|
</ol>
|
|
<p>All messages that relate to controlling communities MUST be assigned the <em>global community control</em> scope.
|
|
All messages that carry user-generated content for communities MUST be assigned the <em>global community content</em> scope.</p>
|
|
<blockquote>
|
|
<p><strong>Note:</strong> a previous iteration of Status Communities defined separate community-wide scopes for each community.
|
|
However, this model was deprecated and all communities now operate on a global, shared scope.
|
|
This implies that different communities will share shards on the routing layer.</p>
|
|
</blockquote>
|
|
<p>The following <a href="../raw/status-app-protocols.html#waku-transport-layer">Waku transport layer</a> allocations are reserved for communities:
|
|
As per <a href="https://rfc.vac.dev/status/raw/simple-scaling/#relay-shards">STATUS-SIMPLE-SCALING</a>, communities use the default cluster ID <code>16</code>
|
|
set aside for all Status app protocols.
|
|
Within this cluster, the following <a href="../raw/status-app-protocols.html#pubsub-topics-and-sharding">shards</a> are reserved for the community functional scopes:</p>
|
|
<ol>
|
|
<li>All messages with a <em>global community control</em> scope MUST be published to shard <code>128</code></li>
|
|
<li>All messages with a <em>global community content</em> scope MUST be published to shard <code>256</code></li>
|
|
</ol>
|
|
<h3 id="content-topic-level-encryption"><a class="header" href="#content-topic-level-encryption">Content topic level encryption</a></h3>
|
|
<p>-a universal chat identifier is used for all community chats.</p>
|
|
<!-- Don't enforce any constraints on the unique id generation -->
|
|
<p>All messages are encrypted before they are handed over to waku ir-respective of the encryption explained above.
|
|
All community chats are encrypted using a symmetric key generated from universal chat id using pbkdf2.</p>
|
|
<pre><code class="language-js">symKey = pbkdf2(password:universalChatID, salt:nil, iteration-count:65356,key-length:32, hash-func: random-sha256)
|
|
</code></pre>
|
|
<h3 id="content-topic-usage"><a class="header" href="#content-topic-usage">Content topic usage</a></h3>
|
|
<p>"Content topic" refers to the field in <a href="../../waku/standards/core/14/message.html">14/WAKU2-MESSAGE</a>,
|
|
further elaborated in <a href="../../waku/standards/core/10/waku2.html">10/WAKU2</a>.
|
|
The content-topic usage follows the guidelines specified at <a href="../../waku/informational/23/topics.html#content-topic-usage-guidelines">23/topics</a></p>
|
|
<h4 id="advertising-a-community"><a class="header" href="#advertising-a-community">Advertising a Community</a></h4>
|
|
<p>The content topic that the community is advertised on
|
|
MUST be derived from the public key of the community.
|
|
The content topic MUST be the first four bytes of the keccak-256 hash
|
|
of the compressed (33 bytes) public key of the community encoded into a hex string.</p>
|
|
<pre><code class="language-js">hash = hex(keccak256(encodeToHex(compressedPublicKey)))
|
|
|
|
topicLen = 4
|
|
if len(hash) < topicLen {
|
|
topicLen = len(hash)
|
|
}
|
|
|
|
var topic [4]byte
|
|
for i = 0; i < topicLen; i++ {
|
|
topic[i] = hash[i]
|
|
}
|
|
|
|
contentTopic = "/waku/1/0x" + topic + "/rfc26"
|
|
</code></pre>
|
|
<h4 id="community-event-messages"><a class="header" href="#community-event-messages">Community event messages</a></h4>
|
|
<p>Message such as community description
|
|
MUST be sent to the content topic derived from the public key of the community.
|
|
The content topic
|
|
MUST be the hex-encoded keccak-256 hash of the public key of the community.</p>
|
|
<pre><code class="language-js">hash = hex(keccak256(encodeToHex(publicKey)))
|
|
|
|
topicLen = 4
|
|
if len(hash) < topicLen {
|
|
topicLen = len(hash)
|
|
}
|
|
var topic [4]byte
|
|
for i = 0; i < topicLen; i++ {
|
|
topic[i] = hash[i]
|
|
}
|
|
|
|
contentTopic = "/waku/1/0x" + topic + "/rfc26"
|
|
</code></pre>
|
|
<h4 id="community-requests"><a class="header" href="#community-requests">Community Requests</a></h4>
|
|
<p>Requests to leave, join, kick and ban, as well as key exchange messages, MUST be sent to the content topic derived from the public key of the community on the common shard.</p>
|
|
<p>The content topic
|
|
MUST be the keccak-256 hash of hex-encoded universal chat id (public key appended with fixed string) of the community omitting the first 2 bytes.</p>
|
|
<pre><code class="language-js">universalChatId = publicKey+"-memberUpdate"
|
|
hash = hex(keccak256(encodeToHex(universalChatId))[2:])
|
|
|
|
topicLen = 4
|
|
if len(hash) < topicLen {
|
|
topicLen = len(hash)
|
|
}
|
|
var topic [4]byte
|
|
for i = 0; i < topicLen; i++ {
|
|
topic[i] = hash[i]
|
|
}
|
|
|
|
contentTopic = "/waku/1/0x" + topic + "/rfc26"
|
|
</code></pre>
|
|
<h4 id="community-shard-info"><a class="header" href="#community-shard-info">Community Shard Info</a></h4>
|
|
<p>If a community is assigned a dedicated shard then the shard info for that community is published on a content topic derived from a specialized key. This is useful for users joining the new community so that they can subscribe to this specific content topic.</p>
|
|
<pre><code class="language-js">chatID = publicKey+"-shard-info"
|
|
hash = hex(keccak256(encodeToHex(chatID))[2:])
|
|
|
|
topicLen = 4
|
|
if len(hash) < topicLen {
|
|
topicLen = len(hash)
|
|
}
|
|
var topic [4]byte
|
|
for i = 0; i < topicLen; i++ {
|
|
topic[i] = hash[i]
|
|
}
|
|
|
|
contentTopic = "/waku/1/0x" + topic + "/rfc26"
|
|
</code></pre>
|
|
<h4 id="community-channelschats"><a class="header" href="#community-channelschats">Community channels/chats</a></h4>
|
|
<p>All channels/chats shall use a single content-topic which is derived from a universal chat id irrespective of their individual unique chat ids.</p>
|
|
<h3 id="community-management"><a class="header" href="#community-management">Community Management</a></h3>
|
|
<p>The flows for Community management are as described below.</p>
|
|
<h4 id="community-creation-flow"><a class="header" href="#community-creation-flow">Community Creation Flow</a></h4>
|
|
<ol>
|
|
<li>The Community owner generates a public/private key pair.</li>
|
|
<li>The Community owner configures the Community metadata,
|
|
according to the wire format "CommunityDescription".</li>
|
|
<li>The Community owner publishes the Community metadata on a content topic
|
|
derived from the public key of the Community.
|
|
the Community metadata SHOULD be encrypted with the public key of the Community.
|
|
The Community metadata is sent during fixed intervals,
|
|
to ensure that the Community metadata is available to members.
|
|
The Community metadata SHOULD be sent every time the Community metadata is updated.</li>
|
|
<li>The Community owner MAY advertise the Community out of band,
|
|
by sharing the public key of the Community on other mediums of communication.</li>
|
|
</ol>
|
|
<h4 id="community-join-flow-peer-requests-to-join-a-community"><a class="header" href="#community-join-flow-peer-requests-to-join-a-community">Community Join Flow (peer requests to join a Community)</a></h4>
|
|
<ol>
|
|
<li>A peer and the Community owner establish a 1:1 chat as described in <a href="../55/1to1-chat.html">55/STATUS-1TO1-CHAT</a>.</li>
|
|
<li>The peer requests to join a Community by sending a
|
|
"CommunityRequestToJoin" message to the Community.
|
|
At this point, the peer MAY send a
|
|
"CommunityCancelRequestToJoin" message to cancel the request.</li>
|
|
<li>The Community owner MAY accept or reject the request.</li>
|
|
<li>If the request is accepted,
|
|
the Community owner sends a "CommunityRequestToJoinResponse" message to the peer.</li>
|
|
<li>The Community owner then adds the member to the Community metadata, and
|
|
publishes the updated Community metadata.</li>
|
|
</ol>
|
|
<h4 id="community-join-flow-peer-is-invited-to-join-a-community"><a class="header" href="#community-join-flow-peer-is-invited-to-join-a-community">Community Join Flow (peer is invited to join a Community)</a></h4>
|
|
<ol>
|
|
<li>The Community owner and peer establish a 1:1 chat as described in <a href="../55/1to1-chat.html">55/STATUS-1TO1-CHAT</a>.</li>
|
|
<li>The peer is invited to join a Community by the Community owner,
|
|
by sending a "CommunityInvitation" message.</li>
|
|
<li>The peer decrypts the "CommunityInvitation" message, and verifies the signature.</li>
|
|
<li>The peer requests to join a Community by sending a
|
|
"CommunityRequestToJoin" message to the Community.</li>
|
|
<li>The Community owner MAY accept or reject the request.</li>
|
|
<li>If the request is accepted,
|
|
the Community owner sends a "CommunityRequestToJoinResponse" message to the peer.</li>
|
|
<li>The Community owner then adds the member to the Community metadata, and
|
|
publishes the updated Community metadata.</li>
|
|
</ol>
|
|
<h4 id="community-leave-flow"><a class="header" href="#community-leave-flow">Community Leave Flow</a></h4>
|
|
<ol>
|
|
<li>A member requests to leave a Community by sending a
|
|
"CommunityRequestToLeave" message to the Community.</li>
|
|
<li>The Community owner MAY accept or reject the request.</li>
|
|
<li>If the request is accepted,
|
|
the Community owner removes the member from the Community metadata,
|
|
and publishes the updated Community metadata.</li>
|
|
</ol>
|
|
<h4 id="community-ban-flow"><a class="header" href="#community-ban-flow">Community Ban Flow</a></h4>
|
|
<ol>
|
|
<li>The Community owner adds a member to the ban list, revokes their grants,
|
|
and publishes the updated Community metadata.</li>
|
|
<li>If the Community is Private,
|
|
Re-keying is performed between the members of the Community,
|
|
to ensure that the banned member is unable to decrypt any messages.</li>
|
|
</ol>
|
|
<h3 id="waku-protocols"><a class="header" href="#waku-protocols">Waku Protocols</a></h3>
|
|
<p>The following Waku protocols SHOULD be used to implement Status Communities -</p>
|
|
<ol>
|
|
<li><a href="../../waku/standards/core/11/relay.html">11/WAKU2-RELAY</a> -
|
|
To send and receive messages</li>
|
|
<li><a href="../../waku/standards/application/53/x3dh.html">53/WAKU2-X3DH</a> -
|
|
To encrypt and decrypt messages</li>
|
|
<li><a href="../../waku/standards/application/54/x3dh-sessions.html">54/WAKU2-X3DH-SESSIONS</a>-
|
|
To handle session keys</li>
|
|
<li><a href="../../waku/standards/core/14/message.html">14/WAKU2-MESSAGE</a> -
|
|
To wrap community messages in a Waku message</li>
|
|
<li><a href="../../waku/standards/core/13/store.html">13/WAKU2-STORE</a> -
|
|
To store and retrieve messages for offline devices</li>
|
|
</ol>
|
|
<p>The following Waku protocols MAY be used to implement Status Communities -</p>
|
|
<ol>
|
|
<li><a href="../../waku/standards/core/12/filter.html">12/WAKU2-FILTER</a> -
|
|
Content filtering for resource restricted devices</li>
|
|
<li><a href="../../waku/standards/core/19/lightpush.html">19/WAKU2-LIGHTPUSH</a> -
|
|
Allows Light clients to participate in the network</li>
|
|
</ol>
|
|
<h3 id="backups"><a class="header" href="#backups">Backups</a></h3>
|
|
<p>The member MAY back up their local settings,
|
|
by encrypting it with their public key, and
|
|
sending it to a given content topic.
|
|
The member MAY then rely on this backup to restore their local settings,
|
|
in case of a data loss.
|
|
This feature relies on
|
|
<a href="../../waku/standards/core/13/store.html">13/WAKU2-STORE</a>
|
|
for storing and retrieving messages.</p>
|
|
<h3 id="clock"><a class="header" href="#clock">Clock</a></h3>
|
|
<p>The clock used in the wire format refers to the Lamport timestamp of the message.
|
|
The Lamport timestamp is a logical clock that is used to determine the order of events
|
|
in a distributed system.
|
|
This allows ordering of messages in an asynchronous network
|
|
where messages may be received out of order.</p>
|
|
<h2 id="security-considerations"><a class="header" href="#security-considerations">Security Considerations</a></h2>
|
|
<ol>
|
|
<li>
|
|
<p>The Community owner is a single point of failure.
|
|
If the Community owner is compromised, the Community is compromised.</p>
|
|
</li>
|
|
<li>
|
|
<p>Follows the same security considerations as the
|
|
<a href="../../waku/standards/application/53/x3dh.html">53/WAKU2-X3DH</a> protocol.</p>
|
|
</li>
|
|
</ol>
|
|
<h2 id="future-work"><a class="header" href="#future-work">Future work</a></h2>
|
|
<ol>
|
|
<li>
|
|
<p>To scale and optimize the Community management,
|
|
the Community metadata should be stored on a decentralized storage system, and
|
|
only the references to the Community metadata should be broadcasted.
|
|
The following document describes this method in more detail -
|
|
<a href="https://hackmd.io/rD1OfIbJQieDe3GQdyCRTw">Optimizing the <code>CommunityDescription</code> dissemination</a></p>
|
|
</li>
|
|
<li>
|
|
<p>Token gating for communities</p>
|
|
</li>
|
|
<li>
|
|
<p>Sharding the content topic used for <a href="#community-event-messages">#Community Event Messages</a>,
|
|
since members of the community don't need to receive all the control messages.</p>
|
|
</li>
|
|
</ol>
|
|
<h2 id="copyright"><a class="header" href="#copyright">Copyright</a></h2>
|
|
<p>Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CC0</a>.</p>
|
|
<h2 id="references"><a class="header" href="#references">References</a></h2>
|
|
<ul>
|
|
<li><a href="../55/1to1-chat.html">55/STATUS-1TO1-CHAT</a></li>
|
|
<li><a href="../../waku/standards/application/53/x3dh.html">53/WAKU2-X3DH</a></li>
|
|
<li><a href="../../waku/standards/core/19/lightpush.html">19/WAKU2-LIGHTPUSH</a></li>
|
|
<li><a href="../../waku/standards/core/14/message.html">14/WAKU2-MESSAGE</a></li>
|
|
<li><a href="../../waku/standards/core/10/waku2.html">10/WAKU2</a></li>
|
|
<li><a href="../../waku/standards/core/11/relay.html">11/WAKU2-RELAY</a></li>
|
|
<li><a href="../../waku/standards/application/54/x3dh-sessions.html">54/WAKU2-X3DH-SESSIONS</a></li>
|
|
<li><a href="../../waku/standards/core/13/store.html">13/WAKU2-STORE</a></li>
|
|
<li><a href="../../waku/standards/core/12/filter.html">12/WAKU2-FILTER</a></li>
|
|
</ul>
|
|
<h3 id="informative"><a class="header" href="#informative">informative</a></h3>
|
|
<ul>
|
|
<li><a href="https://github.com/status-im/status-go/blob/6072bd17ab1e5d9fc42cf844fcb8ad18aa07760c/protocol/communities/community.go">community.go</a></li>
|
|
<li><a href="https://github.com/status-im/specs/blob/403b5ce316a270565023fc6a1f8dec138819f4b0/docs/raw/organisation-channels.md">organisation-channels.md</a></li>
|
|
</ul>
|
|
|
|
</main>
|
|
|
|
<nav class="nav-wrapper" aria-label="Page navigation">
|
|
<!-- Mobile navigation buttons -->
|
|
<a rel="prev" href="../../status/55/1to1-chat.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
|
<i class="fa fa-angle-left"></i>
|
|
</a>
|
|
|
|
<a rel="next prefetch" href="../../status/61/community-history-service.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
|
<i class="fa fa-angle-right"></i>
|
|
</a>
|
|
|
|
<div style="clear: both"></div>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
|
|
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
|
<a rel="prev" href="../../status/55/1to1-chat.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
|
<i class="fa fa-angle-left"></i>
|
|
</a>
|
|
|
|
<a rel="next prefetch" href="../../status/61/community-history-service.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
|
<i class="fa fa-angle-right"></i>
|
|
</a>
|
|
</nav>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
window.playground_copyable = true;
|
|
</script>
|
|
|
|
|
|
<script src="../../elasticlunr.min.js"></script>
|
|
<script src="../../mark.min.js"></script>
|
|
<script src="../../searcher.js"></script>
|
|
|
|
<script src="../../clipboard.min.js"></script>
|
|
<script src="../../highlight.js"></script>
|
|
<script src="../../book.js"></script>
|
|
|
|
<!-- Custom JS scripts -->
|
|
<script src="../../scripts/rfc-index.js"></script>
|
|
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|