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
5 changes: 4 additions & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ on:
paths:
- 'docs/**'
- '@l10n/**'
- 'redocly.yaml'
- 'scripts/sync-l10n.mjs'
- 'package.json'
- 'package-lock.json'
- '.github/workflows/docs.yml'
workflow_dispatch:

permissions:
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,12 @@ docs/superpowers/

# Claude Code local session/config files
.claude/

# VitePress / docs build artifacts
node_modules/
dist/
docs/.vitepress/cache/
docs/.vitepress/dist/
# Synced from @l10n/<locale>/docs by scripts/sync-l10n.mjs
docs/ru/
docs/zh-CN/
4 changes: 2 additions & 2 deletions @l10n/ru/docs/api/client-libraries.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ require_once '/path/to/viz-php-lib/autoload.php';

```php
$private_key = '5...your_private_key...';
$tx = new VIZ\Transaction('https://node.viz.plus/', $private_key);
$tx = new VIZ\Transaction('https://api.viz.world/', $private_key);

// Сформировать и транслировать транзакцию награды
$tx_data = $tx->award($account, 'committee', 1000, 0, 'memo');
Expand All @@ -74,7 +74,7 @@ $tx_status = $tx->execute($tx_data['json']);

## JavaScript — viz-js-lib

**Репозиторий:** https://github.com/VIZ-Blockchain/viz-js-lib
**Репозиторий:** https://github.com/VIZ-Blockchain/viz-js-lib
**npm:** https://www.npmjs.com/package/viz-js-lib

### Установка
Expand Down
72 changes: 71 additions & 1 deletion @l10n/ru/docs/consensus/block-processing.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ push_block(new_block)
- Извлекать блоки старого форка до общего предка.
- Применять блоки нового форка по порядку.
5. `apply_block()` запускает evaluator-ы транзакций, обновляет динамические глобальные свойства, обрабатывает виртуальные операции.
6. `update_last_irreversible_block()` — продвигает LIB, если ≥14 валидаторов подтвердили.
6. `check_block_post_validation_chain()` — продвигает LIB, если ≥14 валидаторов отправили подписи пост-валидации для следующего блока после LIB (быстрый путь, финализация ~4 с). См. [Блок-пост-валидация](#блок-пост-валидация-быстрая-финализация-lib) ниже.
7. `update_last_irreversible_block()` — классический DPOS-фолбэк: продвигает LIB на основе блоков, произведённых ≥14 валидаторами после целевого (медленный путь, ~63 с).

---

Expand Down Expand Up @@ -233,6 +234,75 @@ Postponed N transactions due to block size limit

---

## Блок-пост-валидация: быстрая финализация LIB

Классический Fair-DPOS продвигает LIB только после того, как 2/3 валидаторов **произведут** блоки поверх целевого — при 21 валидаторе с интервалом 3 с это занимает ~63 секунды. Блок-пост-валидация заменяет этот механизм явными внеполосными сообщениями-подтверждениями, сокращая время финализации до ~4 секунд.

### Как это работает

```
После apply_block(N):
create_block_post_validation(N, block_id, producer)
→ сохраняет validator_confirmation_object в chainbase
→ удаляет записи ниже LIB
→ ограничивает список CHAIN_MAX_BLOCK_POST_VALIDATION_COUNT (20) записями

Тик таймера плагина validator:
для каждого запланированного валидатора с загруженным приватным ключом:
confirmations = get_validator_confirmations(validator)
для каждого подтверждения:
sig = sign(chain_id + block_id) ← secp256k1 с ключом подписи валидатора
p2p.broadcast_block_post_validation(block_id, validator, sig)
← fire-and-forget, неблокирующий

Принимающий пир (p2p_plugin handle_message, тип сообщения 6009):
восстановить pubkey из sig
сравнить с validator.signing_key on-chain
если совпадает → db.apply_block_post_validation(block_id, validator)
→ отметить валидатора как подтвердившего этот блок
→ вызвать check_block_post_validation_chain()

