mirror of
https://github.com/vacp2p/rfc-index.git
synced 2026-01-09 15:48:03 -05:00
464 lines
43 KiB
HTML
464 lines
43 KiB
HTML
<!DOCTYPE HTML>
|
|
<html lang="en" class="ayu" dir="ltr">
|
|
<head>
|
|
<!-- Book generated using mdBook -->
|
|
<meta charset="UTF-8">
|
|
<title>20/Toy ETH PM - 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" class="active"><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"><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="20toy-eth-pm"><a class="header" href="#20toy-eth-pm">20/TOY-ETH-PM</a></h1>
|
|
<div class="rfc-meta">
|
|
<table>
|
|
<tr><th>Name</th><td>Toy Ethereum Private Message</td></tr>
|
|
<tr><th>Slug</th><td>20</td></tr>
|
|
<tr><th>Status</th><td>draft</td></tr>
|
|
<tr><th>Editor</th><td>Franck Royer <franck@status.im></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/waku/standards/application/20/toy-eth-pm.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/waku/standards/application/20/toy-eth-pm.md"><code>d03e699</code></a> — ci: add mdBook configuration (#233)</li>
|
|
<li><strong>2025-04-09</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/3b152e44b595456250c0f45288c4e2e6a87774e4/waku/standards/application/20/toy-eth-pm.md"><code>3b152e4</code></a> — 20/TOY-ETH-PM: Update (#141)</li>
|
|
<li><strong>2024-09-13</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/3ab314d87d4525ff1296bf3d9ec634d570777b91/waku/standards/application/20/toy-eth-pm.md"><code>3ab314d</code></a> — Fix Files for Linting (#94)</li>
|
|
<li><strong>2024-03-21</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/2eaa7949c4abe7d14e2b9560e8c045bf2e937c9a/waku/standards/application/20/toy-eth-pm.md"><code>2eaa794</code></a> — Broken Links + Change Editors (#26)</li>
|
|
<li><strong>2024-01-31</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/89a94a5ba9e5d45f2563a9ede5ad4fe976d1cc54/waku/standards/application/20/toy-eth-pm.md"><code>89a94a5</code></a> — Update toy-eth-pm.md</li>
|
|
<li><strong>2024-01-30</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/c4ff509ce7ba84eaf60d9ddb6e273d0a06fbf32d/waku/standards/application/20/toy-eth-pm.md"><code>c4ff509</code></a> — Create toy-eth-pm.md</li>
|
|
<li><strong>2024-01-30</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/8841f4941ec2efd34126ce297c42722ab437b806/waku/informational/20/toy-eth-pm.md"><code>8841f49</code></a> — Update toy-eth-pm.md</li>
|
|
<li><strong>2024-01-29</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/a16a2b474d8f841f71fed42f6247539daa7c4d53/waku/informational/20/toy-eth-pm.md"><code>a16a2b4</code></a> — Create toy-eth-pm.md</li>
|
|
</ul>
|
|
<!-- timeline:end -->
|
|
<p><strong>Content Topics</strong>:</p>
|
|
<ul>
|
|
<li>Public Key Broadcast: <code>/eth-pm/1/public-key/proto</code></li>
|
|
<li>Private Message: <code>/eth-pm/1/private-message/proto</code></li>
|
|
</ul>
|
|
<h2 id="abstract"><a class="header" href="#abstract">Abstract</a></h2>
|
|
<p>This specification explains the Toy Ethereum Private Message protocol
|
|
which enables a peer to send an encrypted message to another peer
|
|
over the Waku network using the peer's Ethereum address.</p>
|
|
<h2 id="goal"><a class="header" href="#goal">Goal</a></h2>
|
|
<p>Alice wants to send an encrypted message to Bob,
|
|
where only Bob can decrypt the message.
|
|
Alice only knows Bob's Ethereum Address.</p>
|
|
<p>The goal of this specification
|
|
is to demonstrate how Waku can be used for encrypted messaging purposes,
|
|
using Ethereum accounts for identity.
|
|
This protocol caters to Web3 wallet restrictions,
|
|
allowing it to be implemented using standard Web3 API.
|
|
In the current state,
|
|
Toy Ethereum Private Message, ETH-PM, has privacy and features <a href="#limitations">limitations</a>,
|
|
has not been audited and hence is not fit for production usage.
|
|
We hope this can be an inspiration for developers
|
|
wishing to build on top of Waku.</p>
|
|
<h2 id="design-requirements"><a class="header" href="#design-requirements">Design Requirements</a></h2>
|
|
<p>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
|
|
“SHOULD NOT”, “RECOMMENDED”, “MAY”, and
|
|
“OPTIONAL” in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">2119</a>.</p>
|
|
<h2 id="variables"><a class="header" href="#variables">Variables</a></h2>
|
|
<p>Here are the variables used in the protocol and their definition:</p>
|
|
<ul>
|
|
<li><code>B</code> is Bob's Ethereum address (or account),</li>
|
|
<li><code>b</code> is the private key of <code>B</code>, and is only known by Bob.</li>
|
|
<li><code>B'</code> is Bob's Encryption Public Key, for which <code>b'</code> is the private key.</li>
|
|
<li><code>M</code> is the private message that Alice sends to Bob.</li>
|
|
</ul>
|
|
<p>The proposed protocol MUST adhere to the following design requirements:</p>
|
|
<ol>
|
|
<li>Alice knows Bob's Ethereum address</li>
|
|
<li>Bob is willing to participate to Eth-PM, and publishes <code>B'</code></li>
|
|
<li>Bob's ownership of <code>B'</code> MUST be verifiable</li>
|
|
<li>Alice wants to send message <code>M</code> to Bob</li>
|
|
<li>Bob SHOULD be able to get <code>M</code> using <a href="waku/standards/core/10/waku2.html">10/WAKU2</a></li>
|
|
<li>Participants only have access to their Ethereum Wallet via the Web3 API</li>
|
|
<li>Carole MUST NOT be able to read <code>M</code>'s content,
|
|
even if she is storing it or relaying it</li>
|
|
<li><a href="waku/standards/application/26/payload.html">Waku Message Version 1</a> Asymmetric Encryption
|
|
is used for encryption purposes.</li>
|
|
</ol>
|
|
<h2 id="limitations"><a class="header" href="#limitations">Limitations</a></h2>
|
|
<p>Alice's details are not included in the message's structure,
|
|
meaning that there is no programmatic way for Bob to reply to Alice
|
|
or verify her identity.</p>
|
|
<p>Private messages are sent on the same content topic for all users.
|
|
As the recipient data is encrypted,
|
|
all participants must decrypt all messages which can lead to scalability issues.</p>
|
|
<p>This protocol does not guarantee Perfect Forward Secrecy nor Future Secrecy:
|
|
If Bob's private key is compromised, past and future messages could be decrypted.
|
|
A solution combining regular <a href="https://www.signal.org/docs/specifications/x3dh/">X3DH</a>
|
|
bundle broadcast with <a href="https://signal.org/docs/specifications/doubleratchet/">Double Ratchet</a>
|
|
encryption would remove these limitations;
|
|
See the <a href="status/deprecated/secure-transport.html">Status secure transport specification</a>
|
|
for an example of a protocol that achieves this in a peer-to-peer setting.</p>
|
|
<p>Bob MUST decide to participate in the protocol before Alice can send him a message.
|
|
This is discussed in more detail in
|
|
<a href="#consideration-for-a-non-interactiveuncoordinated-protocol">Consideration for a non-interactive/uncoordinated protocol</a></p>
|
|
<h2 id="the-protocol"><a class="header" href="#the-protocol">The Protocol</a></h2>
|
|
<h3 id="generate-encryption-keypair"><a class="header" href="#generate-encryption-keypair">Generate Encryption KeyPair</a></h3>
|
|
<p>First, Bob needs to generate a keypair for Encryption purposes.</p>
|
|
<p>Bob SHOULD get 32 bytes from a secure random source as Encryption Private Key, <code>b'</code>.
|
|
Then Bob can compute the corresponding SECP-256k1 Public Key, <code>B'</code>.</p>
|
|
<h3 id="broadcast-encryption-public-key"><a class="header" href="#broadcast-encryption-public-key">Broadcast Encryption Public Key</a></h3>
|
|
<p>For Alice to encrypt messages for Bob,
|
|
Bob SHOULD broadcast his Encryption Public Key <code>B'</code>.
|
|
To prove that the Encryption Public Key <code>B'</code>
|
|
is indeed owned by the owner of Bob's Ethereum Account <code>B</code>,
|
|
Bob MUST sign <code>B'</code> using <code>B</code>.</p>
|
|
<h3 id="sign-encryption-public-key"><a class="header" href="#sign-encryption-public-key">Sign Encryption Public Key</a></h3>
|
|
<p>To prove ownership of the Encryption Public Key,
|
|
Bob must sign it using <a href="https://eips.ethereum.org/EIPS/eip-712">EIP-712</a> v3,
|
|
meaning calling <code>eth_signTypedData_v3</code> on his wallet's API.</p>
|
|
<p>Note: While v4 also exists, it is not available on all wallets and
|
|
the features brought by v4 is not needed for the current use case.</p>
|
|
<p>The <code>TypedData</code> to be passed to <code>eth_signTypedData_v3</code> MUST be as follows, where:</p>
|
|
<ul>
|
|
<li><code>encryptionPublicKey</code> is Bob's Encryption Public Key, <code>B'</code>,
|
|
in hex format, <strong>without</strong> <code>0x</code> prefix.</li>
|
|
<li><code>bobAddress</code> is Bob's Ethereum address, corresponding to <code>B</code>,
|
|
in hex format, <strong>with</strong> <code>0x</code> prefix.</li>
|
|
</ul>
|
|
<pre><code class="language-js">const typedData = {
|
|
domain: {
|
|
chainId: 1,
|
|
name: 'Ethereum Private Message over Waku',
|
|
version: '1',
|
|
},
|
|
message: {
|
|
encryptionPublicKey: encryptionPublicKey,
|
|
ownerAddress: bobAddress,
|
|
},
|
|
primaryType: 'PublishEncryptionPublicKey',
|
|
types: {
|
|
EIP712Domain: [
|
|
{ name: 'name', type: 'string' },
|
|
{ name: 'version', type: 'string' },
|
|
{ name: 'chainId', type: 'uint256' },
|
|
],
|
|
PublishEncryptionPublicKey: [
|
|
{ name: 'encryptionPublicKey', type: 'string' },
|
|
{ name: 'ownerAddress', type: 'string' },
|
|
],
|
|
},
|
|
}
|
|
</code></pre>
|
|
<h3 id="public-key-message"><a class="header" href="#public-key-message">Public Key Message</a></h3>
|
|
<p>The resulting signature is then included in a <code>PublicKeyMessage</code>, where</p>
|
|
<ul>
|
|
<li><code>encryption_public_key</code> is Bob's Encryption Public Key <code>B'</code>, not compressed,</li>
|
|
<li><code>eth_address</code> is Bob's Ethereum Address <code>B</code>,</li>
|
|
<li><code>signature</code> is the EIP-712 as described above.</li>
|
|
</ul>
|
|
<pre><code class="language-protobuf">syntax = "proto3";
|
|
|
|
message PublicKeyMessage {
|
|
bytes encryption_public_key = 1;
|
|
bytes eth_address = 2;
|
|
bytes signature = 3;
|
|
}
|
|
</code></pre>
|
|
<p>This MUST be wrapped in a <a href="/waku/standards/core/14/message.html">14/WAKU-MESSAGE</a> version 0,
|
|
with the Public Key Broadcast content topic.
|
|
Finally, Bob SHOULD publish the message on Waku.</p>
|
|
<h2 id="consideration-for-a-non-interactiveuncoordinated-protocol"><a class="header" href="#consideration-for-a-non-interactiveuncoordinated-protocol">Consideration for a non-interactive/uncoordinated protocol</a></h2>
|
|
<p>Alice has to get Bob's public Key to send a message to Bob.
|
|
Because an Ethereum Address is part of the hash of the public key's account,
|
|
it is not enough in itself to deduce Bob's Public Key.</p>
|
|
<p>This is why the protocol dictates that Bob MUST send his Public Key first,
|
|
and Alice MUST receive it before she can send him a message.</p>
|
|
<p>Moreover, nwaku, the reference implementation of <a href="/waku/standards/core/13/store.html">13/WAKU2-STORE</a>,
|
|
stores messages for a maximum period of 30 days.
|
|
This means that Bob would need to broadcast his public key
|
|
at least every 30 days to be reachable.</p>
|
|
<p>Below we are reviewing possible solutions to mitigate this "sign up" step.</p>
|
|
<h3 id="retrieve-the-public-key-from-the-blockchain"><a class="header" href="#retrieve-the-public-key-from-the-blockchain">Retrieve the public key from the blockchain</a></h3>
|
|
<p>If Bob has signed at least one transaction with his account
|
|
then his Public Key can be extracted from the transaction's ECDSA signature.
|
|
The challenge with this method is that standard Web3 Wallet API
|
|
does not allow Alice to specifically retrieve all/any transaction sent by Bob.</p>
|
|
<p>Alice would instead need to use the <code>eth.getBlock</code> API
|
|
to retrieve Ethereum blocks one by one.
|
|
For each block, she would need to check the <code>from</code> value of each transaction
|
|
until she finds a transaction sent by Bob.</p>
|
|
<p>This process is resource intensive and
|
|
can be slow when using services such as Infura due to rate limits in place,
|
|
which makes it inappropriate for a browser or mobile phone environment.</p>
|
|
<p>An alternative would be to either run a backend
|
|
that can connect directly to an Ethereum node,
|
|
use a centralized blockchain explorer
|
|
or use a decentralized indexing service such as <a href="https://thegraph.com/">The Graph</a>.</p>
|
|
<p>Note that these would resolve a UX issue
|
|
only if a sender wants to proceed with <em>air drops</em>.</p>
|
|
<p>Indeed, if Bob does not publish his Public Key in the first place
|
|
then it MAY be an indication that he does not participate in this protocol
|
|
and hence will not receive messages.</p>
|
|
<p>However, these solutions would be helpful
|
|
if the sender wants to proceed with an <em>air drop</em> of messages:
|
|
Send messages over Waku for users to retrieve later,
|
|
once they decide to participate in this protocol.
|
|
Bob may not want to participate first but may decide to participate at a later stage
|
|
and would like to access previous messages.
|
|
This could make sense in an NFT offer scenario:
|
|
Users send offers to any NFT owner,
|
|
NFT owner may decide at some point to participate in the protocol and
|
|
retrieve previous offers.</p>
|
|
<h3 id="publishing-the-public-in-long-term-storage"><a class="header" href="#publishing-the-public-in-long-term-storage">Publishing the public in long term storage</a></h3>
|
|
<p>Another improvement would be for Bob not having to re-publish his public key
|
|
every 30 days or less.
|
|
Similarly to above,
|
|
if Bob stops publishing his public key
|
|
then it MAY be an indication that he does not participate in the protocol anymore.</p>
|
|
<p>In any case,
|
|
the protocol could be modified to store the Public Key in a more permanent storage,
|
|
such as a dedicated smart contract on the blockchain.</p>
|
|
<h2 id="send-private-message"><a class="header" href="#send-private-message">Send Private Message</a></h2>
|
|
<p>Alice MAY monitor the Waku network to collect Ethereum Address and
|
|
Encryption Public Key tuples.
|
|
Alice SHOULD verify that the <code>signature</code>s of <code>PublicKeyMessage</code>s she receives
|
|
are valid as per EIP-712.
|
|
She SHOULD drop any message without a signature or with an invalid signature.</p>
|
|
<p>Using Bob's Encryption Public Key,
|
|
retrieved via <a href="/waku/standards/core/10/waku2.html">10/WAKU2</a>,
|
|
Alice MAY now send an encrypted message to Bob.</p>
|
|
<p>If she wishes to do so,
|
|
Alice MUST encrypt her message <code>M</code> using Bob's Encryption Public Key <code>B'</code>,
|
|
as per <a href="waku/standards/application/26/payload.html">26/WAKU-PAYLOAD Asymmetric Encryption specs</a>.</p>
|
|
<p>Alice SHOULD now publish this message on the Private Message content topic.</p>
|
|
<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="/waku/standards/core/10/waku2.html">10/WAKU2</a></li>
|
|
<li><a href="waku/standards/application/26/payload.html">Waku Message Version 1</a></li>
|
|
<li><a href="https://www.signal.org/docs/specifications/x3dh/">X3DH</a></li>
|
|
<li><a href="https://signal.org/docs/specifications/doubleratchet/">Double Ratchet</a></li>
|
|
<li><a href="status/deprecated/secure-transport.html">Status secure transport specification</a></li>
|
|
<li><a href="https://eips.ethereum.org/EIPS/eip-712">EIP-712</a></li>
|
|
<li><a href="/waku/standards/core/13/store.html">13/WAKU2-STORE</a></li>
|
|
<li><a href="https://thegraph.com/">The Graph</a></li>
|
|
</ul>
|
|
|
|
</main>
|
|
|
|
<nav class="nav-wrapper" aria-label="Page navigation">
|
|
<!-- Mobile navigation buttons -->
|
|
<a rel="prev" href="../../../../waku/standards/application/index.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="../../../../waku/standards/application/26/payload.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="../../../../waku/standards/application/index.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="../../../../waku/standards/application/26/payload.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>
|