mirror of
https://github.com/vacp2p/rfc-index.git
synced 2026-01-09 22:08:07 -05:00
464 lines
42 KiB
HTML
464 lines
42 KiB
HTML
<!DOCTYPE HTML>
|
||
<html lang="en" class="ayu" dir="ltr">
|
||
<head>
|
||
<!-- Book generated using mdBook -->
|
||
<meta charset="UTF-8">
|
||
<title>Consensus Hashgraphlike - 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" class="active"><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"><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="hashgraphlike-consensus"><a class="header" href="#hashgraphlike-consensus">HASHGRAPHLIKE CONSENSUS</a></h1>
|
||
<div class="table-wrapper"><table><thead><tr><th>Field</th><th>Value</th></tr></thead><tbody>
|
||
<tr><td>Name</td><td>Hashgraphlike Consensus Protocol</td></tr>
|
||
<tr><td>Status</td><td>raw</td></tr>
|
||
<tr><td>Category</td><td>Standards Track</td></tr>
|
||
<tr><td>Editor</td><td>Ugur Sen <a href="mailto:ugur@status.im">ugur@status.im</a></td></tr>
|
||
<tr><td>Contributors</td><td>seemenkina <a href="mailto:ekaterina@status.im">ekaterina@status.im</a></td></tr>
|
||
</tbody></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/0f1855edcf68ef982c4ce478b67d660809aa9830/docs/vac/raw/consensus-hashgraphlike.md"><code>0f1855e</code></a> — Chore/fix headers (#239)</li>
|
||
<li><strong>2025-12-22</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/b1a578393edf8487ccc97a5f25b25af9bf41efb3/docs/vac/raw/consensus-hashgraphlike.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/vac/raw/consensus-hashgraphlike.md"><code>d03e699</code></a> — ci: add mdBook configuration (#233)</li>
|
||
<li><strong>2025-09-15</strong> — <a href="https://github.com/vacp2p/rfc-index/blob/f051117d3782f66d773aaf27845c60a066ac10b6/vac/raw/consensus-hashgraphlike.md"><code>f051117</code></a> — VAC-RAW/Consensus-hashgraphlike RFC (#142)</li>
|
||
</ul>
|
||
<!-- timeline:end -->
|
||
<h2 id="abstract"><a class="header" href="#abstract">Abstract</a></h2>
|
||
<p>This document specifies a scalable, decentralized, and Byzantine Fault Tolerant (BFT)
|
||
consensus mechanism inspired by Hashgraph, designed for binary decision-making in P2P networks.</p>
|
||
<h2 id="motivation"><a class="header" href="#motivation">Motivation</a></h2>
|
||
<p>Consensus is one of the essential components of decentralization.
|
||
In particular, in the decentralized group messaging application is used for
|
||
binary decision-making to govern the group.
|
||
Therefore, each user contributes to the decision-making process.
|
||
Besides achieving decentralization, the consensus mechanism MUST be strong:</p>
|
||
<ul>
|
||
<li>
|
||
<p>Under the assumption of at least <code>2/3</code> honest users in the network.</p>
|
||
</li>
|
||
<li>
|
||
<p>Each user MUST conclude the same decision and scalability:
|
||
message propagation in the network MUST occur within <code>O(log n)</code> rounds,
|
||
where <code>n</code> is the total number of peers,
|
||
in order to preserve the scalability of the messaging application.</p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="format-specification"><a class="header" href="#format-specification">Format Specification</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="flow"><a class="header" href="#flow">Flow</a></h2>
|
||
<p>Any user in the group initializes the consensus by creating a proposal.
|
||
Next, the user broadcasts the proposal to the whole network.
|
||
Upon each user receives the proposal, validates the proposal,
|
||
adds its vote as yes or no and with its signature and timestamp.
|
||
The user then sends the proposal and vote to a random peer in a P2P setup,
|
||
or to a subscribed gossipsub channel if gossip-based messaging is used.
|
||
Therefore, each user first validates the signature and then adds its new vote.
|
||
Each sending message counts as a round.
|
||
After <code>log(n)</code> rounds all users in the network have the others vote
|
||
if at least <code>2/3</code> number of users are honest where honesty follows the protocol.</p>
|
||
<p>In general, the voting-based consensus consists of the following phases:</p>
|
||
<ol>
|
||
<li>Initialization of voting</li>
|
||
<li>Exchanging votes across the rounds</li>
|
||
<li>Counting the votes</li>
|
||
</ol>
|
||
<h3 id="assumptions"><a class="header" href="#assumptions">Assumptions</a></h3>
|
||
<ul>
|
||
<li>The users in the P2P network can discover the nodes or they are subscribing same channel in a gossipsub.</li>
|
||
<li>We MAY have non-reliable (silent) nodes.</li>
|
||
<li>Proposal owners MUST know the number of voters.</li>
|
||
</ul>
|
||
<h2 id="1-initialization-of-voting"><a class="header" href="#1-initialization-of-voting">1. Initialization of voting</a></h2>
|
||
<p>A user initializes the voting with the proposal payload which is
|
||
implemented using <a href="https://protobuf.dev/">protocol buffers v3</a> as follows:</p>
|
||
<pre><code class="language-bash">syntax = "proto3";
|
||
|
||
package vac.voting;
|
||
|
||
message Proposal {
|
||
string name = 10; // Proposal name
|
||
string payload = 11; // Proposal description
|
||
uint32 proposal_id = 12; // Unique identifier of the proposal
|
||
bytes proposal_owner = 13; // Public key of the creator
|
||
repeated Votes = 14; // Vote list in the proposal
|
||
uint32 expected_voters_count = 15; // Maximum number of distinct voters
|
||
uint32 round = 16; // Number of Votes
|
||
uint64 timestamp = 17; // Creation time of proposal
|
||
uint64 expiration_time = 18; // The time interval that the proposal is active.
|
||
bool liveness_criteria_yes = 19; // Shows how managing the silent peers vote
|
||
}
|
||
|
||
message Vote {
|
||
uint32 vote_id = 20; // Unique identifier of the vote
|
||
bytes vote_owner = 21; // Voter's public key
|
||
uint32 proposal_id = 22; // Linking votes and proposals
|
||
int64 timestamp = 23; // Time when the vote was cast
|
||
bool vote = 24; // Vote bool value (true/false)
|
||
bytes parent_hash = 25; // Hash of previous owner's Vote
|
||
bytes received_hash = 26; // Hash of previous received Vote
|
||
bytes vote_hash = 27; // Hash of all previously defined fields in Vote
|
||
bytes signature = 28; // Signature of vote_hash
|
||
}
|
||
|
||
</code></pre>
|
||
<p>To initiate a consensus for a proposal,
|
||
a user MUST complete all the fields in the proposal, including attaching its <code>vote</code>
|
||
and the <code>payload</code> that shows the purpose of the proposal.
|
||
Notably, <code>parent_hash</code> and <code>received_hash</code> are empty strings because there is no previous or received hash.
|
||
Then the initialization section ends when the user who creates the proposal sends it
|
||
to the random peer from the network or sends it to the proposal to the specific channel.</p>
|
||
<h2 id="2-exchanging-votes-across-the-peers"><a class="header" href="#2-exchanging-votes-across-the-peers">2. Exchanging votes across the peers</a></h2>
|
||
<p>Once the peer receives the proposal message <code>P_1</code> from a 1-1 or a gossipsub channel does the following checks:</p>
|
||
<ol>
|
||
<li>
|
||
<p>Check the signatures of the each votes in proposal, in particular for proposal <code>P_1</code>,
|
||
verify the signature of <code>V_1</code> where <code>V_1 = P_1.votes[0]</code> with <code>V_1.signature</code> and <code>V_1.vote_owner</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Do <code>parent_hash</code> check: If there are repeated votes from the same sender,
|
||
check that the hash of the former vote is equal to the <code>parent_hash</code> of the later vote.</p>
|
||
</li>
|
||
<li>
|
||
<p>Do <code>received_hash</code> check: If there are multiple votes in a proposal, check that the hash of a vote is equal to the <code>received_hash</code> of the next one.</p>
|
||
</li>
|
||
<li>
|
||
<p>After successful verification of the signature and hashes, the receiving peer proceeds to generate <code>P_2</code> containing a new vote <code>V_2</code> as following:</p>
|
||
<p>4.1. Add its public key as <code>P_2.vote_owner</code>.</p>
|
||
<p>4.2. Set <code>timestamp</code>.</p>
|
||
<p>4.3. Set boolean <code>vote</code>.</p>
|
||
<p>4.4. Define <code>V_2.parent_hash = 0</code> if there is no previous peer's vote, otherwise hash of previous owner's vote.</p>
|
||
<p>4.5. Set <code>V_2.received_hash = hash(P_1.votes[0])</code>.</p>
|
||
<p>4.6. Set <code>proposal_id</code> for the <code>vote</code>.</p>
|
||
<p>4.7. Calculate <code>vote_hash</code> by hash of all previously defined fields in Vote:
|
||
<code>V_2.vote_hash = hash(vote_id, owner, proposal_id, timestamp, vote, parent_hash, received_hash)</code></p>
|
||
<p>4.8. Sign <code>vote_hash</code> with its private key corresponding the public key as <code>vote_owner</code> component then adds <code>V_2.vote_hash</code>.</p>
|
||
</li>
|
||
<li>
|
||
<p>Create <code>P_2</code> with by adding <code>V_2</code> as follows:</p>
|
||
<p>5.1. Assign <code>P_2.name</code>, <code>P_2.proposal_id</code>, and <code>P_2.proposal_owner</code> to be identical to those in <code>P_1</code>.</p>
|
||
<p>5.2. Add the <code>V_2</code> to the <code>P_2.Votes</code> list.</p>
|
||
<p>5.3. Increase the round by one, namely <code>P_2.round = P_1.round + 1</code>.</p>
|
||
<p>5.4. Verify that the proposal has not expired by checking that: <code>P_2.timestamp - current_time < P_1.expiration_time</code>.
|
||
If this does not hold, other peers ignore the message.</p>
|
||
</li>
|
||
</ol>
|
||
<p>After the peer creates the proposal <code>P_2</code> with its vote <code>V_2</code>,
|
||
sends it to the random peer from the network or
|
||
sends it to the proposal to the specific channel.</p>
|
||
<h2 id="3-determining-the-result"><a class="header" href="#3-determining-the-result">3. Determining the result</a></h2>
|
||
<p>Because consensus depends on meeting a quorum threshold,
|
||
each peer MUST verify the accumulated votes to determine whether the necessary conditions have been satisfied.
|
||
The voting result is set YES if the majority of the <code>2n/3</code> from the distinct peers vote YES.</p>
|
||
<p>To verify, the <code>findDistinctVoter</code> method processes the proposal by traversing its <code>Votes</code> list to determine the number of unique voters.</p>
|
||
<p>If this method returns true, the peer proceeds with strong validation,
|
||
which ensures that if any honest peer reaches a decision,
|
||
no other honest peer can arrive at a conflicting result.</p>
|
||
<ol>
|
||
<li>
|
||
<p>Check each <code>signature</code> in the vote as shown in the <a href="#2-exchanging-votes-across-the-peers">Section 2</a>.</p>
|
||
</li>
|
||
<li>
|
||
<p>Check the <code>parent_hash</code> chain if there are multiple votes from the same owner namely <code>vote_i</code> and <code>vote_i+1</code> respectively,
|
||
the parent hash of <code>vote_i+1</code> should be the hash of <code>vote_i</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Check the <code>previous_hash</code> chain, each received hash of <code>vote_i+1</code> should be equal to the hash of <code>vote_i</code>.</p>
|
||
</li>
|
||
<li>
|
||
<p>Check the <code>timestamp</code> against the replay attack.
|
||
In particular, the <code>timestamp</code> cannot be the old in the determined threshold.</p>
|
||
</li>
|
||
<li>
|
||
<p>Check that the liveness criteria defined in the Liveness section are satisfied.</p>
|
||
</li>
|
||
</ol>
|
||
<p>If a proposal is verified by all the checks,
|
||
the <code>countVote</code> method counts each YES vote from the list of Votes.</p>
|
||
<h2 id="4-properties"><a class="header" href="#4-properties">4. Properties</a></h2>
|
||
<p>The consensus mechanism satisfies liveness and security properties as follows:</p>
|
||
<h3 id="liveness"><a class="header" href="#liveness">Liveness</a></h3>
|
||
<p>Liveness refers to the ability of the protocol to eventually reach a decision when sufficient honest participation is present.
|
||
In this protocol, if <code>n > 2</code> and more than <code>n/2</code> of the votes among at least <code>2n/3</code> distinct peers are YES,
|
||
then the consensus result is defined as YES; otherwise, when <code>n ≤ 2</code>, unanimous agreement (100% YES votes) is required.</p>
|
||
<p>The peer calculates the result locally as shown in the <a href="#3-determining-the-result">Section 3</a>.
|
||
From the <a href="https://hedera.com/learning/hedera-hashgraph/what-is-hashgraph-consensus">hashgraph property</a>,
|
||
if a node could calculate the result of a proposal,
|
||
it implies that no peer can calculate the opposite of the result.
|
||
Still, reliability issues can cause some situations where peers cannot receive enough messages,
|
||
so they cannot calculate the consensus result.</p>
|
||
<p>Rounds are incremented when a peer adds and sends the new proposal.
|
||
Calculating the required number of rounds, <code>2n/3</code> from the distinct peers' votes is achieved in two ways:</p>
|
||
<ol>
|
||
<li><code>2n/3</code> rounds in pure P2P networks</li>
|
||
<li><code>2</code> rounds in gossipsub</li>
|
||
</ol>
|
||
<p>Since the message complexity is <code>O(1)</code> in the gossipsub channel,
|
||
in case the network has reliability issues,
|
||
the second round is used for the peers cannot receive all the messages from the first round.</p>
|
||
<p>If an honest and online peer has received at least one vote but not enough to reach consensus,
|
||
it MAY continue to propagate its own vote — and any votes it has received — to support message dissemination.
|
||
This process can continue beyond the expected round count,
|
||
as long as it remains within the expiration time defined in the proposal.
|
||
The expiration time acts as a soft upper bound to ensure that consensus is either reached or aborted within a bounded timeframe.</p>
|
||
<h4 id="equality-of-votes"><a class="header" href="#equality-of-votes">Equality of votes</a></h4>
|
||
<p>An equality of votes occurs when verifying at least <code>2n/3</code> distinct voters and
|
||
applying <code>liveness_criteria_yes</code> the number of YES and NO votes is equal.</p>
|
||
<p>Handling ties is an application-level decision. The application MUST define a deterministic tie policy:</p>
|
||
<p>RETRY: re-run the vote with a new proposal_id, optionally adjusting parameters.</p>
|
||
<p>REJECT: abort the proposal and return voting result as NO.</p>
|
||
<p>The chosen policy SHOULD be consistent for all peers via proposal's <code>payload</code> to ensure convergence on the same outcome.</p>
|
||
<h3 id="silent-node-management"><a class="header" href="#silent-node-management">Silent Node Management</a></h3>
|
||
<p>Silent nodes are the nodes that not participate the voting as YES or NO.
|
||
There are two possible counting votes for the silent peers.</p>
|
||
<ol>
|
||
<li><strong>Silent peers means YES:</strong>
|
||
Silent peers counted as YES vote, if the application prefer the strong rejection for NO votes.</li>
|
||
<li><strong>Silent peers means NO:</strong>
|
||
Silent peers counted as NO vote, if the application prefer the strong acception for NO votes.</li>
|
||
</ol>
|
||
<p>The proposal is set to default true, which means silent peers' votes are counted as YES namely <code>liveness_criteria_yes</code> is set true by default.</p>
|
||
<h3 id="security"><a class="header" href="#security">Security</a></h3>
|
||
<p>This RFC uses cryptographic primitives to prevent the
|
||
malicious behaviours as follows:</p>
|
||
<ul>
|
||
<li>Vote forgery attempt: creating unsigned invalid votes</li>
|
||
<li>Inconsistent voting: a malicious peer submits conflicting votes (e.g., YES to some peers and NO to others)
|
||
in different stages of the protocol, violating vote consistency and attempting to undermine consensus.</li>
|
||
<li>Integrity breaking attempt: tampering history by changing previous votes.</li>
|
||
<li>Replay attack: storing the old votes to maliciously use in fresh voting.</li>
|
||
</ul>
|
||
<h2 id="5-copyright"><a class="header" href="#5-copyright">5. Copyright</a></h2>
|
||
<p>Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CC0</a></p>
|
||
<h2 id="6-references"><a class="header" href="#6-references">6. References</a></h2>
|
||
<ul>
|
||
<li><a href="https://hedera.com/learning/hedera-hashgraph/what-is-hashgraph-consensus">Hedera Hashgraph</a></li>
|
||
<li><a href="https://docs.hedera.com/hedera/core-concepts/hashgraph-consensus-algorithms/gossip-about-gossip">Gossip about gossip</a></li>
|
||
<li><a href="https://github.com/conanwu777/hashgraph">Simple implementation of hashgraph consensus</a></li>
|
||
</ul>
|
||
|
||
</main>
|
||
|
||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||
<!-- Mobile navigation buttons -->
|
||
<a rel="prev" href="../../vac/raw/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="../../vac/raw/decentralized-messaging-ethereum.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="../../vac/raw/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="../../vac/raw/decentralized-messaging-ethereum.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>
|