check_block_post_validation_chain():
обойти validator_confirmation_index начиная с (LIB + 1)
подсчитать уникальных запланированных валидаторов, подтвердивших каждый блок
если подтверждений ≥ ⌈2/3 × num_scheduled_validators⌉ (≥ 14 из 21):
продвинуть last_irreversible_block_num
зафиксировать undo-сессии до нового LIB
повторить для следующего блока
```

### Проводное сообщение

`block_post_validation_message` (тип **6009**, legacy graphene протокол):

```cpp
struct block_post_validation_message {
block_id_type block_id;
std::string witness_account; // имя валидатора
signature_type witness_signature; // sign(chain_id + block_id)
};
```

### Тайминги

| Фаза | Длительность |
|------|-------------|
| Блок произведён и распространён | 0 – 1 с |
| Валидаторы подписывают и рассылают подтверждение | ~0 с (следующий тик плагина, 250 мс) |
| Подтверждения распространяются по всем пирам | 1 – 2 с |
| `check_block_post_validation_chain()` собирает ≥14 подписей | 1 – 2 с |
| **Итоговая финализация** | **~3 – 5 с** |

Классический DPOS-путь (~63 с) остаётся активным как фолбэк, если сообщения-подтверждения теряются или ещё не получены.

### Ограничения

- В зачёт порога 2/3 идут только валидаторы из **текущего перетасованного расписания**; валидаторы вне расписания пропускаются.
- Во время **аварийного консенсуса** (`emergency_consensus_active = true`) `check_block_post_validation_chain()` сразу возвращается — LIB продвигается исключительно по классическому пути, чтобы не заблокировать восстановление.
- Список подтверждений ограничен **20 записями** (`CHAIN_MAX_BLOCK_POST_VALIDATION_COUNT`). Записи ниже текущего LIB удаляются после каждого блока.

---

## Константы конфигурации

| Константа | Значение | Описание |
Expand Down
37 changes: 37 additions & 0 deletions @l10n/ru/docs/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
layout: home

hero:
name: VIZ Ledger
tagline: Гибридный DLT с консенсусом Fair-DPOS — официальная документация
actions:
- theme: brand
text: Начать
link: /ru/introduction/what-is-viz
- theme: alt
text: Запуск узла
link: /ru/node/getting-started
- theme: alt
text: GitHub
link: https://github.com/VIZ-Blockchain/viz-cpp-node

features:
- title: Введение
details: Что такое VIZ Ledger, его архитектура и ключевые понятия.
link: /ru/introduction/what-is-viz
- title: Запуск узла
details: Сборка, настройка и эксплуатация узла, валидатора или стража.
link: /ru/node/getting-started
- title: Консенсус
details: Fair-DPOS, обработка блоков, разрешение форков и хардфорки.
link: /ru/consensus/fair-dpos
- title: Протокол
details: Типы данных, операции и виртуальные операции.
link: /ru/protocol/data-types
- title: API
details: JSON-RPC, CLI-кошелёк и клиентские библиотеки.
link: /ru/api/json-rpc
- title: Разработка
details: Сборка, тестирование, отладка и разработка плагинов.
link: /ru/development/building
---
4 changes: 2 additions & 2 deletions @l10n/ru/docs/node/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ p2p-endpoint = 0.0.0.0:2001
p2p-max-connections = 200

# Начальные узлы для установки соединений (повторяемый параметр)
p2p-seed-node = seed1.viz.media:2001
p2p-seed-node = seed2.viz.media:2001
p2p-seed-node = seed1.viz.world:2001
p2p-seed-node = seed2.viz.world:2001

# Контрольные точки: доверенные пары (block_num, block_id) (повторяемый параметр)
# checkpoint = [12345,"0003039..." ]
Expand Down
2 changes: 1 addition & 1 deletion @l10n/ru/docs/node/docker.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ docker run -d \

| Переменная | Описание | Пример |
|------------|----------|--------|
| `VIZD_SEED_NODES` | Список сид-узлов через пробел (переопределяет `/etc/vizd/seednodes`) | `seed1.viz.media:2001 seed2.viz.media:2001` |
| `VIZD_SEED_NODES` | Список сид-узлов через пробел (переопределяет `/etc/vizd/seednodes`) | `seed1.viz.world:2001 seed2.viz.world:2001` |
| `VIZD_RPC_ENDPOINT` | Переопределить HTTP RPC endpoint | `0.0.0.0:8090` |
| `VIZD_P2P_ENDPOINT` | Переопределить P2P endpoint | `0.0.0.0:2001` |
| `VIZD_WITNESS` | Имя аккаунта валидатора (включает производство блоков) | `alice` |
Expand Down
6 changes: 3 additions & 3 deletions @l10n/ru/docs/node/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ docker logs -f vizd

| Переменная | Назначение | Пример |
|-----------|-----------|--------|
| `VIZD_SEED_NODES` | Переопределить начальные узлы | `node1.viz.media:2001` |
| `VIZD_SEED_NODES` | Переопределить начальные узлы | `node1.viz.world:2001` |
| `VIZD_WITNESS` | Имя валидатора (для узла-валидатора) | `alice` |
| `VIZD_PRIVATE_KEY` | Ключ подписи валидатора (WIF) | `5J...` |

Expand Down Expand Up @@ -120,8 +120,8 @@ cp share/vizd/config/config.ini /data/vizd/config.ini
```ini
# P2P
p2p-endpoint = 0.0.0.0:2001
p2p-seed-node = seed1.viz.media:2001
p2p-seed-node = seed2.viz.media:2001
p2p-seed-node = seed1.viz.world:2001
p2p-seed-node = seed2.viz.world:2001

