mirror of
https://github.com/vacp2p/rfc-index.git
synced 2026-01-09 22:08:07 -05:00
642 lines
54 KiB
HTML
642 lines
54 KiB
HTML
<!DOCTYPE HTML>
|
|
<html lang="en" class="ayu" dir="ltr">
|
|
<head>
|
|
<!-- Book generated using mdBook -->
|
|
<meta charset="UTF-8">
|
|
<title>Account - 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"><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" class="active"><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="account"><a class="header" href="#account">ACCOUNT</a></h1>
|
|
<div class="rfc-meta">
|
|
<table>
|
|
<tr><th>Name</th><td>Account</td></tr>
|
|
<tr><th>Status</th><td>deprecated</td></tr>
|
|
<tr><th>Editor</th><td>Filip Dimitrijevic <filip@status.im></td></tr>
|
|
<tr><th>Contributors</th><td>Corey Petty <corey@status.im><br>Oskar Thorén <oskar@status.im><br>Samuel Hawksby-Robinson <samuel@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/status/deprecated/account.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/deprecated/account.md"><code>d03e699</code></a> — ci: add mdBook configuration (#233)</li>
|
|
<li><strong>2025-06-05</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/36caaa621a711c7d73b5ecc80e7ba5f938d30691/status/deprecated/account.md"><code>36caaa6</code></a> — Fix Errors rfc.vac.dev (#165)</li>
|
|
<li><strong>2025-04-29</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/614348a4982aa9e519ccff8b8fbcd4c554683288/status/deprecated/account.md"><code>614348a</code></a> — Status deprecated update2 (#134)</li>
|
|
</ul>
|
|
<!-- timeline:end -->
|
|
<h2 id="abstract"><a class="header" href="#abstract">Abstract</a></h2>
|
|
<p>This specification explains what a Status account is,<br />
|
|
and how a node establishes trust.</p>
|
|
<h2 id="introduction"><a class="header" href="#introduction">Introduction</a></h2>
|
|
<p>The core concept of an account in Status is a set of cryptographic keypairs.
|
|
Namely, the combination of the following:</p>
|
|
<ol>
|
|
<li>a Whisper/Waku chat identity keypair</li>
|
|
<li>a set of cryptocurrency wallet keypairs</li>
|
|
</ol>
|
|
<p>The node verifies or derives everything else associated with the contact from the above items, including:</p>
|
|
<ul>
|
|
<li>Ethereum address (future verification, currently the same base keypair)</li>
|
|
<li>3 word mnemonic name</li>
|
|
<li>identicon</li>
|
|
<li>message signatures</li>
|
|
</ul>
|
|
<h2 id="initial-key-generation"><a class="header" href="#initial-key-generation">Initial Key Generation</a></h2>
|
|
<h3 id="publicprivate-keypairs"><a class="header" href="#publicprivate-keypairs">Public/Private Keypairs</a></h3>
|
|
<ul>
|
|
<li>An ECDSA (secp256k1 curve) public/private keypair MUST be generated via a <a href="https://github.com/bitcoin/bips/blob/master/bip-0043.mediawiki">BIP43</a> derived path from a <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">BIP39</a> mnemonic seed phrase.</li>
|
|
<li>The default paths are defined as such:
|
|
<ul>
|
|
<li>Whisper/Waku Chat Key (<code>IK</code>): <code>m/43'/60'/1581'/0'/0</code> (post Multiaccount integration)
|
|
<ul>
|
|
<li>following <a href="https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1581.md">EIP1581</a></li>
|
|
</ul>
|
|
<!-- WE CURRENTLY DO NOT IMPLEMENT ENCRYPTION KEY, FOR FUTURE - C.P. -->
|
|
<!-- - DB encryption Key (`DBK`): `m/43'/60'/1581'/1'/0` (post Multiaccount integration) -->
|
|
<!-- - following [EIP1581](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1581.md) -->
|
|
<ul>
|
|
<li>Status Wallet paths: <code>m/44'/60'/0'/0/i</code> starting at <code>i=0</code>
|
|
<ul>
|
|
<li>following <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki">BIP44</a></li>
|
|
<li>NOTE: this (<code>i=0</code>) is also the current (and only) path for Whisper/Waku key before Multiaccount integration</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h3 id="x3dh-prekey-bundle-creation"><a class="header" href="#x3dh-prekey-bundle-creation">X3DH Prekey bundle creation</a></h3>
|
|
<ul>
|
|
<li>
|
|
<p>Status follows the X3DH prekey bundle scheme that <a href="https://en.wikipedia.org/wiki/Signal_Messenger#2013%E2%80%932018:_Open_Whisper_Systems">Open Whisper Systems</a> (not to be confused with the Whisper sub-protocol) outlines <a href="https://signal.org/docs/specifications/x3dh/#the-x3dh-protocol">in their documentation</a> with the following exceptions:</p>
|
|
<ul>
|
|
<li>Status does not publish one-time keys <code>OPK</code> or perform DH including them, because there are no central servers in the Status implementation.</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<p>A client MUST create X3DH prekey bundles, each defined by the following items:</p>
|
|
<ul>
|
|
<li>Identity Key: <code>IK</code></li>
|
|
<li>Signed prekey: <code>SPK</code></li>
|
|
<li>Prekey signature: <code>Sig(IK, Encode(SPK))</code></li>
|
|
<li>Timestamp</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<p>These bundles are made available in a variety of ways, as defined in section 2.1.</p>
|
|
</li>
|
|
</ul>
|
|
<h2 id="account-broadcasting"><a class="header" href="#account-broadcasting">Account Broadcasting</a></h2>
|
|
<ul>
|
|
<li>A user is responsible for broadcasting certain information publicly so that others may contact them.</li>
|
|
</ul>
|
|
<h3 id="x3dh-prekey-bundles"><a class="header" href="#x3dh-prekey-bundles">X3DH Prekey bundles</a></h3>
|
|
<ul>
|
|
<li>A client SHOULD regenerate a new X3DH prekey bundle every 24 hours. This MAY be done in a lazy way, such that a client that does not come online past this time period does not regenerate or broadcast bundles.</li>
|
|
<li>The current bundle SHOULD be broadcast on a Whisper/Waku topic specific to his Identity Key, <code>{IK}-contact-code</code>, intermittently. This MAY be done every 6 hours.</li>
|
|
<li>A bundle SHOULD accompany every message sent.</li>
|
|
<li>TODO: retrieval of long-time offline users bundle via <code>{IK}-contact-code</code></li>
|
|
</ul>
|
|
<h2 id="optional-account-additions"><a class="header" href="#optional-account-additions">Optional Account additions</a></h2>
|
|
<h3 id="ens-username"><a class="header" href="#ens-username">ENS Username</a></h3>
|
|
<ul>
|
|
<li>A user MAY register a public username on the Ethereum Name System (ENS). This username is a user-chosen subdomain of the <code>stateofus.eth</code> ENS registration that maps to their Whisper/Waku identity key (<code>IK</code>).</li>
|
|
</ul>
|
|
<!-- ### User Profile Picture
|
|
- An account MAY edit the `IK` generated identicon with a chosen picture. This picture will become part of the publicly broadcast profile of the account. -->
|
|
<!-- TODO: Elaborate on wallet account and multiaccount -->
|
|
<!-- TODO: Elaborate on security implications -->
|
|
<h2 id="trust-establishment"><a class="header" href="#trust-establishment">Trust establishment</a></h2>
|
|
<p><strong>Trust establishment deals with users verifying they are communicating with who they think they are.</strong></p>
|
|
<h3 id="terms-glossary"><a class="header" href="#terms-glossary">Terms Glossary</a></h3>
|
|
<div class="table-wrapper"><table><thead><tr><th>term</th><th>description</th></tr></thead><tbody>
|
|
<tr><td>privkey</td><td>ECDSA secp256k1 private key</td></tr>
|
|
<tr><td>pubkey</td><td>ECDSA secp256k1 public key</td></tr>
|
|
<tr><td>Whisper/Waku key</td><td>pubkey for chat with HD derivation path m/43'/60'/1581'/0'/0</td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<h3 id="contact-discovery"><a class="header" href="#contact-discovery">Contact Discovery</a></h3>
|
|
<h4 id="public-channels"><a class="header" href="#public-channels">Public channels</a></h4>
|
|
<ul>
|
|
<li>Public group channels in Status are a broadcast/subscription system. All public messages are encrypted with a symmetric key derived from the channel name, <code>K_{pub,sym}</code>, which is publicly known.</li>
|
|
<li>A public group channel's symmetric key MUST creation must follow the <a href="https://web3js.readthedocs.io/en/1.0/web3-shh.html#generatesymkeyfrompassword">web3 API</a>'s <code>web3.ssh.generateSymKeyFromPassword</code> function</li>
|
|
<li>In order to post to a public group channel, a client MUST have a valid account created.</li>
|
|
<li>In order to listen to a public group channel, a client must subscribe to the channel name.
|
|
The sender of a message is derived from the message's signature.</li>
|
|
<li>Discovery of channel names is not currently part of the protocol, and is typically done out of band.
|
|
If a channel name is used that has not been used, it will be created.</li>
|
|
<li>A client MUST sign the message otherwise it will be discarded by the recipients.</li>
|
|
<li>channel name specification:
|
|
<ul>
|
|
<li>matches <code>[a-z0-9\-]</code></li>
|
|
<li>is not a public key</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h4 id="private-11-messages"><a class="header" href="#private-11-messages">Private 1:1 messages</a></h4>
|
|
<p>This can be done in the following ways:</p>
|
|
<ol>
|
|
<li>scanning a user generated QR code</li>
|
|
<li>discovery through the Status app</li>
|
|
<li>asynchronous X3DH key exchange</li>
|
|
<li>public key via public channel listening
|
|
<ul>
|
|
<li><code>status-mobile/src/status_im/contact_code/core.cljs</code></li>
|
|
</ul>
|
|
</li>
|
|
<li>contact codes</li>
|
|
<li>decentralized storage (not implemented)</li>
|
|
<li>Whisper/Waku</li>
|
|
</ol>
|
|
<h3 id="initial-key-exchange"><a class="header" href="#initial-key-exchange">Initial Key Exchange</a></h3>
|
|
<h4 id="bundles"><a class="header" href="#bundles">Bundles</a></h4>
|
|
<ul>
|
|
<li>
|
|
<p>An X3DH prekey bundle is defined as (<a href="https://github.com/status-im/status-go/messaging/chat/protobuf/encryption.pb.go">code</a>):</p>
|
|
<pre><code class="language-golang">Identity // Identity key
|
|
SignedPreKeys // a map of installation id to array of signed prekeys by that installation id
|
|
Signature // Prekey signature
|
|
Timestamp // When the bundle was lasted created locally
|
|
</code></pre>
|
|
<ul>
|
|
<li>include BundleContainer</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<p>a new bundle SHOULD be created at least every 12 hours</p>
|
|
</li>
|
|
<li>
|
|
<p>a node only generates a bundle when it is used</p>
|
|
</li>
|
|
<li>
|
|
<p>a bundle SHOULD be distributed on the contact code channel. This is the Whisper and Waku topic <code>{IK}-contact-code</code>,
|
|
where <code>IK</code> is the hex encoded public key of the user, prefixed with <code>0x</code>.
|
|
The node encrypts the channel in the same way it encrypted public chats.</p>
|
|
</li>
|
|
</ul>
|
|
<h3 id="contact-verification"><a class="header" href="#contact-verification">Contact Verification</a></h3>
|
|
<p>To verify that contact key information is as it should be, use the following.</p>
|
|
<h4 id="identicon"><a class="header" href="#identicon">Identicon</a></h4>
|
|
<p>A low-poly identicon is deterministically generated from the Whisper/Waku chat public key.
|
|
This can be compared out of band to ensure the receiver's public key is the one stored locally.</p>
|
|
<h4 id="3-word-pseudonym--whisperwaku-key-fingerprint"><a class="header" href="#3-word-pseudonym--whisperwaku-key-fingerprint">3 word pseudonym / Whisper/Waku key fingerprint</a></h4>
|
|
<p>Status generates a deterministic 3-word random pseudonym from the Whisper/Waku chat public key.
|
|
This pseudonym acts as a human readable fingerprint to the Whisper/Waku chat public key.
|
|
This name also shows when viewing a contact's public profile and in the chat UI.</p>
|
|
<ul>
|
|
<li>implementation: <a href="https://github.com/status-im/status-mobile/tree/develop/src/status_im/utils/gfycat">gfycat</a></li>
|
|
</ul>
|
|
<h4 id="ens-name"><a class="header" href="#ens-name">ENS name</a></h4>
|
|
<p>Status offers the ability to register a mapping of a human readable subdomain of <code>stateofus.eth</code> to their Whisper/Waku chat public key.
|
|
The user purchases this registration (currently by staking 10 SNT)
|
|
and the node stores it on the Ethereum mainnet blockchain for public lookup.</p>
|
|
<!-- TODO: Elaborate on security implications -->
|
|
<!-- TODO: Incorporate or cut below into proper spec
|
|
|
|
### Possible Connection Breakdown
|
|
|
|
possible connections
|
|
- client - client (not really ever, this is facilitated through all other connections)
|
|
- personal chat
|
|
- ratcheted with X3DH
|
|
- private group chat
|
|
- pairwise ratcheted with X3DH
|
|
- public chat
|
|
- client - mailserver (statusd + ???)
|
|
- a mailserver identifies itself by an [enode address](https://github.com/ethereum/wiki/wiki/enode-url-format)
|
|
- client - Whisper/Waku node (statusd)
|
|
- a node identifies itself by an enode address
|
|
- client - bootnode (go-ethereum)
|
|
- a bootnode identifies itself by
|
|
- an enode address
|
|
- `NOTE: redezvous information here`
|
|
- client - ENS registry (ethereum blockchain -> default to infura)
|
|
- client - Ethereum RPC (custom go-ethereum RPC API -> default to infura API)
|
|
- client - IPFS (Status hosted IPFS gateway -> defaults to ???)
|
|
- we have a status hosted IPFS gateway for pinning but it currently isn't used much.
|
|
|
|
### Notes
|
|
|
|
A user in the system is a public-private key pair using the Elliptic-Curve Cryptography secp256k1 that Ethereum uses.
|
|
- A 3-word random name is derived from the public key using the following package
|
|
- `NOTE: need to find package`
|
|
- This provides an associated human-readble fingerprint to the user's public key
|
|
- A user can optionally add additional layers on top of this keypair
|
|
- Chosen username
|
|
- ENS username
|
|
|
|
All messages sent are encrypted with the public key of the destination and signed by the private key of the given user using the following scheme:
|
|
- private chat
|
|
- X3DH is used to define shared secrets which is then double ratcheted
|
|
- private group chat
|
|
- considered pairwise private chats
|
|
- public group chat
|
|
- the message is encrypted with a symmetric key derived from the chat name
|
|
|
|
-->
|
|
<h2 id="public-key-serialization"><a class="header" href="#public-key-serialization">Public Key Serialization</a></h2>
|
|
<p>Idiomatically known as "public key compression" and "public key decompression".</p>
|
|
<p>The node SHOULD provide functionality for the serialization and deserialization of public / chat keys.</p>
|
|
<p>For maximum flexibility, when implementing this functionality, the node MUST support public keys encoded in a range of encoding formats, detailed below.</p>
|
|
<h3 id="basic-serialization-example"><a class="header" href="#basic-serialization-example">Basic Serialization Example</a></h3>
|
|
<p>In the example of a typical hexadecimal encoded elliptical curve (EC) public key (such as a secp256k1 pk),</p>
|
|
<pre><code class="language-text">0x04261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc3cd4e22200c68daf7493e1f8da6a190a68a671e2d3977809612424c7c3888bc6
|
|
</code></pre>
|
|
<p>minor modification for compatibility and flexibility makes the key self-identifiable and easily parsable,</p>
|
|
<pre><code class="language-text">fe70104261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc3cd4e22200c68daf7493e1f8da6a190a68a671e2d3977809612424c7c3888bc6
|
|
</code></pre>
|
|
<p>EC serialization and compact encoding produces a much smaller string representation of the original key.</p>
|
|
<pre><code class="language-text">zQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB
|
|
</code></pre>
|
|
<h3 id="public-key-compression-rationale"><a class="header" href="#public-key-compression-rationale">Public Key "Compression" Rationale</a></h3>
|
|
<p>Serialized and compactly encoded ("compressed") public keys have a number of UI / UX advantages
|
|
over non-serialized less densely encoded public keys.</p>
|
|
<p>Compressed public keys are smaller, and users may perceive them as less intimidating and less unnecessarily large.
|
|
Compare the "compressed" and "uncompressed" version of the same public key from above example:</p>
|
|
<ul>
|
|
<li><code>0xe70104261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc3cd4e22200c68daf7493e1f8da6a190a68a671e2d3977809612424c7c3888bc6</code></li>
|
|
<li><code>zQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB</code></li>
|
|
</ul>
|
|
<p>The user can transmit and share the same data, but at one third of the original size.
|
|
136 characters uncompressed vs 49 characters compressed, giving a significant character length reduction of 64%.</p>
|
|
<p>The user client app MAY use the compressed public keys throughout the user interface.
|
|
For example in the <code>status-mobile</code> implementation of the user interface
|
|
the following places could take advantage of a significantly smaller public key:</p>
|
|
<ul>
|
|
<li><code>Onboarding</code> > <code>Choose a chat name</code></li>
|
|
<li><code>Profile</code> > <code>Header</code></li>
|
|
<li><code>Profile</code> > <code>Share icon</code> > <code>QR code popover</code></li>
|
|
<li><code>Invite friends</code> url from <code>Invite friends</code> button and <code>+ -button</code> > <code>Invite friends</code></li>
|
|
<li>Other user <code>Profile details</code></li>
|
|
<li><code>Profile details</code> > <code>Share icon</code> > <code>QR code popover</code></li>
|
|
</ul>
|
|
<p>In the case of QR codes a compressed public key can reduce the complexity of the derived codes:</p>
|
|
<div class="table-wrapper"><table><thead><tr><th>Uncompressed</th></tr></thead><tbody>
|
|
<tr><td><img src="/status/deprecated/images/qr-code1-accountmd.png" alt="image" /></td></tr>
|
|
</tbody></table>
|
|
</div><div class="table-wrapper"><table><thead><tr><th>Compressed</th></tr></thead><tbody>
|
|
<tr><td><img src="/status/deprecated/images/qr-code2-accountmd.png" alt="image" /></td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<h3 id="key-encoding"><a class="header" href="#key-encoding">Key Encoding</a></h3>
|
|
<p>When implementing the pk de/serialization functionality, the node MUST use the <a href="https://github.com/multiformats/multibase">multiformats/multibase</a>
|
|
encoding protocol to interpret incoming key data and to return key data in a desired encoding.</p>
|
|
<p>The node SHOULD support the following <code>multibase</code> encoding formats.</p>
|
|
<pre><code class="language-csv">encoding, code, description, status
|
|
identity, 0x00, 8-bit binary (encoder and decoder keeps data unmodified), default
|
|
base2, 0, binary (01010101), candidate
|
|
base8, 7, octal, draft
|
|
base10, 9, decimal, draft
|
|
base16, f, hexadecimal, default
|
|
base16upper, F, hexadecimal, default
|
|
base32hex, v, rfc4648 case-insensitive - no padding - highest char, candidate
|
|
base32hexupper, V, rfc4648 case-insensitive - no padding - highest char, candidate
|
|
base32hexpad, t, rfc4648 case-insensitive - with padding, candidate
|
|
base32hexpadupper, T, rfc4648 case-insensitive - with padding, candidate
|
|
base32, b, rfc4648 case-insensitive - no padding, default
|
|
base32upper, B, rfc4648 case-insensitive - no padding, default
|
|
base32pad, c, rfc4648 case-insensitive - with padding, candidate
|
|
base32padupper, C, rfc4648 case-insensitive - with padding, candidate
|
|
base32z, h, z-base-32 (used by Tahoe-LAFS), draft
|
|
base36, k, base36 [0-9a-z] case-insensitive - no padding, draft
|
|
base36upper, K, base36 [0-9a-z] case-insensitive - no padding, draft
|
|
base58btc, z, base58 bitcoin, default
|
|
base58flickr, Z, base58 flicker, candidate
|
|
base64, m, rfc4648 no padding, default
|
|
base64pad, M, rfc4648 with padding - MIME encoding, candidate
|
|
base64url, u, rfc4648 no padding, default
|
|
base64urlpad, U, rfc4648 with padding, default
|
|
</code></pre>
|
|
<p><strong>Note</strong> this specification RECOMMENDs that implementations extend the standard <code>multibase</code> protocol
|
|
to parse strings prepended with <code>0x</code> as <code>f</code> hexadecimal encoded bytes.</p>
|
|
<p>Implementing this recommendation will allow the node to correctly interpret traditionally identified hexadecimal strings (e.g. <code>0x1337c0de</code>).</p>
|
|
<p><em>Example:</em></p>
|
|
<p><code>0xe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc</code></p>
|
|
<p>SHOULD be interpreted as</p>
|
|
<p><code>fe70102261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc</code></p>
|
|
<p>This specification RECOMMENDs that the consuming service of the node uses a compact encoding type,
|
|
such as base64 or base58 to allow for as short representations of the key as possible.</p>
|
|
<h3 id="public-key-types"><a class="header" href="#public-key-types">Public Key Types</a></h3>
|
|
<p>When implementing the pk de/serialization functionality, The node MUST support the <a href="https://github.com/multiformats/multicodec">multiformats/multicodec</a> key type identifiers for the following public key type.</p>
|
|
<div class="table-wrapper"><table><thead><tr><th>Name</th><th>Tag</th><th>Code</th><th>Description</th></tr></thead><tbody>
|
|
<tr><td><code>secp256k1-pub</code></td><td>key</td><td><code>0xe7</code></td><td>Secp256k1 public key</td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<p>For a public key to be identifiable to the node the public key data MUST be prepended with the relevant <a href="https://github.com/multiformats/unsigned-varint">multiformats/unsigned-varint</a> formatted code.</p>
|
|
<p><em>Example:</em></p>
|
|
<p>Below is a representation of an deserialized secp256k1 public key.</p>
|
|
<pre><code class="language-text">04
|
|
26 | 1c | 55 | 67 | 5e | 55 | ff | 25
|
|
ed | b5 | 0b | 34 | 5c | fb | 3a | 3f
|
|
35 | f6 | 07 | 12 | d2 | 51 | cb | aa
|
|
ab | 97 | bd | 50 | 05 | 4c | 6e | bc
|
|
3c | d4 | e2 | 22 | 00 | c6 | 8d | af
|
|
74 | 93 | e1 | f8 | da | 6a | 19 | 0a
|
|
68 | a6 | 71 | e2 | d3 | 97 | 78 | 09
|
|
61 | 24 | 24 | c7 | c3 | 88 | 8b | c6
|
|
</code></pre>
|
|
<p>The <code>multicodec</code> code for a secp256k1 public key is <code>0xe7</code>.</p>
|
|
<p>After parsing the code <code>0xe7</code> as a <code>multiformats/uvarint</code>, the byte value is <code>0xe7 0x01</code>, prepending this to the public key results in the below representation.</p>
|
|
<pre><code class="language-text">e7 | 01 | 04
|
|
26 | 1c | 55 | 67 | 5e | 55 | ff | 25
|
|
ed | b5 | 0b | 34 | 5c | fb | 3a | 3f
|
|
35 | f6 | 07 | 12 | d2 | 51 | cb | aa
|
|
ab | 97 | bd | 50 | 05 | 4c | 6e | bc
|
|
3c | d4 | e2 | 22 | 00 | c6 | 8d | af
|
|
74 | 93 | e1 | f8 | da | 6a | 19 | 0a
|
|
68 | a6 | 71 | e2 | d3 | 97 | 78 | 09
|
|
61 | 24 | 24 | c7 | c3 | 88 | 8b | c6
|
|
</code></pre>
|
|
<h3 id="deserialization-process-flow"><a class="header" href="#deserialization-process-flow">De/Serialization Process Flow</a></h3>
|
|
<p>When implementing the pk de/serialization functionality, the node MUST be passed a <code>multicodec</code> identified public key,
|
|
of the above supported types, encoded with a valid <code>multibase</code> identifier.</p>
|
|
<p>This specification RECOMMENDs that the node also accept an encoding type parameter to encode the output data.
|
|
This provides for the case where the user requires the de/serialization key to be in a different encoding to the encoding of the given key.</p>
|
|
<h4 id="serialization-example"><a class="header" href="#serialization-example">Serialization Example</a></h4>
|
|
<p>A hexadecimal encoded secp256k1 public chat key typically is represented as below:</p>
|
|
<pre><code class="language-text">0x04261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc3cd4e22200c68daf7493e1f8da6a190a68a671e2d3977809612424c7c3888bc6
|
|
</code></pre>
|
|
<p>To be properly interpreted by the node for serialization the public key MUST be prepended with the <code>multicodec</code> <code>uvarint</code> code <code>0xea 0x01</code>
|
|
and encoded with a valid <code>multibase</code> encoding, therefore giving the following:</p>
|
|
<pre><code class="language-text">fea0104261c55675e55ff25edb50b345cfb3a3f35f60712d251cbaaab97bd50054c6ebc3cd4e22200c68daf7493e1f8da6a190a68a671e2d3977809612424c7c3888bc6
|
|
</code></pre>
|
|
<p>If adhering to the specification recommendation to provide the user with an output encoding parameter,
|
|
the above string would be passed to the node with the following <code>multibase</code> encoding identifier.</p>
|
|
<p>In this example the output encoding is defined as <code>base58 bitcoin</code>.</p>
|
|
<pre><code class="language-text">z
|
|
</code></pre>
|
|
<p>The return value in this case would be</p>
|
|
<pre><code class="language-text">zQ3shPyZJnxZK4Bwyx9QsaksNKDYTPmpwPvGSjMYVHoXHeEgB
|
|
</code></pre>
|
|
<p>Which after <code>multibase</code> decoding can be represented in bytes as below:</p>
|
|
<pre><code class="language-text">e7 | 01 | 02
|
|
26 | 1c | 55 | 67 | 5e | 55 | ff | 25
|
|
ed | b5 | 0b | 34 | 5c | fb | 3a | 3f
|
|
35 | f6 | 07 | 12 | d2 | 51 | cb | aa
|
|
ab | 97 | bd | 50 | 05 | 4c | 6e | bc
|
|
</code></pre>
|
|
<h4 id="deserialization-example"><a class="header" href="#deserialization-example">Deserialization Example</a></h4>
|
|
<p>For the user, the deserialization process is exactly the same as serialization with the exception
|
|
that the user MUST provide a serialized public key for deserialization. Else the deserialization algorithm will fail.</p>
|
|
<p>For further guidance on the implementation of public key de/serialization consult the <a href="https://github.com/status-im/status-go/blob/c9772325f2dca76b3504191c53313663ca2efbe5/api/utils_test.go"><code>status-go</code> implementation and tests</a>.</p>
|
|
<h2 id="security-considerations"><a class="header" href="#security-considerations">Security Considerations</a></h2>
|
|
<ul>
|
|
<li></li>
|
|
</ul>
|
|
<h2 id="changelog"><a class="header" href="#changelog">Changelog</a></h2>
|
|
<h3 id="version-04"><a class="header" href="#version-04">Version 0.4</a></h3>
|
|
<p>Released <a href="https://github.com/status-im/specs/commit/e98a9b76b7d4e1ce93e0b692e1521c2d54f72c59">June 24, 2020</a></p>
|
|
<ul>
|
|
<li>Added details of public key serialization and deserialization</li>
|
|
</ul>
|
|
<h3 id="version-03"><a class="header" href="#version-03">Version 0.3</a></h3>
|
|
<p>Released <a href="https://github.com/status-im/specs/commit/664dd1c9df6ad409e4c007fefc8c8945b8d324e8">May 22, 2020</a></p>
|
|
<ul>
|
|
<li>Added language to include Waku in all relevant places</li>
|
|
<li>Change to keep <code>Mailserver</code> term consistent</li>
|
|
<li>Added clarification to Open Whisper Systems</li>
|
|
</ul>
|
|
<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="https://github.com/bitcoin/bips/blob/master/bip-0043.mediawiki">BIP43</a></li>
|
|
<li><a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">BIP39</a></li>
|
|
<li><a href="https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1581.md">EIP1581</a></li>
|
|
<li><a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki">BIP44</a></li>
|
|
<li><a href="https://en.wikipedia.org/wiki/Signal_Messenger#2013%E2%80%932018:_Open_Whisper_Systems">Open Whisper Systems</a></li>
|
|
<li><a href="https://signal.org/docs/specifications/x3dh/#the-x3dh-protocol">X3DH</a></li>
|
|
<li><a href="https://web3js.readthedocs.io/en/1.0/web3-shh.html#generatesymkeyfrompassword">web3 API</a></li>
|
|
<li><a href="https://github.com/status-im/status-go/messaging/chat/protobuf/encryption.pb.go">Protobuf encryption</a></li>
|
|
<li><a href="https://github.com/status-im/status-mobile/tree/develop/src/status_im/utils/gfycat">gfycat in Status</a></li>
|
|
<li><a href="https://github.com/multiformats/">multiformats</a></li>
|
|
<li><a href="https://github.com/status-im/status-go/blob/c9772325f2dca76b3504191c53313663ca2efbe5/api/utils_test.go">status-go implementation and tests</a></li>
|
|
<li><a href="https://github.com/status-im/specs/commit/e98a9b76b7d4e1ce93e0b692e1521c2d54f72c59">June 24, 2020 change commit</a></li>
|
|
<li><a href="https://github.com/status-im/specs/commit/664dd1c9df6ad409e4c007fefc8c8945b8d324e8">May 22, 2020 change commit</a></li>
|
|
</ul>
|
|
|
|
</main>
|
|
|
|
<nav class="nav-wrapper" aria-label="Page navigation">
|
|
<!-- Mobile navigation buttons -->
|
|
<a rel="prev" href="../../status/deprecated/3rd-party.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/deprecated/client.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/deprecated/3rd-party.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/deprecated/client.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>
|