Конфигурация узла
Узлы VIZ Ledger настраиваются через INI-файл. В репозитории поставляется несколько шаблонов в share/vizd/config/:
| Шаблон | Назначение |
|---|---|
config.ini | Полный узел основной сети с публичным RPC |
config_witness.ini | Узел-валидатор (RPC на localhost, производство блоков) |
config_testnet.ini | Тестовая сеть / разработка |
config_stock_exchange.ini | Потребитель рыночных данных (минимум плагинов) |
config_debug.ini | Режим отладки |
Сеть и P2P
# Адрес прослушивания P2P-соединений (стандартный порт 2001)
p2p-endpoint = 0.0.0.0:2001
# Максимальное количество подключений к пирам (без ограничений, если не задано)
p2p-max-connections = 200
# Начальные узлы для установки соединений (повторяемый параметр)
p2p-seed-node = seed3.viz.world:2001
p2p-seed-node = seed1.viz.world:2001
p2p-seed-node = rpc.viz.cx:2001
# Контрольные точки: доверенные пары (block_num, block_id) (повторяемый параметр)
# checkpoint = [12345,"0003039..." ]Веб-сервер и RPC
# HTTP JSON-RPC эндпоинт
webserver-http-endpoint = 0.0.0.0:8090
# WebSocket JSON-RPC эндпоинт
webserver-ws-endpoint = 0.0.0.0:8091
# Размер пула потоков RPC
webserver-thread-pool-size = 2Примечание по безопасности: Для узлов-валидаторов привяжите к
127.0.0.1, чтобы заблокировать внешний доступ:iniwebserver-http-endpoint = 127.0.0.1:8090 webserver-ws-endpoint = 127.0.0.1:8091
Блокировки и параллелизм
# Время ожидания блокировки чтения в микросекундах перед повторной попыткой
read-wait-micro = 500000
# Максимальное количество повторных попыток блокировки чтения
max-read-wait-retries = 2
# Время ожидания блокировки записи в микросекундах перед повторной попыткой
write-wait-micro = 500000
# Максимальное количество повторных попыток блокировки записи
max-write-wait-retries = 3
# Сериализовать все операции записи в одном потоке (рекомендуется)
single-write-thread = true
# Запускать уведомления плагинов при push_transaction (увеличивает задержку; по умолчанию false)
enable-plugins-on-push-transaction = falseРазделяемая память (база данных)
Состояние блокчейна хранится в файле с отображением в память (shared_memory.bin).
# Начальный размер файла разделяемой памяти
shared-file-size = 4G
# Минимальный свободный объём перед изменением размера
min-free-shared-file-size = 500M
# Объём увеличения файла при изменении размера
inc-shared-file-size = 2G
# Проверять свободное место каждые N блоков
block-num-check-free-size = 1000Подбирайте shared-file-size в зависимости от размера цепочки. Для основной сети начните с 4G и следите за ростом.
Активация плагинов
# Каждая строка 'plugin' добавляет плагин (повторяемый параметр)
# Минимальный набор для полного API-узла:
plugin = chain p2p webserver json_rpc database_api network_broadcast_api
# Дополнительные плагины индексирования (отключить на маломощных узлах):
plugin = account_history account_by_key
plugin = committee_api invite_api paid_subscription_api custom_protocol_api
# Только для узлов-валидаторов:
plugin = validator validator_apiНаборы плагинов по типу узла
| Тип узла | Плагины |
|---|---|
| Полный узел | Все перечисленные выше |
| Валидатор | chain p2p webserver json_rpc database_api network_broadcast_api validator validator_api |
| Маломощный сид | chain p2p |
| Биржа | chain p2p webserver json_rpc database_api network_broadcast_api account_history |
История и отслеживание
# Удалять объекты голосов до данного блока (экономит память; 0 = хранить всё)
clear-votes-before-block = 0
# Пропускать индексирование виртуальных операций (экономит память у валидаторов)
skip-virtual-ops = false
# Индексировать историю аккаунтов только для диапазона (опционально)
# track-account-range = ["alice","alice.zzz"]
# Белый/чёрный список типов операций для истории
# history-whitelist-ops = transfer_operation
# history-blacklist-ops = custom_operation
# Начать индексирование истории с данного номера блока
# history-start-block = 1000000
# Диапазон отслеживания личных сообщений (опционально, пример плагина)
# pm-account-range = ["alice","alice.zzz"]Валидатор (производство блоков)
На не-валидаторных узлах эти параметры не задаются.
# Разрешить производство при устаревшей цепочке (только для разработки/тестовой сети)
enable-stale-production = false
# Отключить обнаружение minority fork (ТОЛЬКО для тестовой сети/форка одного оператора).
# В отличие от enable-stale-production, никогда не сбрасывается автоматически при
# здоровом участии. Никогда не включайте в реальной публичной сети.
disable-minority-fork-detection = false
# Минимальный процент участия для производства блоков (0–99)
required-participation = 33
# Имя аккаунта валидатора (повторяемый параметр для нескольких валидаторов на одном узле)
validator = alice
# WIF-ключ подписи валидатора
private-key = 5JxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxWIF
# Приватный ключ экстренного консенсуса (опционально)
# emergency-private-key = 5Jxxx...Полная конфигурация валидатора — в разделе Узел-валидатор.
Логирование
# Консольный логгер (вывод в stderr)
log.console_appender.stderr.stream = std_error
# Файловый логгер для P2P-сообщений
log.file_appender.p2p.filename = logs/p2p/p2p.log
# Уровень логирования: all, debug, info, warn, error, off
logger.default.level = warn
logger.default.appenders = stderr
logger.p2p.level = warn
logger.p2p.appenders = p2pАппендер file ротируется по времени: новый файл каждый час, хранится сутки.
Оба числа и оба переключателя — это конфигурация секции, а не константы:
log.file_appender.p2p.filename = logs/p2p/p2p.log
log.file_appender.p2p.flush = true
log.file_appender.p2p.rotate = true
log.file_appender.p2p.rotation_interval = 3600 # секунд в одном файле
log.file_appender.p2p.rotation_limit = 86400 # сколько секунд хранятся ротированные файлыflush, rotate, rotation_interval и rotation_limit читаются из ini; секция без них сохраняет прежние значения из примера выше, поэтому существующий конфиг ведёт себя ровно как раньше. Для ротации нужны rotation_interval >= 1 с и rotation_limit >= rotation_interval (аппендер проверяет эту пару). Значение, которое не удалось разобрать, нарушенная пара или неизвестный ключ в секции log.file_appender.* печатаются в stderr, а умолчание сохраняется: опечатка не должна стоить оператору лог-файла, и ключ, который ничего не делает, больше не принимается молча. Сборки до 25.10.2026 читали только filename: эти ключи не действовали вовсе, ротация всегда была часовой с хранением сутки.
С 25.10.2026 ротацию обслуживает собственный поток аппендера, поэтому она срабатывает независимо от того, чем занят главный поток. Сборки, сделанные раньше, ротировались только пока обслуживается очередь файберов fc, а vizd после старта её не обслуживает (замер 20.10.2026: нода тестнета написала один файл на 37 МБ за девять часов на уровне info, часовых файлов нет; нода мейннета проработала четыре дня без нового файла) — таким нодам по-прежнему нужен внешний logrotate. В любом случае ротация ограничивает файл по ВРЕМЕНИ, а не по размеру: на debug нода может писать гигабайты в час. Если нужен только свежий хвост, используйте опциональный capped-аппендер: один файл, в котором остаются последние max_lines строк (по умолчанию 10000, 0 — без ограничения). Он считает строки при записи и сжимается на месте, поэтому файл держится между max_lines и ~1.1 x max_lines, без всяких таймеров. Ноды, в конфиге которых нет секции log.capped_file_appender.*, ведут себя ровно как раньше; саму секцию безопасно завозить ДО обновления бинаря — старая сборка её игнорирует и продолжает писать в stderr. Если указанный путь не открывается, нода всё равно стартует: печатает в stderr одну строку capped_file_appender: cannot open log file … и просто не создаёт файл.
log.capped_file_appender.node.filename = logs/node/node.log
log.capped_file_appender.node.max_lines = 10000
# Куда именно писать — решает логгер; сам аппендер ничего не пишет.
logger.default.appenders = stderr, nodeПолный справочник
Все параметры по исходным файлам:
| Источник | Параметры |
|---|---|
plugins/chain/plugin.hpp | shared-file-size, min-free-shared-file-size, inc-shared-file-size, block-num-check-free-size, single-write-thread, enable-plugins-on-push-transaction, read-wait-micro, max-read-wait-retries, write-wait-micro, max-write-wait-retries, skip-virtual-ops, clear-votes-before-block, track-account-range, history-whitelist-ops, history-blacklist-ops, history-start-block |
plugins/p2p/p2p_plugin.hpp | p2p-endpoint, p2p-max-connections, p2p-seed-node, checkpoint |
plugins/webserver/webserver_plugin.hpp | webserver-http-endpoint, webserver-ws-endpoint, webserver-thread-pool-size |
plugins/validator/validator.hpp | enable-stale-production, disable-minority-fork-detection, required-participation, validator, private-key, emergency-private-key, fork-collision-timeout-blocks, ntp-server, ntp-request-interval, debug-block-production |