Skip to content

Плагин 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-dirstateКаталог для файла разделяемой памяти (абсолютный путь или относительный к каталогу данных).
shared-file-size2GНачальный размер разделяемой памяти. Используйте 4G16G для производственных узлов в зависимости от возраста цепочки и количества объектов.
inc-shared-file-size2GШаг роста при падении свободного места ниже минимального порога.
min-free-shared-file-size500MАвтоматически расширяться, когда свободная разделяемая память падает ниже этого значения.
block-num-check-free-size1000Проверять свободное место каждые N блоков.
flush-state-interval10000Принудительный полный сброс на диск каждые N блоков. Более высокие значения улучшают пропускную способность ценой большего объёма данных для воспроизведения после нечистого завершения работы.

Block log и DLT

ОпцияПо умолчаниюОписание
dlt-block-log-max-blocks100000Количество последних блоков для хранения в скользящем DLT block log (dlt_block_log.log). Активно только в DLT-режиме (после импорта снимка). Установить в 0 для отключения.
checkpointПары номер-блока/ID-блока, которые должны совпадать при воспроизведении; можно указывать несколько раз.

Производительность

ОпцияПо умолчаниюОписание
single-write-threadfalseМаршрутизировать все операции записи через выделенный поток io_service. Улучшает консистентность при высоком параллелизме; незначительная потеря пропускной способности.
skip-virtual-opsfalseПропустить обработку виртуальных операций. Уменьшает использование памяти; ломает плагины, индексирующие виртуальные операции (account_history, operation_history).
enable-plugins-on-push-transactionfalseУведомлять плагины-наблюдатели, когда транзакции поступают в пул ожидания (до применения блока).
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 и от валидатора). Он:

  1. Проверяет, что временная метка блока не слишком далека в будущем.
  2. Под блокировкой записи вызывает database::push_block().
  3. Обновляет fork database и block log.
  4. Испускает сигнал applied_block всем плагинам-подписчикам.
  5. При 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-blockchainBlock log также был очищен; предоставьте --snapshot для загрузки состояния из снимка
Разделяемая память растёт без ограниченийПроверить настройки inc-shared-file-size и min-free-shared-file-size; убедиться, что цепочка применяет блоки нормально
Ошибки write lock timeoutДругой процесс удерживает блокировку записи; проверить наличие устаревших процессов vizd
Автовосстановление срабатывает неоднократноВозможные аппаратные неисправности хранилища; проверить здоровье диска; также убедиться, что snapshot-every-n-blocks настроен, чтобы существовали свежие снимки

См. также: Плагин Snapshot, Плагин валидатора, Обзор P2P, Обработка блоков.