-
Notifications
You must be signed in to change notification settings - Fork 13
/
index.html
372 lines (332 loc) · 55.3 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js light">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>Overview - Catalyst Voting System - Core Technology</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="../.././book/assets/css/mdbook-admonish.css">
<link rel="stylesheet" href="../.././book/assets/css/open-in.css">
<link rel="stylesheet" href="../.././book/assets/theme/pagetoc.css">
<link rel="stylesheet" href="../.././book/assets/theme/css/chrome.css">
<link rel="stylesheet" href="../.././book/assets/theme/css/general.css">
<link rel="stylesheet" href="../.././book/assets/theme/css/variables.css">
</head>
<body>
<!-- Provide site root to javascript -->
<script>
var path_to_root = "../../";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
</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('no-js')
html.classList.remove('light')
html.classList.add(theme);
html.classList.add('js');
</script>
<!-- Hide / unhide sidebar before it is displayed -->
<script>
var html = document.querySelector('html');
var sidebar = 'hidden';
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
}
html.classList.remove('sidebar-visible');
html.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 affix "><a href="../../00_prologue.html">Prologue</a></li><li class="chapter-item "><a href="../../01_intro.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="../../02_core_ledger/index.html"><strong aria-hidden="true">2.</strong> Core Ledger</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/01_concepts/index.html"><strong aria-hidden="true">2.1.</strong> General Concepts</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/01_concepts/blockchain.html"><strong aria-hidden="true">2.1.1.</strong> Blockchain concepts</a></li><li class="chapter-item "><a href="../../02_core_ledger/01_concepts/network.html"><strong aria-hidden="true">2.1.2.</strong> Network overview</a></li><li class="chapter-item "><a href="../../02_core_ledger/01_concepts/node.html"><strong aria-hidden="true">2.1.3.</strong> Node organization</a></li><li class="chapter-item "><a href="../../02_core_ledger/01_concepts/stake.html"><strong aria-hidden="true">2.1.4.</strong> Stake</a></li></ol></li><li class="chapter-item "><a href="../../02_core_ledger/02_quickstart/index.html"><strong aria-hidden="true">2.2.</strong> Quickstart</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/02_quickstart/01_command_line.html"><strong aria-hidden="true">2.2.1.</strong> Command line tools</a></li><li class="chapter-item "><a href="../../02_core_ledger/02_quickstart/02_passive_node.html"><strong aria-hidden="true">2.2.2.</strong> Starting a passive node</a></li><li class="chapter-item "><a href="../../02_core_ledger/02_quickstart/03_rest_api.html"><strong aria-hidden="true">2.2.3.</strong> REST Api</a></li><li class="chapter-item "><a href="../../02_core_ledger/02_quickstart/04_explorer.html"><strong aria-hidden="true">2.2.4.</strong> Explorer mode</a></li><li class="chapter-item "><a href="../../02_core_ledger/02_quickstart/05_leader_candidate.html"><strong aria-hidden="true">2.2.5.</strong> How to start a node as a leader candidate</a></li></ol></li><li class="chapter-item "><a href="../../02_core_ledger/03_configuration/index.html"><strong aria-hidden="true">2.3.</strong> Configuration</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/03_configuration/leadership.html"><strong aria-hidden="true">2.3.1.</strong> Leadership</a></li><li class="chapter-item "><a href="../../02_core_ledger/03_configuration/logging.html"><strong aria-hidden="true">2.3.2.</strong> Logging</a></li><li class="chapter-item "><a href="../../02_core_ledger/03_configuration/mempool.html"><strong aria-hidden="true">2.3.3.</strong> Mempool</a></li><li class="chapter-item "><a href="../../02_core_ledger/03_configuration/network.html"><strong aria-hidden="true">2.3.4.</strong> Node network</a></li><li class="chapter-item "><a href="../../02_core_ledger/03_configuration/prometheus.html"><strong aria-hidden="true">2.3.5.</strong> Prometheus</a></li></ol></li><li class="chapter-item "><a href="../../02_core_ledger/04_jcli/index.html"><strong aria-hidden="true">2.4.</strong> jcli</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/04_jcli/address.html"><strong aria-hidden="true">2.4.1.</strong> Address</a></li><li class="chapter-item "><a href="../../02_core_ledger/04_jcli/certificate.html"><strong aria-hidden="true">2.4.2.</strong> Certificate</a></li><li class="chapter-item "><a href="../../02_core_ledger/04_jcli/genesis.html"><strong aria-hidden="true">2.4.3.</strong> Genesis</a></li><li class="chapter-item "><a href="../../02_core_ledger/04_jcli/key.html"><strong aria-hidden="true">2.4.4.</strong> cryptographic keys</a></li><li class="chapter-item "><a href="../../02_core_ledger/04_jcli/rest.html"><strong aria-hidden="true">2.4.5.</strong> REST</a></li><li class="chapter-item "><a href="../../02_core_ledger/04_jcli/transaction.html"><strong aria-hidden="true">2.4.6.</strong> Transaction</a></li><li class="chapter-item "><a href="../../02_core_ledger/04_jcli/vote.html"><strong aria-hidden="true">2.4.7.</strong> Voting</a></li></ol></li><li class="chapter-item "><a href="../../02_core_ledger/05_stake_pool/index.html"><strong aria-hidden="true">2.5.</strong> Staking with Jörmungandr</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/05_stake_pool/delegating_stake.html"><strong aria-hidden="true">2.5.1.</strong> Delegating your stake</a></li><li class="chapter-item "><a href="../../02_core_ledger/05_stake_pool/registering_stake_pool.html"><strong aria-hidden="true">2.5.2.</strong> Registering a stake pool</a></li><li class="chapter-item "><a href="../../02_core_ledger/05_stake_pool/retiring_stake_pool.html"><strong aria-hidden="true">2.5.3.</strong> Retiring a stake pool</a></li></ol></li><li class="chapter-item "><a href="../../02_core_ledger/06_advanced/index.html"><strong aria-hidden="true">2.6.</strong> Advanced</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/06_advanced/01_the_genesis_block.html"><strong aria-hidden="true">2.6.1.</strong> genesis file</a></li><li class="chapter-item "><a href="../../02_core_ledger/06_advanced/02_starting_bft_blockchain.html"><strong aria-hidden="true">2.6.2.</strong> starting a bft node</a></li><li class="chapter-item "><a href="../../02_core_ledger/06_advanced/03_starting_genesis_praos_blockchain.html"><strong aria-hidden="true">2.6.3.</strong> starting a genesis blockchain</a></li><li class="chapter-item "><a href="../../02_core_ledger/06_advanced/04_vote_fragments_voteplan_blockchain_relationships.html"><strong aria-hidden="true">2.6.4.</strong> How Vote plans, Vote Fragments and the blockchain transaction work and inter-relate</a></li></ol></li><li class="chapter-item "><a href="../../02_core_ledger/07_specs/index.html"><strong aria-hidden="true">2.7.</strong> Jormungandr Specifications</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/07_specs/migration.html"><strong aria-hidden="true">2.7.1.</strong> MIGRATION</a></li><li class="chapter-item "><a href="../../02_core_ledger/07_specs/network.html"><strong aria-hidden="true">2.7.2.</strong> Network</a></li></ol></li><li class="chapter-item "><a href="../../02_core_ledger/08_testing/index.html"><strong aria-hidden="true">2.8.</strong> testing</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/08_testing/automation.html"><strong aria-hidden="true">2.8.1.</strong> jormungandr-automation</a></li><li class="chapter-item "><a href="../../02_core_ledger/08_testing/hersir.html"><strong aria-hidden="true">2.8.2.</strong> Hersir</a></li><li class="chapter-item "><a href="../../02_core_ledger/08_testing/integration_tests.html"><strong aria-hidden="true">2.8.3.</strong> jormungandr-integration-tests</a></li><li class="chapter-item "><a href="../../02_core_ledger/08_testing/loki.html"><strong aria-hidden="true">2.8.4.</strong> Loki</a></li><li class="chapter-item "><a href="../../02_core_ledger/08_testing/mjolnir.html"><strong aria-hidden="true">2.8.5.</strong> Mjolnir</a></li><li class="chapter-item "><a href="../../02_core_ledger/08_testing/thor.html"><strong aria-hidden="true">2.8.6.</strong> Thor</a></li></ol></li><li class="chapter-item "><a href="../../02_core_ledger/09_internal_design/index.html"><strong aria-hidden="true">2.9.</strong> Internal Design</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../02_core_ledger/09_internal_design/01_auto-start.html"><strong aria-hidden="true">2.9.1.</strong> Automatic deployment of the voting blockchain</a></li><li class="chapter-item "><a href="../../02_core_ledger/09_internal_design/02_permissionless_auth.html"><strong aria-hidden="true">2.9.2.</strong> Permissionless Auth</a></li></ol></li></ol></li><li class="chapter-item "><a href="../../03_core_testing/index.html"><strong aria-hidden="true">3.</strong> Catalyst testing User Guide</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/iapyx/index.html"><strong aria-hidden="true">3.1.</strong> Iapyx</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/iapyx/iapyx.html"><strong aria-hidden="true">3.1.1.</strong> Iapyx</a></li><li class="chapter-item "><a href="../../03_core_testing/iapyx/load.html"><strong aria-hidden="true">3.1.2.</strong> Iapyx Load</a></li></ol></li><li class="chapter-item "><a href="../../03_core_testing/integration-tests/index.html"><strong aria-hidden="true">3.2.</strong> integration-tests</a></li><li class="chapter-item "><a href="../../03_core_testing/registration-service/index.html"><strong aria-hidden="true">3.3.</strong> Registration service</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/registration-service/cli.html"><strong aria-hidden="true">3.3.1.</strong> Registration CLI</a></li><li class="chapter-item "><a href="../../03_core_testing/registration-service/configuration.html"><strong aria-hidden="true">3.3.2.</strong> Configuration</a></li></ol></li><li class="chapter-item "><a href="../../03_core_testing/registration-verify-service/index.html"><strong aria-hidden="true">3.4.</strong> Registration service</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/registration-verify-service/cli.html"><strong aria-hidden="true">3.4.1.</strong> Registration Verify CLI</a></li><li class="chapter-item "><a href="../../03_core_testing/registration-verify-service/configuration.html"><strong aria-hidden="true">3.4.2.</strong> Configuration</a></li></ol></li><li class="chapter-item "><a href="../../03_core_testing/snapshot-service/index.html"><strong aria-hidden="true">3.5.</strong> Snapshot trigger service</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/snapshot-service/cli.html"><strong aria-hidden="true">3.5.1.</strong> Registration CLI</a></li><li class="chapter-item "><a href="../../03_core_testing/snapshot-service/configuration.html"><strong aria-hidden="true">3.5.2.</strong> Configuration</a></li></ol></li><li class="chapter-item "><a href="../../03_core_testing/snapshot-wormhole/index.html"><strong aria-hidden="true">3.6.</strong> snapshot wormhole</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/snapshot-wormhole/configuration.html"><strong aria-hidden="true">3.6.1.</strong> Configuration</a></li></ol></li><li class="chapter-item "><a href="../../03_core_testing/valgrind/index.html"><strong aria-hidden="true">3.7.</strong> valgrind</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/valgrind/configuration.html"><strong aria-hidden="true">3.7.1.</strong> Configuration</a></li></ol></li><li class="chapter-item "><a href="../../03_core_testing/vitup/index.html"><strong aria-hidden="true">3.8.</strong> vitup</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/vitup/configuration.html"><strong aria-hidden="true">3.8.1.</strong> Configuration</a></li><li class="chapter-item "><a href="../../03_core_testing/vitup/data_generation/index.html"><strong aria-hidden="true">3.8.2.</strong> Data Generation</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../03_core_testing/vitup/data_generation/reset.html"><strong aria-hidden="true">3.8.2.1.</strong> Configuration</a></li><li class="chapter-item "><a href="../../03_core_testing/vitup/data_generation/snapshot.html"><strong aria-hidden="true">3.8.2.2.</strong> Configuration</a></li></ol></li><li class="chapter-item "><a href="../../03_core_testing/vitup/data_generation.html"><strong aria-hidden="true">3.8.3.</strong> Data Generation</a></li><li class="chapter-item "><a href="../../03_core_testing/vitup/mock.html"><strong aria-hidden="true">3.8.4.</strong> Mock</a></li><li class="chapter-item "><a href="../../03_core_testing/vitup/mock_farm.html"><strong aria-hidden="true">3.8.5.</strong> Mock Farm</a></li><li class="chapter-item "><a href="../../03_core_testing/vitup/run_modes.html"><strong aria-hidden="true">3.8.6.</strong> Configuration modes</a></li></ol></li></ol></li><li class="chapter-item "><a href="../../04_core_vitss/index.html"><strong aria-hidden="true">4.</strong> Core VIT Servicing Station</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../04_core_vitss/testing.html"><strong aria-hidden="true">4.1.</strong> vit-servicing-station-tests</a></li></ol></li><li class="chapter-item expanded "><a href="../../05_unified_platform/index.html"><strong aria-hidden="true">5.</strong> Unified Platform</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/index.html" class="active"><strong aria-hidden="true">5.1.</strong> Overview</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/01_cardano_nodes.html"><strong aria-hidden="true">5.1.1.</strong> Cardano Nodes</a></li><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/02_bridge_pipeline/index.html"><strong aria-hidden="true">5.1.2.</strong> Bridge Pipeline</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/02_bridge_pipeline/01_block_reader.html"><strong aria-hidden="true">5.1.2.1.</strong> Block Reader</a></li></ol></li><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/03_rest_http_service.html"><strong aria-hidden="true">5.1.3.</strong> REST HTTP Service</a></li><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/04_event_stream.html"><strong aria-hidden="true">5.1.4.</strong> Event Stream</a></li><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/05_database/index.html"><strong aria-hidden="true">5.1.5.</strong> Database</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/05_database/01_registration_db.html"><strong aria-hidden="true">5.1.5.1.</strong> Registrations Database</a></li><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/05_database/02_staked_ada_db.html"><strong aria-hidden="true">5.1.5.2.</strong> Staked ADA Database</a></li><li class="chapter-item "><a href="../../05_unified_platform/01_catalyst-cardano-bridge/05_database/03_transaction_state.html"><strong aria-hidden="true">5.1.5.3.</strong> Transaction State Database</a></li></ol></li></ol></li></ol></li><li class="chapter-item "><a href="../../06_rust_api/index.html"><strong aria-hidden="true">6.</strong> Rust API</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../06_rust_api/rust_api.html"><strong aria-hidden="true">6.1.</strong> Rust API Documentation and Packages</a></li><li class="chapter-item "><a href="../../06_rust_api/rust_style_guide.html"><strong aria-hidden="true">6.2.</strong> 🦀 Rust Style Guide</a></li></ol></li><li class="chapter-item "><a href="../../07_web_api/index.html"><strong aria-hidden="true">7.</strong> Web API</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../07_web_api/dbsync-explorer.html"><strong aria-hidden="true">7.1.</strong> dbSync Explorer HTTP/REST API V1</a></li><li class="chapter-item "><a href="../../07_web_api/vit-servicing-station-v0.html"><strong aria-hidden="true">7.2.</strong> VIT Servicing Station HTTP/REST API V0</a></li><li class="chapter-item "><a href="../../07_web_api/vit-testing-mock-farm-v0.html"><strong aria-hidden="true">7.3.</strong> VIT Testing Mock Farm HTTP/REST API V0</a></li><li class="chapter-item "><a href="../../07_web_api/vit-testing-mock-v0.html"><strong aria-hidden="true">7.4.</strong> VIT Testing Mock HTTP/REST API V0</a></li><li class="chapter-item "><a href="../../07_web_api/vote-ledger-v0.html"><strong aria-hidden="true">7.5.</strong> Vote Ledger HTTP/REST API V0</a></li><li class="chapter-item "><a href="../../07_web_api/vote-ledger-v1.html"><strong aria-hidden="true">7.6.</strong> Vote Ledger HTTP/REST API V1</a></li></ol></li><li class="chapter-item "><a href="../../97_CONTRIBUTING.html"><strong aria-hidden="true">8.</strong> Contributing to Catalyst Core</a></li><li class="chapter-item "><a href="../../98_CODE_OF_CONDUCT.html"><strong aria-hidden="true">9.</strong> Contributor Covenant Code of Conduct</a></li><li class="chapter-item "><a href="../../99_example_enhanced_markup.html"><strong aria-hidden="true">10.</strong> Example Enhanced Markup</a></li><li class="chapter-item affix "><a href="../../ZZ_suffix.html">Suffix</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
</nav>
<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 bordered">
<div class="left-buttons">
<button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</button>
<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">Catalyst Voting System - Core Technology</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/input-output-hk/catalyst-core" 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>
<!-- Page table of contents -->
<div class="sidetoc"><nav class="pagetoc"></nav></div>
<h1 id="overview"><a class="header" href="#overview">Overview</a></h1>
<p>The Catalyst-Cardano bridge is a custom bridge interface between Catalyst and a Cardano Node.
It tracks data relevant to the unified Catalyst system, as it appears on the Cardano network, in real-time.</p>
<p>The bridge is not just a data logger, it also:</p>
<ul>
<li>Acts as an event trigger for other Catalyst systems.</li>
<li>Acts as an information server to data pertinent to Catalyst operations.</li>
</ul>
<h2 id="issues-with-the-previous-systems"><a class="header" href="#issues-with-the-previous-systems">Issues with the previous systems</a></h2>
<p>Catalyst has used a tool called <code>dbsync</code> to aquire “snapshot” data.
A “snapshot” is a record at a moment in time of all staked ADA in the network.</p>
<p><code>dbsync</code> is a tool which captures a relational interpretation of the Cardano blockchain to an SQL database.
This is useful for general-purpose queries of information contained on Cardano, but to query bulk data it is slow, and complex.
The relational structure means that individual transactions need to be pieced together from multiple tables.
Even with indexes this exerts a heavy efficiency toll when a single transactions state is queried.
When bulk data is queried, it results in a large and complex query which takes a very long time to run (on the order of hours).</p>
<p><code>dbsync</code> itself takes a very very long time to sync to the blockchain, and get progressively slower.
As at mid january 2023, one dbsync instance in a production environment took more than 5 days to sync with a local node.</p>
<p>It is supposed to be possible to recover <code>dbsync</code> database from a backup, however experience shows this is a time consuming process itself.
It took more than 12 hours just to load the backup image into the database, but then the node would not sync with main net.
These issues cause excessive complexity, slow operation and fragile environments.</p>
<p>Project Catalyst is also not in control of the <code>dbsync</code> database schema, and the schema can change between revisions.
This could mean the entire database needs to be re-synched (taking days), or the schema changes and breaks tools which rely on the schema.</p>
<h2 id="the-solution"><a class="header" href="#the-solution">The solution</a></h2>
<p>The solution detailed here is a new bridge service, that has the following features:</p>
<ul>
<li>Can sync from multiple redundant nodes.</li>
<li>Does not need to trust any single node (so it can sync from public nodes).</li>
<li>Focused on data and events required by Project Catalyst:
<ul>
<li>Registration Records at all points in the past.</li>
<li>Staked ADA at all points in the past.</li>
<li>Minimum necessary state to track staked ADA.</li>
</ul>
</li>
<li>More efficient database schema.</li>
<li>Schema is not accessed directly but via a simple API Service.
<ul>
<li>Prevents downstream consumers from breaking if the DB Schema needs to change.</li>
</ul>
</li>
<li>Does not need to snapshot:
<ul>
<li>Data is accumulated progressively, not at instants in time.</li>
<li>Data storage allows the state at any past time to be calculated simply and efficiently.</li>
</ul>
</li>
<li>Is easy to independently deploy by the Catalyst Community, so they can independently validate data reported by Project Catalyst.
<ul>
<li>Distributed use does not rely on any Catalyst-supplied data, which improves audibility and trust.</li>
</ul>
</li>
</ul>
<h3 id="architecture-overview"><a class="header" href="#architecture-overview">Architecture Overview</a></h3>
<p>The System has these components:</p>
<ul>
<li>1 or more Cardano Nodes (Preferably 2 or more)</li>
<li>A Pipeline which processes the data from the nodes:
<ul>
<li>Read blocks from multiple nodes</li>
<li>Validate blocks by independent reference (A valid block has <code>n</code> independent copies)</li>
<li>Queue valid blocks for processing.</li>
<li>Read valid blocks from the queue and process every transaction in the block.
<ul>
<li>Calculate the change in staked ADA caused by all transactions in the block.</li>
<li>Validate all Registration Records in the block:
<ul>
<li>Record all validated registrations.</li>
<li>Record all in-valid registrations (including the reason the registration is invalid).</li>
</ul>
</li>
</ul>
</li>
<li>Queue the complete block of transactions, ledger state and registration updates for storing and alerting.</li>
<li>Lock the Databases for writing (Transactional)</li>
<li>Check if the block being recorded is new:
<ul>
<li>New:
<ul>
<li>Record the updated current ledger state.</li>
<li>Record the staked ADA for every stake address which changed in this block (time series record)</li>
<li>Record the registrations (time series record)</li>
<li>Send alerts to all upstream subscribers that subscribed events have changed.</li>
<li>Commit the transaction (unlocks the DB)</li>
</ul>
</li>
<li>Already Recorded:
<ul>
<li>Abort the write transaction (release the DB)</li>
<li>Read the recorded data from the DB</li>
<li>Validate the DB data with the data calculated from the block.</li>
<li>If there is any discrepancy, LOG errors and send configured alerts.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>A REST/HTTP service to report catalyst bridge data
<ul>
<li>Report current staked/unpaid rewards in ADA for any stake address.</li>
<li>Report staked/unpaid rewards in ADA for any stake address, at any past time.</li>
<li>Report staked/unpaid rewards over a period of previous time, with various processing:
<ul>
<li>Daily Averages</li>
<li>All records</li>
<li>other</li>
</ul>
</li>
<li>Calculate voting power given a set of voting power options for a single address, or all registrations of a particular type.
<ul>
<li>Snapshot (instantaneous) voting power</li>
<li>Time window based voting power calculation</li>
<li>Linear vs functional voting power function of raw ADA.</li>
<li>Capped at a particular %</li>
<li>other parameters which can affect the voting power calculation.</li>
</ul>
</li>
</ul>
</li>
<li>Catalyst Event stream published via:
<ul>
<li>Kafka</li>
<li>other</li>
</ul>
</li>
</ul>
<h3 id="architectural-diagram"><a class="header" href="#architectural-diagram">Architectural Diagram</a></h3>
<div style="background-color:blue">
<pre><svg aria-roledescription="classDiagram" viewBox="0 0 474.578125 428" height="428" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="474.578125" id="mermaid-1679475798188"><style>#mermaid-1679475798188{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1679475798188 .error-icon{fill:#552222;}#mermaid-1679475798188 .error-text{fill:#552222;stroke:#552222;}#mermaid-1679475798188 .edge-thickness-normal{stroke-width:2px;}#mermaid-1679475798188 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1679475798188 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1679475798188 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1679475798188 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1679475798188 .marker{fill:#333333;stroke:#333333;}#mermaid-1679475798188 .marker.cross{stroke:#333333;}#mermaid-1679475798188 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-1679475798188 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-1679475798188 g.classGroup text .title{font-weight:bolder;}#mermaid-1679475798188 .nodeLabel,#mermaid-1679475798188 .edgeLabel{color:#131300;}#mermaid-1679475798188 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-1679475798188 .label text{fill:#131300;}#mermaid-1679475798188 .edgeLabel .label span{background:#ECECFF;}#mermaid-1679475798188 .classTitle{font-weight:bolder;}#mermaid-1679475798188 .node rect,#mermaid-1679475798188 .node circle,#mermaid-1679475798188 .node ellipse,#mermaid-1679475798188 .node polygon,#mermaid-1679475798188 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-1679475798188 .divider{stroke:#9370DB;stroke:1;}#mermaid-1679475798188 g.clickable{cursor:pointer;}#mermaid-1679475798188 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-1679475798188 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-1679475798188 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-1679475798188 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-1679475798188 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-1679475798188 .dashed-line{stroke-dasharray:3;}#mermaid-1679475798188 .dotted-line{stroke-dasharray:1 2;}#mermaid-1679475798188 #compositionStart,#mermaid-1679475798188 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #compositionEnd,#mermaid-1679475798188 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #dependencyStart,#mermaid-1679475798188 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #dependencyStart,#mermaid-1679475798188 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #extensionStart,#mermaid-1679475798188 .extension{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #extensionEnd,#mermaid-1679475798188 .extension{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #aggregationStart,#mermaid-1679475798188 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #aggregationEnd,#mermaid-1679475798188 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #lollipopStart,#mermaid-1679475798188 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 #lollipopEnd,#mermaid-1679475798188 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-1679475798188 .edgeTerminals{font-size:11px;}#mermaid-1679475798188 .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-1679475798188 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><defs><marker orient="auto" markerHeight="240" markerWidth="190" refY="7" refX="0" class="marker aggregation classDiagram" id="classDiagram-aggregationStart"><path d="M 18,7 L9,13 L1,7 L9,1 Z"/></marker></defs><defs><marker orient="auto" markerHeight="28" markerWidth="20" refY="7" refX="19" class="marker aggregation classDiagram" id="classDiagram-aggregationEnd"><path d="M 18,7 L9,13 L1,7 L9,1 Z"/></marker></defs><defs><marker orient="auto" markerHeight="240" markerWidth="190" refY="7" refX="0" class="marker extension classDiagram" id="classDiagram-extensionStart"><path d="M 1,7 L18,13 V 1 Z"/></marker></defs><defs><marker orient="auto" markerHeight="28" markerWidth="20" refY="7" refX="19" class="marker extension classDiagram" id="classDiagram-extensionEnd"><path d="M 1,1 V 13 L18,7 Z"/></marker></defs><defs><marker orient="auto" markerHeight="240" markerWidth="190" refY="7" refX="0" class="marker composition classDiagram" id="classDiagram-compositionStart"><path d="M 18,7 L9,13 L1,7 L9,1 Z"/></marker></defs><defs><marker orient="auto" markerHeight="28" markerWidth="20" refY="7" refX="19" class="marker composition classDiagram" id="classDiagram-compositionEnd"><path d="M 18,7 L9,13 L1,7 L9,1 Z"/></marker></defs><defs><marker orient="auto" markerHeight="240" markerWidth="190" refY="7" refX="0" class="marker dependency classDiagram" id="classDiagram-dependencyStart"><path d="M 5,7 L9,13 L1,7 L9,1 Z"/></marker></defs><defs><marker orient="auto" markerHeight="28" markerWidth="20" refY="7" refX="19" class="marker dependency classDiagram" id="classDiagram-dependencyEnd"><path d="M 18,7 L9,13 L14,7 L9,1 Z"/></marker></defs><defs><marker orient="auto" markerHeight="240" markerWidth="190" refY="7" refX="0" class="marker lollipop classDiagram" id="classDiagram-lollipopStart"><circle r="6" cy="7" cx="6" fill="white" stroke="black"/></marker></defs><g class="root"><g class="clusters"/><g class="edgePaths"><path marker-start="url(#classDiagram-extensionStart)" style="fill:none" class="edge-pattern-solid relation" id="id1" d="M148.46037946428572,112L141.5802641369048,116.16666666666667C134.70014880952382,120.33333333333333,120.93991815476191,128.66666666666666,114.05980282738096,137C107.1796875,145.33333333333334,107.1796875,153.66666666666666,107.1796875,157.83333333333334L107.1796875,162"/><path marker-start="url(#classDiagram-extensionStart)" style="fill:none" class="edge-pattern-solid relation" id="id2" d="M320.1880580357143,112L327.06817336309524,116.16666666666667C333.9482886904762,120.33333333333333,347.7085193452381,128.66666666666666,354.58863467261904,137C361.46875,145.33333333333334,361.46875,153.66666666666666,361.46875,157.83333333333334L361.46875,162"/><path marker-start="url(#classDiagram-extensionStart)" style="fill:none" class="edge-pattern-solid relation" id="id3" d="M107.1796875,266L107.1796875,270.1666666666667C107.1796875,274.3333333333333,107.1796875,282.6666666666667,107.1796875,291C107.1796875,299.3333333333333,107.1796875,307.6666666666667,107.1796875,311.8333333333333L107.1796875,316"/><path marker-start="url(#classDiagram-extensionStart)" style="fill:none" class="edge-pattern-solid relation" id="id4" d="M361.46875,266L361.46875,270.1666666666667C361.46875,274.3333333333333,361.46875,282.6666666666667,361.46875,291C361.46875,299.3333333333333,361.46875,307.6666666666667,361.46875,311.8333333333333L361.46875,316"/></g><g class="edgeLabels"><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g></g><g class="nodes"><g transform="translate(234.32421875, 60)" id="classid-ContractKey-0" class="node default"><rect height="104" width="346.296875" y="-52" x="-173.1484375" class="outer title-state"/><line y2="-21" y1="-21" x2="173.1484375" x1="-173.1484375" class="divider"/><line y2="18" y1="18" x2="173.1484375" x1="-173.1484375" class="divider"/><g class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"></span></div></foreignObject><foreignObject transform="translate( -44.46875, -44.5)" height="19" width="88.9375" class="classTitle"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">ContractKey</span></div></foreignObject><foreignObject transform="translate( -165.6484375, -9.5)" height="19" width="139.65625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">contract_key: bytes</span></div></foreignObject><foreignObject transform="translate( -165.6484375, 25.5)" height="19" width="331.296875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">hash(concat(contract_hash, parameter_hash))</span></div></foreignObject></g></g><g transform="translate(107.1796875, 214)" id="classid-ContractHash-1" class="node default"><rect height="104" width="198.359375" y="-52" x="-99.1796875" class="outer title-state"/><line y2="-21" y1="-21" x2="99.1796875" x1="-99.1796875" class="divider"/><line y2="18" y1="18" x2="99.1796875" x1="-99.1796875" class="divider"/><g class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"></span></div></foreignObject><foreignObject transform="translate( -49.1640625, -44.5)" height="19" width="98.328125" class="classTitle"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">ContractHash</span></div></foreignObject><foreignObject transform="translate( -91.6796875, -9.5)" height="19" width="154.03125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">contract_hash : bytes</span></div></foreignObject><foreignObject transform="translate( -91.6796875, 25.5)" height="19" width="183.359375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">hash(Contract.as_bytes())</span></div></foreignObject></g></g><g transform="translate(361.46875, 214)" id="classid-ParameterHash-2" class="node default"><rect height="104" width="210.21875" y="-52" x="-105.109375" class="outer title-state"/><line y2="-21" y1="-21" x2="105.109375" x1="-105.109375" class="divider"/><line y2="18" y1="18" x2="105.109375" x1="-105.109375" class="divider"/><g class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"></span></div></foreignObject><foreignObject transform="translate( -55.9375, -44.5)" height="19" width="111.875" class="classTitle"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">ParameterHash</span></div></foreignObject><foreignObject transform="translate( -97.609375, -9.5)" height="19" width="117.046875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">parameter_hash</span></div></foreignObject><foreignObject transform="translate( -97.609375, 25.5)" height="19" width="195.21875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">hash(Paramters.as_bytes())</span></div></foreignObject></g></g><g transform="translate(107.1796875, 368)" id="classid-Contract-3" class="node default"><rect height="104" width="130.3125" y="-52" x="-65.15625" class="outer title-state"/><line y2="-21" y1="-21" x2="65.15625" x1="-65.15625" class="divider"/><line y2="18" y1="18" x2="65.15625" x1="-65.15625" class="divider"/><g class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"></span></div></foreignObject><foreignObject transform="translate( -31.0546875, -44.5)" height="19" width="62.109375" class="classTitle"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Contract</span></div></foreignObject><foreignObject transform="translate( -57.65625, -9.5)" height="19" width="115.3125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Compiled Wasm</span></div></foreignObject><foreignObject transform="translate( -57.65625, 25.5)" height="19" width="73.4375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">as_bytes()</span></div></foreignObject></g></g><g transform="translate(361.46875, 368)" id="classid-Parameters-4" class="node default"><rect height="104" width="207.71875" y="-52" x="-103.859375" class="outer title-state"/><line y2="-21" y1="-21" x2="103.859375" x1="-103.859375" class="divider"/><line y2="18" y1="18" x2="103.859375" x1="-103.859375" class="divider"/><g class="label"><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"></span></div></foreignObject><foreignObject transform="translate( -41.59375, -44.5)" height="19" width="83.1875" class="classTitle"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Parameters</span></div></foreignObject><foreignObject transform="translate( -96.359375, -9.5)" height="19" width="192.71875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Structured Parameter Data</span></div></foreignObject><foreignObject transform="translate( -96.359375, 25.5)" height="19" width="73.4375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">as_bytes()</span></div></foreignObject></g></g></g></g></g></svg></pre>
</div>
<div style="background-color:white">
<pre><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="335" height="98" viewBox="126 74 335 98" version="1.1"><defs><marker id="sequenceflow-end-white-hsl_225_10_15_-b98jr7xcyik8nr0v0i87oaf2x" viewBox="0 0 20 20" refX="11" refY="10" markerWidth="10" markerHeight="10" orient="auto"><path d="M 1 5 L 11 10 L 1 15 Z" style="fill: rgb(34, 36, 42); stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; stroke: rgb(34, 36, 42);"/></marker></defs><g class="djs-group"><g class="djs-element djs-shape" data-element-id="StartEvent_1y45yut" style="display: block;" transform="matrix(1 0 0 1 152 102)"><g class="djs-visual"><circle cx="18" cy="18" r="18" style="stroke: rgb(34, 36, 42); stroke-width: 2px; fill: white; fill-opacity: 0.95;"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="36" height="36" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" rx="3" width="48" height="48" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="StartEvent_1y45yut_label" style="display: block;" transform="matrix(1 0 0 1 132 145)"><g class="djs-visual"><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: rgb(34, 36, 42);"><tspan x="0" y="9.899999999999999">hunger noticed</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="78" height="14" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" rx="3" width="90" height="26" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="Task_1hcentk" style="display: block;" transform="matrix(1 0 0 1 240 80)"><g class="djs-visual"><rect x="0" y="0" width="100" height="80" rx="10" ry="10" style="stroke: rgb(34, 36, 42); stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 12px; font-weight: normal; fill: rgb(34, 36, 42);"><tspan x="11.0595703125" y="43.599999999999994">choose recipe</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="100" height="80" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" rx="3" width="112" height="92" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="ExclusiveGateway_15hu1pt" style="display: block;" transform="matrix(1 0 0 1 395 95)"><g class="djs-visual"><polygon points="25,0 50,25 25,50 0,25" style="stroke: rgb(34, 36, 42); stroke-width: 2px; fill: white; fill-opacity: 0.95;"/><path d="m 16,15 7.42857142857143,9.714285714285715 -7.42857142857143,9.714285714285715 3.428571428571429,0 5.714285714285715,-7.464228571428572 5.714285714285715,7.464228571428572 3.428571428571429,0 -7.42857142857143,-9.714285714285715 7.42857142857143,-9.714285714285715 -3.428571428571429,0 -5.714285714285715,7.464228571428572 -5.714285714285715,-7.464228571428572 -3.428571428571429,0 z" style="fill: rgb(34, 36, 42); stroke-width: 1px; stroke: rgb(34, 36, 42);"/></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="50" height="50" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" rx="3" width="62" height="62" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-shape" data-element-id="ExclusiveGateway_15hu1pt_label" style="display: block;" transform="matrix(1 0 0 1 387 152)"><g class="djs-visual"><text lineHeight="1.2" class="djs-label" style="font-family: Arial, sans-serif; font-size: 11px; font-weight: normal; fill: rgb(34, 36, 42);"><tspan x="0" y="9.899999999999999">desired dish?</tspan></text></g><rect class="djs-hit djs-hit-all" x="0" y="0" width="68" height="14" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="-6" y="-6" rx="3" width="80" height="26" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="SequenceFlow_0h21x7r" style="display: block;"><g class="djs-visual"><path d="m 188,120L240,120 " style="fill: none; stroke-width: 2px; stroke: rgb(34, 36, 42); stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-hsl_225_10_15_-b98jr7xcyik8nr0v0i87oaf2x');"/></g><polyline points="188,120 240,120 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="182" y="114" rx="3" width="64" height="12" class="djs-outline" style="fill: none;"/></g></g><g class="djs-group"><g class="djs-element djs-connection" data-element-id="SequenceFlow_0wnb4ke" style="display: block;"><g class="djs-visual"><path d="m 340,120L395,120 " style="fill: none; stroke-width: 2px; stroke: rgb(34, 36, 42); stroke-linejoin: round; marker-end: url('#sequenceflow-end-white-hsl_225_10_15_-b98jr7xcyik8nr0v0i87oaf2x');"/></g><polyline points="340,120 395,120 " class="djs-hit djs-hit-stroke" style="fill: none; stroke-opacity: 0; stroke: white; stroke-width: 15px;"/><rect x="334" y="114" rx="3" width="67" height="12" class="djs-outline" style="fill: none;"/></g></g></svg></pre>
</div>
<h3 id="integration-to-the-catalyst-unified-backend"><a class="header" href="#integration-to-the-catalyst-unified-backend">Integration to the Catalyst Unified Backend</a></h3>
<p>The Cardano-Catalyst bridge is an essential and integral part of the Catalyst Unified backend.
However, it is also a useful and capable tool in its own right.</p>
<p>It has a secondary use case of allowing the community to INDEPENDENTLY validate their registrations and voting power.</p>
<p>Accordingly, it is developed as a stand-alone service.
This means it can be easily distributed and deployed INDEPENDENTLY of the rest of the catalyst unified backend services.</p>
<p>It has two internal long running tasks.
Read, validate and record latest registrations/delegations from the linked block chain.
Read and record running total balance and unclaimed rewards for every stake address.
It also exposes a Voting Power API.
Get voting power for Stake Address or Voting Key as at (timestamp). Would respect the registrations valid at that time.
So if you asked for your voting power but you were delegated,
the API would return you have X personal voting power,
and Y..Z Voting power of yours has been delegated to Keys A-B.
Options:
Max Registration Age (So regitrations before this date/time are not considered).
Must have valid payment address.
(So we can later make a valid payment address a necessity if required, and this would also exclude just using stake address.)
Voting power calculation type
Absolute on the time of snapshot
Average Maximum daily value
Parameter: Length of time to average over (in days).
Voting power linearity
Linear (1 ADA = X voting power). Where X is a parameter.
Logarithmic (Voting power is attenuated by a logarithmic function). Would need parameters to define the curve.
Other??
Get Registration/Delegation information for a Stake Address/Voting Key as at a time. Similar to above but does NOT do any
Get all active registrations as at a time.
Time and max age of registrations are parameters.
If stake addresses without registration are included in the output.
What do you think? (edited)</p>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="../../05_unified_platform/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" href="../../05_unified_platform/01_catalyst-cardano-bridge/01_cardano_nodes.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="../../05_unified_platform/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" href="../../05_unified_platform/01_catalyst-cardano-bridge/01_cardano_nodes.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="../.././book/assets/theme/pagetoc.js"></script>
</body>
</html>