Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions @l10n/ru/docs/consensus/block-processing.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ struct block_post_validation_message {
### Ограничения

- В зачёт порога 2/3 идут только валидаторы из **текущего перетасованного расписания**; валидаторы вне расписания пропускаются.
- **Один голос на раунд (правило безопасности Jolteon).** Валидатор голосует за блок раунда *r* (раунд = слот блока, `timestamp / CHAIN_BLOCK_INTERVAL`), только если *r* выше самого старшего раунда, в котором он уже голосовал. Плагин валидатора хранит этот раунд для каждого валидатора в `<data-dir>/block-vote-round.txt`, записывает его **до** отправки голоса (голос, раунд которого не удалось сохранить, не отправляется) и пишет в лог `Not voting for … already voted for … in round …`, если в том же раунде появился другой блок. В отличие от правила «одна подпись на высоту», в более позднем раунде валидатор может проголосовать за другой блок той же высоты — именно это позволяет расколу голосов разрешиться, а не застрять. Два конфликтующих сертификата кворума в одном раунде требуют валидаторов, голосующих дважды; ноды пишут такие голоса в лог как `Equivocation: …`. Повторная рассылка того же голоса разрешена.
- **Один голос на раунд (правило безопасности Jolteon).** Валидатор голосует за блок раунда *r* (раунд = `round_of(timestamp)`: `timestamp / 3` до блока переключения HF16 *S*, затем `S / 3 + (timestamp − S)`, чтобы нумерация раундов не прерывалась на переключении; никогда не `timestamp / CHAIN_BLOCK_INTERVAL`), только если *r* выше самого старшего раунда, в котором он уже голосовал. Плагин валидатора хранит этот раунд для каждого валидатора в `<data-dir>/block-vote-round.txt`, записывает его **до** отправки голоса (голос, раунд которого не удалось сохранить, не отправляется) и пишет в лог `Not voting for … already voted for … in round …`, если в том же раунде появился другой блок. В отличие от правила «одна подпись на высоту», в более позднем раунде валидатор может проголосовать за другой блок той же высоты — именно это позволяет расколу голосов разрешиться, а не застрять. Два конфликтующих сертификата кворума в одном раунде требуют валидаторов, голосующих дважды; ноды пишут такие голоса в лог как `Equivocation: …`. Повторная рассылка того же голоса разрешена.
- Во время **аварийного консенсуса** (`emergency_consensus_active = true`) `check_block_post_validation_chain()` сразу возвращается — LIB продвигается исключительно по классическому пути, чтобы не заблокировать восстановление.
- Список подтверждений ограничен **20 записями** (`CHAIN_MAX_BLOCK_POST_VALIDATION_COUNT`). Записи ниже текущего LIB удаляются после каждого блока.

Expand All @@ -315,7 +315,7 @@ struct block_post_validation_message {
| `CHAIN_BLOCK_GENERATION_POSTPONED_TX_LIMIT` | 5 | Максимум последовательных превышающих транзакций, пропускаемых при генерации |
| `CHAIN_BLOCK_SIZE` | 65536 байт | Жёсткий лимит размера блока |
| `maximum_block_size` | Динамический (медиана валидаторов) | Мягкий лимит размера блока |
| `CHAIN_BLOCK_INTERVAL` | 3 с | Интервал производства блоков |
| `CHAIN_BLOCK_INTERVAL` | 3 с до HF16; 1 с после (в рантайме) | Интервал производства блоков |

---

Expand Down
6 changes: 3 additions & 3 deletions @l10n/ru/docs/consensus/fair-dpos.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ VIZ работает с **21 активным валидатором** в каж
2. Добавляются **валидаторы с долей времени** — ротируемый слот для нижестоящих валидаторов, чтобы они могли периодически участвовать и предотвращать полную концентрацию.
3. Результирующие 21 слот перемешиваются с использованием идентификатора головного блока в качестве источника энтропии (детерминированное перемешивание = одинаковый результат на всех узлах).

Полученный упорядоченный список становится **текущим расписанием**. Каждая позиция соответствует 3-секундному слоту.
Полученный упорядоченный список становится **текущим расписанием**. Каждая позиция соответствует одному слоту (3 с до HF16, 1 с после).

### Назначение слота

Expand All @@ -57,7 +57,7 @@ block_time = genesis_time + slot_num × 3s

### Пропущенные слоты

Когда валидатор пропускает свой слот, `update_global_dynamic_data()` увеличивает `current_aslot` и помечает слот как пропущенный в битовой маске участия. Другие валидаторы не заполняют пропущенный слот — 3-секундный ритм продолжается со следующего слота независимо от этого.
Когда валидатор пропускает свой слот, `update_global_dynamic_data()` увеличивает `current_aslot` и помечает слот как пропущенный в битовой маске участия. Другие валидаторы не заполняют пропущенный слот — ритм слотов продолжается со следующего слота независимо от этого.

---

Expand Down Expand Up @@ -170,7 +170,7 @@ irreversibility_threshold = ceil(num_scheduled_validators * 2 / 3)
| `enable-stale-production` | `false` | Обход проверки участия (только для тестовой сети) |
| `emergency-private-key` | — | Опциональный ключ подписи для экстренного консенсуса |
| Активные валидаторы | 21 | Задано в `CHAIN_MAX_VALIDATORS` |
| Интервал блока | 3 с | `CHAIN_BLOCK_INTERVAL` |
| Интервал блока | 3 с до HF16; 1 с после | `get_config` в рантайме |
| Порог LIB | ⌈21 × 2/3⌉ = 14 | Блоки, подтверждающие необратимость |
| Таймаут чрезвычайной ситуации | 3600 с | `CHAIN_EMERGENCY_CONSENSUS_TIMEOUT_SEC` |

Expand Down
4 changes: 2 additions & 2 deletions @l10n/zh-CN/docs/consensus/block-processing.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ struct block_post_validation_message {
### 约束条件

- 只有**当前打乱排列的调度**中的验证者才计入 2/3 阈值;调度外的验证者被跳过。
- **每轮只投一票(Jolteon 安全规则)。** 验证者只在 *r* 高于其已投票的最高轮次时,才为第 *r* 轮的区块投票(轮次 = 区块的时隙,`timestamp / CHAIN_BLOCK_INTERVAL`)。验证者插件把每个验证者的该轮次保存在 `<data-dir>/block-vote-round.txt`,在投票发出**之前**写入(无法持久化轮次的投票不会发送),并在同一轮出现另一个区块时记录日志 `Not voting for … already voted for … in round …`。与“每个高度只签一次”不同,验证者可以在更晚的轮次为同一高度的另一个区块投票——正是这一点让分裂的投票得以解决而不是卡住。同一轮中两个冲突的法定人数证书需要有验证者投票两次;节点会把这类投票记录为 `Equivocation: …`。重复广播同一投票仍然允许。
- **每轮只投一票(Jolteon 安全规则)。** 验证者只在 *r* 高于其已投票的最高轮次时,才为第 *r* 轮的区块投票(轮次 = `round_of(timestamp)`:HF16 切换区块 *S* 之前为 `timestamp / 3`,之后为 `S / 3 + (timestamp − S)`,使轮次在切换处保持连续;绝不能用 `timestamp / CHAIN_BLOCK_INTERVAL`)。验证者插件把每个验证者的该轮次保存在 `<data-dir>/block-vote-round.txt`,在投票发出**之前**写入(无法持久化轮次的投票不会发送),并在同一轮出现另一个区块时记录日志 `Not voting for … already voted for … in round …`。与“每个高度只签一次”不同,验证者可以在更晚的轮次为同一高度的另一个区块投票——正是这一点让分裂的投票得以解决而不是卡住。同一轮中两个冲突的法定人数证书需要有验证者投票两次;节点会把这类投票记录为 `Equivocation: …`。重复广播同一投票仍然允许。
- 在**紧急共识**期间(`emergency_consensus_active = true`),`check_block_post_validation_chain()` 立即返回——LIB 仅通过经典路径推进,以避免恢复过程死锁。
- 确认列表上限为 **20 条**(`CHAIN_MAX_BLOCK_POST_VALIDATION_COUNT`)。低于当前 LIB 的条目在每个区块后删除。

Expand All @@ -315,7 +315,7 @@ struct block_post_validation_message {
| `CHAIN_BLOCK_GENERATION_POSTPONED_TX_LIMIT` | 5 | 生成期间跳过的最大连续超大交易数 |
| `CHAIN_BLOCK_SIZE` | 65536 字节 | 硬区块大小限制 |
| `maximum_block_size` | 动态(验证者中位数) | 软区块大小限制 |
| `CHAIN_BLOCK_INTERVAL` | 3 秒 | 区块生产间隔 |
| `CHAIN_BLOCK_INTERVAL` | HF16 前 3 秒;之后运行时为 1 秒 | 区块生产间隔 |

---

Expand Down
6 changes: 3 additions & 3 deletions @l10n/zh-CN/docs/consensus/fair-dpos.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ VIZ 每个调度轮次运行 **21 个活跃验证者**。
2. 添加**时间份额验证者**——为排名较低的验证者提供偶尔参与的旋转槽位,防止完全集中。
3. 使用头区块 ID 作为熵种子对结果 21 个槽位进行洗牌(确定性洗牌 = 所有节点结果相同)。

生成的有序列表成为**当前计划**。每个位置对应一个 3 秒槽位。
生成的有序列表成为**当前计划**。每个位置对应一个槽位(HF16 前 3 秒,之后 1 秒)。

### 槽位分配

Expand All @@ -57,7 +57,7 @@ block_time = genesis_time + slot_num × 3s

### 错过的槽位

当验证者错过其槽位时,`update_global_dynamic_data()` 递增 `current_aslot` 并在参与位掩码中将该槽位标记为已错过。其他验证者不会填充错过的槽位——无论如何,3 秒节奏继续到下一个槽位。
当验证者错过其槽位时,`update_global_dynamic_data()` 递增 `current_aslot` 并在参与位掩码中将该槽位标记为已错过。其他验证者不会填充错过的槽位——无论如何,槽位节奏继续到下一个槽位。

---

Expand Down Expand Up @@ -170,7 +170,7 @@ irreversibility_threshold = ceil(num_scheduled_validators * 2 / 3)
| `enable-stale-production` | `false` | 绕过参与度检查(仅限测试网) |
| `emergency-private-key` | — | 可选的紧急共识签名密钥 |
| 活跃验证者 | 21 | 在 `CHAIN_MAX_VALIDATORS` 中硬编码 |
| 区块间隔 | 3 秒 | `CHAIN_BLOCK_INTERVAL` |
| 区块间隔 | HF16 前 3 秒;之后 1 秒 | 运行时 `get_config` |
| LIB 阈值 | ⌈21 × 2/3⌉ = 14 | 确认不可逆性所需的区块数 |
| 紧急超时 | 3600 秒 | `CHAIN_EMERGENCY_CONSENSUS_TIMEOUT_SEC` |

Expand Down
2 changes: 1 addition & 1 deletion docs/consensus/block-processing.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ Classic DPOS path (~63 s) remains active as a fallback if confirmation messages
### Constraints

- Only validators in the **current shuffled schedule** count toward the 2/3 threshold; off-schedule validators are skipped.
- **One vote per round (Jolteon safety rule).** A validator votes for a block of round *r* (round = the block's slot, `timestamp / CHAIN_BLOCK_INTERVAL`) only when *r* is above the highest round it has voted in. The validator plugin keeps that round per validator in `<data-dir>/block-vote-round.txt`, writes it **before** the vote leaves (a vote whose round cannot be persisted is not sent) and logs `Not voting for … already voted for … in round …` when a different block of the same round shows up. Unlike a one-signature-per-height rule, a validator may vote for a different block at the same height in a later round — that is what lets a split vote resolve instead of stalling. Two conflicting quorum certificates in one round need validators that vote twice; nodes log such votes as `Equivocation: …`. Re-broadcasting the same vote stays allowed.
- **One vote per round (Jolteon safety rule).** A validator votes for a block of round *r* (round = `round_of(timestamp)`: `timestamp / 3` up to the HF16 switch block *S*, then `S / 3 + (timestamp − S)`, so rounds stay contiguous across the switch; never `timestamp / CHAIN_BLOCK_INTERVAL`) only when *r* is above the highest round it has voted in. The validator plugin keeps that round per validator in `<data-dir>/block-vote-round.txt`, writes it **before** the vote leaves (a vote whose round cannot be persisted is not sent) and logs `Not voting for … already voted for … in round …` when a different block of the same round shows up. Unlike a one-signature-per-height rule, a validator may vote for a different block at the same height in a later round — that is what lets a split vote resolve instead of stalling. Two conflicting quorum certificates in one round need validators that vote twice; nodes log such votes as `Equivocation: …`. Re-broadcasting the same vote stays allowed.
- During **emergency consensus** (`emergency_consensus_active = true`), `check_block_post_validation_chain()` returns immediately — LIB is advanced solely by the classic path to avoid deadlocking recovery.
- The confirmation list is capped at **20 entries** (`CHAIN_MAX_BLOCK_POST_VALIDATION_COUNT`). Entries below the current LIB are pruned after every block.

Expand Down
4 changes: 2 additions & 2 deletions docs/consensus/fair-dpos.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Every `CHAIN_WITNESS_SCHEDULE_BLOCK_NUM` blocks (21) the chain recomputes the ac
2. Add the **time-share validators** — a rotating slot for lower-ranked validators to participate occasionally, preventing complete concentration.
3. Shuffle the resulting 21 slots using the head block ID as entropy seed (deterministic shuffle = same result on all nodes).

The resulting ordered list becomes the **current schedule**. Each position corresponds to a 3-second slot.
The resulting ordered list becomes the **current schedule**. Each position corresponds to one slot (3 s before HF16, 1 s after).

### Slot assignment

Expand All @@ -57,7 +57,7 @@ block_time = genesis_time + slot_num × 3s

### Missed slots

When a validator misses their slot, `update_global_dynamic_data()` increments `current_aslot` and marks the slot as missed in the participation bitmask. Other validators do not fill in for a missed slot — the 3-second rhythm continues on the next slot regardless.
When a validator misses their slot, `update_global_dynamic_data()` increments `current_aslot` and marks the slot as missed in the participation bitmask. Other validators do not fill in for a missed slot — the slot rhythm continues on the next slot regardless.

---

Expand Down
Loading