diff --git a/@l10n/ru/docs/consensus/block-processing.md b/@l10n/ru/docs/consensus/block-processing.md index 6194ed253a..68bf835357 100644 --- a/@l10n/ru/docs/consensus/block-processing.md +++ b/@l10n/ru/docs/consensus/block-processing.md @@ -301,7 +301,7 @@ struct block_post_validation_message { ### Ограничения - В зачёт порога 2/3 идут только валидаторы из **текущего перетасованного расписания**; валидаторы вне расписания пропускаются. -- **Один голос на раунд (правило безопасности Jolteon).** Валидатор голосует за блок раунда *r* (раунд = слот блока, `timestamp / CHAIN_BLOCK_INTERVAL`), только если *r* выше самого старшего раунда, в котором он уже голосовал. Плагин валидатора хранит этот раунд для каждого валидатора в `/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* выше самого старшего раунда, в котором он уже голосовал. Плагин валидатора хранит этот раунд для каждого валидатора в `/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 удаляются после каждого блока. @@ -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 с после (в рантайме) | Интервал производства блоков | --- diff --git a/@l10n/ru/docs/consensus/fair-dpos.md b/@l10n/ru/docs/consensus/fair-dpos.md index d73dfc97c2..8a7530b604 100644 --- a/@l10n/ru/docs/consensus/fair-dpos.md +++ b/@l10n/ru/docs/consensus/fair-dpos.md @@ -39,7 +39,7 @@ VIZ работает с **21 активным валидатором** в каж 2. Добавляются **валидаторы с долей времени** — ротируемый слот для нижестоящих валидаторов, чтобы они могли периодически участвовать и предотвращать полную концентрацию. 3. Результирующие 21 слот перемешиваются с использованием идентификатора головного блока в качестве источника энтропии (детерминированное перемешивание = одинаковый результат на всех узлах). -Полученный упорядоченный список становится **текущим расписанием**. Каждая позиция соответствует 3-секундному слоту. +Полученный упорядоченный список становится **текущим расписанием**. Каждая позиция соответствует одному слоту (3 с до HF16, 1 с после). ### Назначение слота @@ -57,7 +57,7 @@ block_time = genesis_time + slot_num × 3s ### Пропущенные слоты -Когда валидатор пропускает свой слот, `update_global_dynamic_data()` увеличивает `current_aslot` и помечает слот как пропущенный в битовой маске участия. Другие валидаторы не заполняют пропущенный слот — 3-секундный ритм продолжается со следующего слота независимо от этого. +Когда валидатор пропускает свой слот, `update_global_dynamic_data()` увеличивает `current_aslot` и помечает слот как пропущенный в битовой маске участия. Другие валидаторы не заполняют пропущенный слот — ритм слотов продолжается со следующего слота независимо от этого. --- @@ -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` | diff --git a/@l10n/zh-CN/docs/consensus/block-processing.md b/@l10n/zh-CN/docs/consensus/block-processing.md index d01088fa1d..874b76bdb2 100644 --- a/@l10n/zh-CN/docs/consensus/block-processing.md +++ b/@l10n/zh-CN/docs/consensus/block-processing.md @@ -301,7 +301,7 @@ struct block_post_validation_message { ### 约束条件 - 只有**当前打乱排列的调度**中的验证者才计入 2/3 阈值;调度外的验证者被跳过。 -- **每轮只投一票(Jolteon 安全规则)。** 验证者只在 *r* 高于其已投票的最高轮次时,才为第 *r* 轮的区块投票(轮次 = 区块的时隙,`timestamp / CHAIN_BLOCK_INTERVAL`)。验证者插件把每个验证者的该轮次保存在 `/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`)。验证者插件把每个验证者的该轮次保存在 `/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 的条目在每个区块后删除。 @@ -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 秒 | 区块生产间隔 | --- diff --git a/@l10n/zh-CN/docs/consensus/fair-dpos.md b/@l10n/zh-CN/docs/consensus/fair-dpos.md index 59d28ef1fb..a40685508f 100644 --- a/@l10n/zh-CN/docs/consensus/fair-dpos.md +++ b/@l10n/zh-CN/docs/consensus/fair-dpos.md @@ -39,7 +39,7 @@ VIZ 每个调度轮次运行 **21 个活跃验证者**。 2. 添加**时间份额验证者**——为排名较低的验证者提供偶尔参与的旋转槽位,防止完全集中。 3. 使用头区块 ID 作为熵种子对结果 21 个槽位进行洗牌(确定性洗牌 = 所有节点结果相同)。 -生成的有序列表成为**当前计划**。每个位置对应一个 3 秒槽位。 +生成的有序列表成为**当前计划**。每个位置对应一个槽位(HF16 前 3 秒,之后 1 秒)。 ### 槽位分配 @@ -57,7 +57,7 @@ block_time = genesis_time + slot_num × 3s ### 错过的槽位 -当验证者错过其槽位时,`update_global_dynamic_data()` 递增 `current_aslot` 并在参与位掩码中将该槽位标记为已错过。其他验证者不会填充错过的槽位——无论如何,3 秒节奏继续到下一个槽位。 +当验证者错过其槽位时,`update_global_dynamic_data()` 递增 `current_aslot` 并在参与位掩码中将该槽位标记为已错过。其他验证者不会填充错过的槽位——无论如何,槽位节奏继续到下一个槽位。 --- @@ -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` | diff --git a/docs/consensus/block-processing.md b/docs/consensus/block-processing.md index 0dac245cc6..c53b04819e 100644 --- a/docs/consensus/block-processing.md +++ b/docs/consensus/block-processing.md @@ -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 `/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 `/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. diff --git a/docs/consensus/fair-dpos.md b/docs/consensus/fair-dpos.md index e799ddfd76..965488b214 100644 --- a/docs/consensus/fair-dpos.md +++ b/docs/consensus/fair-dpos.md @@ -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 @@ -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. ---