Плагин Chain
Плагин chain — это ключевой компонент каждого узла VIZ Ledger. Он управляет разделяемой памятью базы данных chainbase, принимает и проверяет блоки и транзакции, поддерживает состояние fork database и block log, координирует запуск с плагинами snapshot и P2P. Все остальные плагины зависят от него.
Исходник: plugins/chain/plugin.cpp
Зависимости
json_rpc::pluginПлагин chain должен быть первым инициализируемым доменным плагином; json_rpc — его единственная формальная зависимость и загружается первым фреймворком AppBase.
Конфигурация
Только CLI-флаги
Это одноразовые операции восстановления или обслуживания; они заставляют узел выполнить конкретное действие при запуске и не могут быть заданы в config.ini.
| Флаг | Описание |
|---|---|
--replay-from-snapshot <path> | Восстановление после сбоя: очистить shared memory, импортировать снимок, затем воспроизвести скользящий DLT block log. См. Плагин Snapshot. |
--snapshot-auto-latest | С --replay-from-snapshot: автоматически обнаружить последний снимок в snapshot-dir вместо ручного указания пути. |
--auto-recover-from-snapshot | По умолчанию true. Автоматически восстанавливаться во время работы при обнаружении повреждения shared memory во время обработки или генерации блоков, без перезапуска. Отключить через --no-auto-recover-from-snapshot. |
--resync-blockchain | Очистить и shared memory, и block log; начать с genesis или из снимка. Деструктивно — использовать только при восстановлении после полной потери данных. |
--check-locks | Проверить порядок блокировок (только для разработки). |
--validate-database-invariants | Выполнять проверки консистентности базы данных на каждом блоке (очень медленно; только для разработки). |
Опции файла конфигурации
Разделяемая память
| Опция | По умолчанию | Описание |
|---|---|---|
shared-file-dir | state | Каталог для файла разделяемой памяти (абсолютный путь или относительный к каталогу данных). |
shared-file-size | 2G | Начальный размер разделяемой памяти. Используйте 4G–16G для производственных узлов в зависимости от возраста цепочки и количества объектов. |
inc-shared-file-size | 2G | Шаг роста при падении свободного места ниже минимального порога. |
min-free-shared-file-size | 500M | Автоматически расширяться, когда свободная разделяемая память падает ниже этого значения. |
block-num-check-free-size | 1000 | Проверять свободное место каждые N блоков. |
flush-state-interval | 10000 | Принудительный полный сброс на диск каждые N блоков. Более высокие значения улучшают пропускную способность ценой большего объёма данных для воспроизведения после нечистого завершения работы. |
Block log и DLT
| Опция | По умолчанию | Описание |
|---|---|---|
dlt-block-log-max-blocks | 100000 | Количество последних блоков для хранения в скользящем DLT block log (dlt_block_log.log). Активно только в DLT-режиме (после импорта снимка). Установить в 0 для отключения. |
checkpoint | — | Пары номер-блока/ID-блока, которые должны совпадать при воспроизведении; можно указывать несколько раз. |
Производительность
| Опция | По умолчанию | Описание |
|---|---|---|
single-write-thread | false | Маршрутизировать все операции записи через выделенный поток io_service. Улучшает консистентность при высоком параллелизме; незначительная потеря пропускной способности. |
skip-virtual-ops | false | Пропустить обработку виртуальных операций. Уменьшает использование памяти; ломает плагины, индексирующие виртуальные операции (account_history, operation_history). |
enable-plugins-on-push-transaction | false | Уведомлять плагины-наблюдатели, когда транзакции поступают в пул ожидания (до применения блока). |
read-wait-micro | (по умолч. db) | Таймаут блокировки чтения в микросекундах. |
max-read-wait-retries | (по умолч. db) | Количество попыток до того, как таймаут блокировки чтения становится фатальным. |
write-wait-micro | (по умолч. db) | Таймаут блокировки записи в микросекундах. |
max-write-wait-retries | (по умолч. db) | Количество попыток до того, как таймаут блокировки записи становится фатальным. |
Последовательность запуска
plugin_initialize() ← разобрать CLI и опции конфигурации; проверить путь к снимку
plugin_startup() ← открыть или создать базу данных
├─ --resync → очистить shared memory + block log; инициализировать genesis
├─ --snapshot → импортировать снимок; запустить DLT-режим
├─ --replay-from-snapshot → импортировать снимок; воспроизвести dlt_block_log
└─ нормальный перезапуск → открыть существующую shared memory; воспроизвести при несовпадении ревизии
emit on_sync() ← активируются плагины P2P и валидатораВся загрузка снимков происходит внутри plugin_startup(), до того как P2P или валидатор видят базу данных.
Принятие блоков
chain::plugin::accept_block() является точкой входа для всех входящих блоков (от P2P и от валидатора). Он:
- Проверяет, что временная метка блока не слишком далека в будущем.
- Под блокировкой записи вызывает
database::push_block(). - Обновляет fork database и block log.
- Испускает сигнал
applied_blockвсем плагинам-подписчикам. - При
shared_memory_corruption_exceptionвызываетattempt_auto_recovery(), если автовосстановление включено.
Принятие транзакций (accept_transaction()) следует тому же пути через database::push_transaction().
Разделяемая память
База данных chainbase живёт в одном файле с отображением в память (shared_memory.bin) в shared-file-dir. Ключевые рекомендации по размеру:
- Начните с
shared-file-size = 4Gдля узла, загружающегося из недавнего снимка. - База данных автоматически увеличивается на
inc-shared-file-size, когда свободное место падает нижеmin-free-shared-file-size. - После чистого завершения работы файл уменьшается до фактически используемого размера.
- После сбоя запустите с
--replay-from-snapshot --snapshot-auto-latestдля восстановления консистентного состояния.
Устранение неполадок
| Симптом | Действие |
|---|---|
FC_ASSERT или database_revision_exception при запуске | Несовпадение ревизии — запустить --replay-from-snapshot --snapshot-auto-latest |
| Открытие chainbase завершается ошибкой повреждения | Запустить --replay-from-snapshot --snapshot-auto-latest |
Узел застрял на genesis после --resync-blockchain | Block log также был очищен; предоставьте --snapshot для загрузки состояния из снимка |
| Разделяемая память растёт без ограничений | Проверить настройки inc-shared-file-size и min-free-shared-file-size; убедиться, что цепочка применяет блоки нормально |
Ошибки write lock timeout | Другой процесс удерживает блокировку записи; проверить наличие устаревших процессов vizd |
| Автовосстановление срабатывает неоднократно | Возможные аппаратные неисправности хранилища; проверить здоровье диска; также убедиться, что snapshot-every-n-blocks настроен, чтобы существовали свежие снимки |
См. также: Плагин Snapshot, Плагин валидатора, Обзор P2P, Обработка блоков.