# RPC
webserver-http-endpoint = 0.0.0.0:8090
Expand Down
8 changes: 4 additions & 4 deletions @l10n/ru/docs/node/snapshot.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ vizd \
--snapshot /data/snapshots/viz-snapshot.json \
--plugin snapshot \
--plugin p2p \
--p2p-seed-node seed1.viz.media:2001
--p2p-seed-node seed1.viz.world:2001
```

Узел загружает состояние за секунды и начинает P2P-синхронизацию с высоты блока снимка.
Expand Down Expand Up @@ -286,8 +286,8 @@ snapshot-dir = /data/viz-snapshots

```ini
plugin = snapshot
trusted-snapshot-peer = seed1.viz.media:8092
trusted-snapshot-peer = seed2.viz.media:8092
trusted-snapshot-peer = seed1.viz.world:8092
trusted-snapshot-peer = seed2.viz.world:8092
sync-snapshot-from-trusted-peer = true
```

Expand Down Expand Up @@ -350,7 +350,7 @@ dlt-block-log-max-blocks = 100000

shared-file-size = 4G
plugin = p2p
p2p-seed-node = seed1.viz.media:2001
p2p-seed-node = seed1.viz.world:2001
```

---
Expand Down
2 changes: 1 addition & 1 deletion @l10n/ru/docs/node/validator-node.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
```ini
# P2P — разрешить публичные входящие соединения для распространения блоков
p2p-endpoint = 0.0.0.0:2001
p2p-seed-node = seed1.viz.media:2001
p2p-seed-node = seed1.viz.world:2001

# RPC — привязать к localhost для безопасности (валидаторам публичный API не нужен)
webserver-http-endpoint = 127.0.0.1:8090
Expand Down
81 changes: 81 additions & 0 deletions @l10n/ru/docs/plugins/webserver.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,85 @@ WebSocket-клиенты могут регистрировать колбеки:

---

## Публикация API через HTTPS (nginx + certbot)

Привяжите узел к localhost, затем поставьте перед ним nginx. certbot автоматически дополнит конфиг при запуске `certbot --nginx`.

### 1. config.ini узла

```ini
webserver-http-endpoint = 127.0.0.1:8090
webserver-ws-endpoint = 127.0.0.1:8091
```

### 2. /etc/nginx/sites-enabled/viz-node

```nginx
server {
listen 80;
server_name your.domain.com; # ← замените на ваш домен

# ACME-challenge для certbot
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}

location / {
# CORS — разрешить любой источник (публичный API)
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, PATCH, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;

if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, PATCH, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}

proxy_pass http://127.0.0.1:8090;
proxy_http_version 1.1;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
```

### 3. Получить TLS-сертификат

```bash
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d your.domain.com
```

certbot автоматически добавит блок `listen 443 ssl`, директивы `ssl_certificate` и редирект HTTP→HTTPS. После этого узел доступен по адресу `https://your.domain.com`.

### WebSocket через HTTPS

WebSocket-клиентам нужна проксировка заголовка `Upgrade`. Добавьте отдельный location (или второй server block на порту 8091):

```nginx
location /ws {
proxy_pass http://127.0.0.1:8091;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 3600s;
}
```

---

См. также: [Обзор плагинов](./overview.md), [Database API](./database-api.md), [JSON-RPC API](../api/json-rpc.md).
4 changes: 2 additions & 2 deletions @l10n/zh-CN/docs/api/client-libraries.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ require_once '/path/to/viz-php-lib/autoload.php';

```php
$private_key = '5...your_private_key...';
$tx = new VIZ\Transaction('https://node.viz.plus/', $private_key);
$tx = new VIZ\Transaction('https://api.viz.world/', $private_key);

// 构建并广播奖励交易
$tx_data = $tx->award($account, 'committee', 1000, 0, 'memo');
Expand All @@ -74,7 +74,7 @@ $tx_status = $tx->execute($tx_data['json']);

## JavaScript — viz-js-lib

**仓库:** https://github.com/VIZ-Blockchain/viz-js-lib
**仓库:** https://github.com/VIZ-Blockchain/viz-js-lib
**npm:** https://www.npmjs.com/package/viz-js-lib

### 安装
Expand Down
Loading
Loading