viz-js-lib 0.12.5 → 0.12.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,501 @@
1
+ # VIZ Blockchain — Witness → Validator Migration Reference
2
+
3
+ ## Quick Summary
4
+
5
+ The VIZ blockchain is renaming "witness" terminology to "validator" across the entire stack. This document is a reference for JS/PHP library developers to support both old and new names during migration.
6
+
7
+ **Key principle: binary wire format uses integer type IDs, not string names. Submitting transactions by integer ID never breaks. Only JSON string names change.**
8
+
9
+ ---
10
+
11
+ ## 0. What Libraries Must Change Themselves vs What They Just Relay
12
+
13
+ This distinction is the most important rule for library developers.
14
+
15
+ ### Must change (library constructs these from scratch):
16
+
17
+ | What | Where in library code |
18
+ |------|----------------------|
19
+ | Operation name→ID mapping table | Serialization/deserialization layer |
20
+ | Field names inside type 7 and type 42 operations | Operation builders, schema definitions |
21
+ | Chain properties field names (`inflation_witness_percent`, etc.) | `chain_properties_update` builder |
22
+ | TypeScript interfaces / PHP classes for operation structs | Type definitions |
23
+ | TypeScript interfaces / PHP classes for `validator_schedule_object` | Type definitions |
24
+
25
+ ### Do NOT need to change (library receives from node and relays):
26
+
27
+ | What | Reason |
28
+ |------|--------|
29
+ | Block header fields | **Done.** Node now returns `validator` / `validator_signature`. Libraries that relay raw block objects with no field-specific code need no changes. Code explicitly accessing `.witness` / `.witness_signature` on a block header must be updated to `.validator` / `.validator_signature`. |
30
+ | Raw API response objects (beyond type definitions) | JSON deserialization is dynamic — field access works regardless of name if library doesn't validate field names |
31
+ | Historical transaction data from node | Same — the node returns it, library relays it |
32
+
33
+ **Practical rule:** if your library has a hardcoded string `"witness"` as a field name when *building* a JSON object to *send* to a node — that string must be updated. If the string `"witness"` only appears in a *comment*, a *display label*, or a *type definition that only affects IDE autocomplete* — it can wait.
34
+
35
+ ---
36
+
37
+ ## Current Status (What Has Been Done vs What Is Planned)
38
+
39
+ | Layer | Status | Visible to JS/PHP? |
40
+ |-------|--------|---------------------|
41
+ | Internal C++ methods (e.g., `is_validator_scheduled_soon`) | **Done** | No |
42
+ | Internal enums (`block_validation_condition`) | **Done** | No |
43
+ | Internal skip flags (`skip_validator_signature`) | **Done** | No |
44
+ | Block header fields (`validator`, `validator_signature`) | **Done** | Yes — block responses |
45
+ | Dynamic global property (`current_validator`) | **Done** | Yes — `get_dynamic_global_properties` |
46
+ | Protocol operation struct names and JSON names | **Done** | Yes — JSON name in transactions |
47
+ | Operation field names inside types 7 and 42 | **Done** | Yes — field names in operation body |
48
+ | Chain properties field names | **Done** | Yes — JSON field names in governance ops |
49
+ | API method names (`get_active_validators`, etc.) | **Done** | Yes — JSON-RPC calls |
50
+ | Chain object types (`validator_object`, etc.) | **Done** | Yes — API response type names |
51
+ | CLI wallet commands (`get_active_validators`, etc.) | **Done** | Yes — if using CLI wallet |
52
+ | Physical file renames (`.hpp`/`.cpp`, directories) | **Done** | No — internal build only |
53
+ | Plugin directory and CMake target renames | **Done** | No — internal build |
54
+ | Config key renames (`plugin = validator`, etc.) | **Done** | Yes — node operators must update `config.ini` |
55
+ | API namespace (`validator_api`) | **Done** | Yes — JSON-RPC `"api"` field (see Section 2) |
56
+ | `account_api_object` fields (`validators_voted_for`, `validators_vote_weight`, `validator_votes`) | **Done** | Yes — `get_accounts` response |
57
+ | `get_config` keys (`CHAIN_MAX_VALIDATORS`, `CHAIN_HARDFORK_REQUIRED_VALIDATORS`, etc.) | **Done** | Yes — `get_config` response |
58
+ | Config constants (`CHAIN_MAX_VALIDATORS`, `CHAIN_BLOCK_VALIDATOR_REPEAT`, `CHAIN_EMERGENCY_VALIDATOR_ACCOUNT`, etc.) | **Done** | No — internal C++ only |
59
+
60
+ ---
61
+
62
+ ## 1. Protocol Operations (JSON-RPC Transaction Submission)
63
+
64
+ These are the operations users submit in transactions. The **integer type ID never changes** — only the JSON string name changes.
65
+
66
+ ### Operations to Rename
67
+
68
+ | Type ID | Current JSON Name (old) | New JSON Name | Virtual? | Fields (unchanged) |
69
+ |---------|------------------------|---------------|----------|---------------------|
70
+ | `6` | `witness_update` | `validator_update` | no | `owner`, `url`, `block_signing_key` |
71
+ | `7` | `account_witness_vote` | `account_validator_vote` | no | `account`, **`witness` → `validator`**, `approve` |
72
+ | `8` | `account_witness_proxy` | `account_validator_proxy` | no | `account`, `proxy` |
73
+ | `30` | `shutdown_witness` | `shutdown_validator` | **yes** | `owner` |
74
+ | `42` | `witness_reward` | `validator_reward` | **yes** | **`witness` → `validator`**, `shares` |
75
+
76
+ > **Field renames inside operations:** In type 7 (`account_validator_vote`) the field `witness` (the target account name) is renamed to `validator`. In type 42 (`validator_reward`) the field `witness` is renamed to `validator`. The node accepts both old and new field names in incoming JSON, but responses use new names only.
77
+
78
+ ### What JS/PHP Developers Must Handle
79
+
80
+ **Sending transactions (2 safe approaches):**
81
+
82
+ ```js
83
+ // Approach A: Use integer type ID (always safe, never breaks)
84
+ const op = [6, {
85
+ owner: 'alice',
86
+ url: 'https://alice.example.com',
87
+ block_signing_key: 'VIZ5hq...',
88
+ }];
89
+
90
+ // Approach B: Use string name (need to support both old and new)
91
+ const op = ['validator_update', { // new name
92
+ owner: 'alice',
93
+ url: 'https://alice.example.com',
94
+ block_signing_key: 'VIZ5hq...',
95
+ }];
96
+ ```
97
+
98
+ **Sending type 7 (vote) with updated field name:**
99
+
100
+ ```js
101
+ // Old (still accepted by node, but deprecated):
102
+ const op = [7, { account: 'alice', witness: 'bob', approve: true }];
103
+
104
+ // New (correct):
105
+ const op = [7, { account: 'alice', validator: 'bob', approve: true }];
106
+ ```
107
+
108
+ **Receiving transactions (operation history, block parsing):**
109
+
110
+ ```js
111
+ // Old server response:
112
+ ["witness_update", { "owner": "alice", ... }]
113
+
114
+ // New server response:
115
+ ["validator_update", { "owner": "alice", ... }]
116
+
117
+ // Your code must accept BOTH names for the same operation
118
+ ```
119
+
120
+ **Server-side fallback:** The C++ node will accept both old and new JSON names in incoming transactions. But responses will use **new names only**.
121
+
122
+ ### Implementation Pattern for JS/PHP
123
+
124
+ ```js
125
+ // Operation name mapping (accept both, send new)
126
+ const OP_NAME_MAP = {
127
+ 'witness_update': 'validator_update',
128
+ 'account_witness_vote': 'account_validator_vote',
129
+ 'account_witness_proxy': 'account_validator_proxy',
130
+ 'shutdown_witness': 'shutdown_validator',
131
+ 'witness_reward': 'validator_reward',
132
+ };
133
+
134
+ // Reverse map (for receiving — normalize old names to new)
135
+ const OP_ALIAS_MAP = {
136
+ 'witness_update': 'validator_update',
137
+ 'account_witness_vote': 'account_validator_vote',
138
+ 'account_witness_proxy': 'account_validator_proxy',
139
+ 'shutdown_witness': 'shutdown_validator',
140
+ 'witness_reward': 'validator_reward',
141
+ };
142
+
143
+ // Type ID constants (never change)
144
+ const OP_TYPE_ID = {
145
+ validator_update: 6,
146
+ account_validator_vote: 7,
147
+ account_validator_proxy: 8,
148
+ shutdown_validator: 30,
149
+ validator_reward: 42,
150
+ };
151
+ ```
152
+
153
+ ```php
154
+ // PHP equivalent
155
+ const OP_NAME_MAP = [
156
+ 'witness_update' => 'validator_update',
157
+ 'account_witness_vote' => 'account_validator_vote',
158
+ 'account_witness_proxy' => 'account_validator_proxy',
159
+ 'shutdown_witness' => 'shutdown_validator',
160
+ 'witness_reward' => 'validator_reward',
161
+ ];
162
+
163
+ const OP_TYPE_ID = [
164
+ 'validator_update' => 6,
165
+ 'account_validator_vote' => 7,
166
+ 'account_validator_proxy' => 8,
167
+ 'shutdown_validator' => 30,
168
+ 'validator_reward' => 42,
169
+ ];
170
+ ```
171
+
172
+ ---
173
+
174
+ ## 2. API Methods (JSON-RPC Calls)
175
+
176
+ ### API Namespace
177
+
178
+ **Done.** The JSON-RPC namespace is now **`"validator_api"`**. Old clients still using `"witness_api"` will fail — they must update:
179
+
180
+ ```json
181
+ { "api": "validator_api", "method": "get_active_validators", "params": [] }
182
+ ```
183
+
184
+ Implementation pattern for dual support during library migration:
185
+
186
+ ```js
187
+ async function callApi(method, params) {
188
+ try {
189
+ return await rpc({ api: 'validator_api', method, params });
190
+ } catch (e) {
191
+ // Fallback for old nodes not yet upgraded
192
+ return await rpc({ api: 'witness_api', method, params });
193
+ }
194
+ }
195
+ ```
196
+
197
+ ### Methods to Rename
198
+
199
+ | Current Name (old) | New Name | Returns (unchanged) |
200
+ |-------------------|----------|---------------------|
201
+ | `get_active_witnesses` | `get_active_validators` | `vector<account_name_type>` |
202
+ | `get_witness_schedule` | `get_validator_schedule` | `witness_schedule_object` → `validator_schedule_object` |
203
+ | `get_witnesses` | `get_validators` | `vector<optional<witness_api_object>>` → `validator_api_object` |
204
+ | `get_witness_by_account` | `get_validator_by_account` | `optional<witness_api_object>` → `validator_api_object` |
205
+ | `get_witnesses_by_vote` | `get_validators_by_vote` | `vector<witness_api_object>` → `validator_api_object` |
206
+ | `get_witnesses_by_counted_vote` | `get_validators_by_counted_vote` | `vector<witness_api_object>` → `validator_api_object` |
207
+ | `get_witness_count` | `get_validator_count` | `uint64_t` |
208
+ | `lookup_witness_accounts` | `lookup_validator_accounts` | `set<account_name_type>` |
209
+
210
+ ### What JS/PHP Developers Must Handle
211
+
212
+ **Server-side fallback:** Old method names will remain as deprecated aliases for one release cycle. Calling `get_active_witnesses` will still work but will log a deprecation warning on the server.
213
+
214
+ ### Implementation Pattern for JS/PHP
215
+
216
+ ```js
217
+ // Dual-support API wrapper
218
+ class VizApi {
219
+ async getActiveValidators() {
220
+ try {
221
+ return await this.call('get_active_validators');
222
+ } catch (e) {
223
+ // Fallback to old name for older nodes
224
+ return await this.call('get_active_witnesses');
225
+ }
226
+ }
227
+
228
+ async getValidatorByAccount(account) {
229
+ try {
230
+ return await this.call('get_validator_by_account', [account]);
231
+ } catch (e) {
232
+ return await this.call('get_witness_by_account', [account]);
233
+ }
234
+ }
235
+
236
+ // ... same pattern for all renamed methods
237
+ }
238
+ ```
239
+
240
+ ---
241
+
242
+ ## 3. API Response Objects
243
+
244
+ ### Object Types to Rename
245
+
246
+ | Current Name (old) | New Name | Key Fields (unchanged) |
247
+ |-------------------|----------|------------------------|
248
+ | `witness_object` | `validator_object` | `id`, `owner`, `url`, `signing_key`, `votes`, `schedule` |
249
+ | `witness_schedule_object` | `validator_schedule_object` | `current_shuffled_validators[]`, `num_scheduled` |
250
+ | `witness_api_object` | `validator_api_object` | All fields same as `witness_object` + computed fields |
251
+
252
+ ### Field Renames in Response Objects
253
+
254
+ | Object | Current Field Name (old) | New Field Name |
255
+ |--------|-------------------------|----------------|
256
+ | `validator_schedule_object` | `current_shuffled_witnesses` | `current_shuffled_validators` |
257
+ | `validator_schedule_object` | `num_scheduled_witnesses` | `num_scheduled_validators` |
258
+
259
+ ### What JS/PHP Developers Must Handle
260
+
261
+ ```js
262
+ // Old response:
263
+ {
264
+ "current_shuffled_witnesses": ["alice", "bob", ...],
265
+ "num_scheduled_witnesses": 21
266
+ }
267
+
268
+ // New response:
269
+ {
270
+ "current_shuffled_validators": ["alice", "bob", ...],
271
+ "num_scheduled_validators": 21
272
+ }
273
+
274
+ // Safe accessor pattern
275
+ function getShuffledValidators(schedule) {
276
+ return schedule.current_shuffled_validators
277
+ || schedule.current_shuffled_witnesses; // fallback for old nodes
278
+ }
279
+ ```
280
+
281
+ ---
282
+
283
+ ## 4. Operation Field Names (Changing and Unchanged)
284
+
285
+ ### Fields Being Renamed
286
+
287
+ | Field (old) | Field (new) | Operation | Note |
288
+ |-------------|-------------|-----------|------|
289
+ | `witness` | `validator` | `account_validator_vote` (type 7) | Target account name |
290
+ | `witness` | `validator` | `validator_reward` (type 42) | Virtual op — library receives, not constructs |
291
+
292
+ The node accepts both old and new field names in incoming JSON (backward compat). Responses always use new names.
293
+
294
+ ### Fields That Stay Unchanged
295
+
296
+ | Field | Operation | Why It Stays |
297
+ |-------|-----------|-------------|
298
+ | `owner` | `validator_update` (type 6) | Describes the account, not the role |
299
+ | `url` | `validator_update` (type 6) | URL is a URL |
300
+ | `block_signing_key` | `validator_update` (type 6) | Describes the cryptographic key purpose |
301
+ | `account` | `account_validator_vote` (type 7) | Describes the voting account |
302
+ | `proxy` | `account_validator_proxy` (type 8) | Describes the proxy account |
303
+ | `approve` | `account_validator_vote` (type 7) | Boolean flag |
304
+ | `shares` | `validator_reward` (type 42) | Vesting shares amount |
305
+
306
+ ---
307
+
308
+ ## 5. Chain Properties Field Renames
309
+
310
+ **This section is critical for library developers.** The `chain_properties_update_operation` and `versioned_chain_properties_update_operation` carry governance parameters with `witness` in their names. These field names change in JSON. Libraries that construct these operations must update field names.
311
+
312
+ **Binary format is safe** — field order is preserved in binary serialization, names are not written. Only JSON field names change.
313
+
314
+ ### Fields Being Renamed
315
+
316
+ | Old Field Name | New Field Name | In Struct |
317
+ |----------------|----------------|-----------|
318
+ | `inflation_witness_percent` | `inflation_validator_percent` | `chain_properties_hf4` |
319
+ | `witness_miss_penalty_percent` | `validator_miss_penalty_percent` | `chain_properties_hf6` |
320
+ | `witness_miss_penalty_duration` | `validator_miss_penalty_duration` | `chain_properties_hf6` |
321
+ | `witness_declaration_fee` | `validator_declaration_fee` | `chain_properties_hf9` |
322
+
323
+ ### What JS/PHP Developers Must Handle
324
+
325
+ ```js
326
+ // Old (still accepted by node with compat layer):
327
+ const props = {
328
+ inflation_witness_percent: 1500,
329
+ witness_miss_penalty_percent: 100,
330
+ witness_miss_penalty_duration: 86400,
331
+ witness_declaration_fee: { amount: '10000', asset: 'VIZ' },
332
+ };
333
+
334
+ // New (correct):
335
+ const props = {
336
+ inflation_validator_percent: 1500,
337
+ validator_miss_penalty_percent: 100,
338
+ validator_miss_penalty_duration: 86400,
339
+ validator_declaration_fee: { amount: '10000', asset: 'VIZ' },
340
+ };
341
+ ```
342
+
343
+ ```php
344
+ // PHP equivalent
345
+ $props = [
346
+ 'inflation_validator_percent' => 1500,
347
+ 'validator_miss_penalty_percent' => 100,
348
+ 'validator_miss_penalty_duration' => 86400,
349
+ 'validator_declaration_fee' => ['amount' => '10000', 'asset' => 'VIZ'],
350
+ ];
351
+ ```
352
+
353
+ ---
354
+
355
+ ## 6. Config Keys (For Node Operators)
356
+
357
+ Not directly relevant to JS/PHP libraries, but included for completeness:
358
+
359
+ | Current Config Key (old) | New Config Key |
360
+ |--------------------------|----------------|
361
+ | `plugin = witness` | `plugin = validator` |
362
+ | `plugin = witness_api` | `plugin = validator_api` |
363
+ | `plugin = witness_guard` | `plugin = validator_guard` |
364
+ | `--witness = "name"` | `--validator = "name"` |
365
+ | `witness-guard-enabled` | `validator-guard-enabled` |
366
+ | `witness-guard-disable` | `validator-guard-disable` |
367
+ | `witness-guard-interval` | `validator-guard-interval` |
368
+ | `witness-guard-witness` | `validator-guard-validator` |
369
+
370
+ ---
371
+
372
+ ## 7. CLI Wallet Commands (If Using CLI Wallet)
373
+
374
+ | Current Command (old) | New Command | Notes |
375
+ |----------------------|-------------|-------|
376
+ | `list_witnesses()` | `list_validators()` | Read-only |
377
+ | `get_witness()` | `get_validator()` | Read-only |
378
+ | `get_active_witnesses()` | `get_active_validators()` | Read-only |
379
+ | `update_witness()` | `update_validator()` | Sends type 6 |
380
+ | `vote_for_witness()` | `vote_for_validator()` | Sends type 7 |
381
+ | `set_voting_proxy()` | `set_voting_proxy()` | Command name stays, sends type 8 |
382
+
383
+ ---
384
+
385
+ ## 8. What NEVER Changes
386
+
387
+ | Item | Why |
388
+ |------|-----|
389
+ | Integer type IDs (6, 7, 8, 30, 42) | Binary wire format uses integer indices |
390
+ | Binary serialization of operations | Struct field order is preserved; field names are not written to binary |
391
+ | Field names `block_signing_key`, `url`, `approve`, `proxy` | Describe data, not the role |
392
+ | Null key for deactivation: `VIZ1111111111111111111111111111111114T1Anm` | Same null key format |
393
+ | Signing authority level (`active`) | Operations still require active authority |
394
+ | Block interval, slot scheduling, consensus rules | Unchanged |
395
+
396
+ > **Block header fields** are now `validator` and `validator_signature` in all node responses. Binary wire format is unchanged — field names are not serialized, only values by position. Libraries relaying raw block objects reflect new names automatically; no version negotiation needed.
397
+
398
+ ---
399
+
400
+ ## 9. Migration Strategy for Library Developers
401
+
402
+ ### Phase A — Prepare (Before Node Upgrade)
403
+
404
+ 1. Add dual-name support for operation type identification:
405
+ - Accept both `witness_update` and `validator_update` as name for type ID 6
406
+ - Accept both `account_witness_vote` and `account_validator_vote` as name for type ID 7
407
+ - Same for types 8, 30, 42
408
+ 2. Update field names in operation builders:
409
+ - Type 7: accept both `witness` and `validator` for the target account field; send `validator`
410
+ - Chain properties: add new field names; keep old for backward compat with old nodes
411
+ 3. Add dual-name support for API methods:
412
+ - Try new method name first, fall back to old name
413
+ 4. Add dual field access for response objects:
414
+ - Check `current_shuffled_validators` first, fall back to `current_shuffled_witnesses`
415
+ 5. **Send transactions using integer type IDs** for maximum compatibility
416
+
417
+ ### Phase B — After Node Upgrade
418
+
419
+ 1. Default to new names for sending
420
+ 2. Keep old name acceptance for receiving (history may contain old-format blocks)
421
+ 3. Release library update with both names supported
422
+
423
+ ### Phase C — Cleanup (After All Nodes Upgraded)
424
+
425
+ 1. Remove old name fallbacks
426
+ 2. Use only new names throughout
427
+
428
+ ---
429
+
430
+ ## 10. Complete Quick-Reference Table
431
+
432
+ ### Operations
433
+
434
+ | Type ID | Old JSON Name | New JSON Name | Field changes |
435
+ |---------|--------------|---------------|---------------|
436
+ | 6 | `witness_update` | `validator_update` | none |
437
+ | 7 | `account_witness_vote` | `account_validator_vote` | `witness` → `validator` |
438
+ | 8 | `account_witness_proxy` | `account_validator_proxy` | none |
439
+ | 30 | `shutdown_witness` | `shutdown_validator` | none |
440
+ | 42 | `witness_reward` | `validator_reward` | `witness` → `validator` |
441
+
442
+ ### API Methods
443
+
444
+ | Old Name | New Name |
445
+ |----------|----------|
446
+ | `get_active_witnesses` | `get_active_validators` |
447
+ | `get_witness_schedule` | `get_validator_schedule` |
448
+ | `get_witnesses` | `get_validators` |
449
+ | `get_witness_by_account` | `get_validator_by_account` |
450
+ | `get_witnesses_by_vote` | `get_validators_by_vote` |
451
+ | `get_witnesses_by_counted_vote` | `get_validators_by_counted_vote` |
452
+ | `get_witness_count` | `get_validator_count` |
453
+ | `lookup_witness_accounts` | `lookup_validator_accounts` |
454
+
455
+ ### Response Fields
456
+
457
+ | Old Field | New Field | In Object |
458
+ |-----------|-----------|-----------|
459
+ | `current_shuffled_witnesses` | `current_shuffled_validators` | `validator_schedule_object` |
460
+ | `num_scheduled_witnesses` | `num_scheduled_validators` | `validator_schedule_object` |
461
+
462
+ ### Block Header Fields
463
+
464
+ | Old Field | New Field |
465
+ |-----------|-----------|
466
+ | `witness` | `validator` |
467
+ | `witness_signature` | `validator_signature` |
468
+
469
+ ### Dynamic Global Property Fields
470
+
471
+ | Old Field | New Field |
472
+ |-----------|-----------|
473
+ | `current_witness` | `current_validator` |
474
+
475
+ ### Chain Properties Fields
476
+
477
+ | Old Field | New Field | In Struct |
478
+ |-----------|-----------|-----------|
479
+ | `inflation_witness_percent` | `inflation_validator_percent` | `chain_properties_hf4` |
480
+ | `witness_miss_penalty_percent` | `validator_miss_penalty_percent` | `chain_properties_hf6` |
481
+ | `witness_miss_penalty_duration` | `validator_miss_penalty_duration` | `chain_properties_hf6` |
482
+ | `witness_declaration_fee` | `validator_declaration_fee` | `chain_properties_hf9` |
483
+
484
+ ### Account Object Fields (`get_accounts` response)
485
+
486
+ | Old Field | New Field | Notes |
487
+ |-----------|-----------|-------|
488
+ | `witnesses_voted_for` | `validators_voted_for` | Count of validators the account voted for |
489
+ | `witnesses_vote_weight` | `validators_vote_weight` | Cached voting weight |
490
+ | `witness_votes` | `validator_votes` | Set of validator account names voted for |
491
+
492
+ ### `get_config` Response Keys
493
+
494
+ | Old Key | New Key |
495
+ |---------|---------|
496
+ | `CHAIN_HARDFORK_REQUIRED_WITNESSES` | `CHAIN_HARDFORK_REQUIRED_VALIDATORS` |
497
+ | `CHAIN_MAX_ACCOUNT_WITNESS_VOTES` | `CHAIN_MAX_ACCOUNT_VALIDATOR_VOTES` |
498
+ | `CHAIN_MAX_WITNESSES` | `CHAIN_MAX_VALIDATORS` |
499
+ | `CHAIN_MAX_SUPPORT_WITNESSES` | `CHAIN_MAX_SUPPORT_VALIDATORS` |
500
+ | `CHAIN_MAX_TOP_WITNESSES` | `CHAIN_MAX_TOP_VALIDATORS` |
501
+ | `CHAIN_MAX_WITNESS_URL_LENGTH` | `CHAIN_MAX_VALIDATOR_URL_LENGTH` |