Skip to content

节点配置 ​

VIZ Ledger 节点通过 INI 文件进行配置。仓库在 share/vizd/config/ 中提供了几个模板:

模板使用场景
config.ini带公共 RPC 的完整主网节点
config_witness.ini验证者节点(本地 RPC,区块生产)
config_testnet.ini测试网/开发环境
config_stock_exchange.ini市场数据消费者(最少插件)
config_debug.ini调试模式

网络和 P2P ​

ini
# 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..." ]

Web 服务器和 RPC ​

ini
# 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 以防止外部访问:

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

锁定和并发 ​

ini
# 重试前等待读锁的微秒数
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)中。

ini
# 共享内存文件的初始大小
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 开始并监控增长情况。


插件激活 ​

ini
# 每个 '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

历史记录和追踪 ​

ini
# 丢弃此区块之前的投票对象(节省内存,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"]

验证者(区块生产) ​

非验证者节点请不要设置这些参数。

ini
# 允许在链过期时生产(仅用于开发/测试网)
enable-stale-production = false

# 禁用少数派 fork 检测(仅用于单运营者测试网/分叉)。
# 与 enable-stale-production 不同,它不会在健康参与度下被自动清除。
# 切勿在真实的公共网络上启用。
disable-minority-fork-detection = false

# 生产区块所需的最低参与度 % (0–99)
required-participation = 33

# 验证者账户名(可重复,用于一个节点上的多个验证者)
validator = alice

# 验证者的 WIF 签名密钥
private-key = 5JxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxWIF

# 紧急共识私钥(可选)
# emergency-private-key = 5Jxxx...

完整的验证者配置参见验证者节点。


日志 ​

ini
# 控制台日志记录器(输出到 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 appender 按时间轮转:每小时一个新文件,保留一天。

这两个数值和两个开关都属于该节的配置,而不是常量:

ini
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(appender 会校验这一对)。无法解析的值、 不满足关系的组合或 log.file_appender.* 节中的未知键都会打印到 stderr,并保留默认值—— 笔误不应让操作者失去日志文件,而无效的键也不再被静默接受。2026-10-25 之前的构建只读取 filename:这些键完全不起作用,轮转始终是一小时一个文件、保留一天。

自 2026-10-25 起,轮转由 appender 自己的线程处理,因此无论主线程在做什么都会触发。更早构建的版本只有在 fc 纤程队列被处理时才会轮转,而 vizd 启动后不再处理它(2026-10-20 实测:测试网节点在 info 级别下九小时写了一个 37 MB 的文件,没有任何按小时的文件;主网节点运行四天也没有 产生新文件)——这类节点仍需要外部 logrotate。无论哪种情况,轮转都按时间而不是按大小限制 文件:在 debug 下节点每小时可能写出数 GB 日志。 如果只需要最近的尾部,请使用可选的 capped appender:单个文件,只保留最后 max_lines 行 (默认 10000,0 表示不限制)。它在写入时统计行数并在原文件上就地压缩,因此文件保持在 max_lines 与约 1.1 x max_lines 之间,不依赖任何定时器。配置中没有 log.capped_file_appender.* 节的节点行为与之前完全一致;该节也可以安全地先于二进制升级 下发——旧版本会忽略它并继续写入 stderr。若配置的路径无法打开,节点仍会启动:向 stderr 输出一行 capped_file_appender: cannot open log file …,只是不会创建文件。

ini
log.capped_file_appender.node.filename = logs/node/node.log
log.capped_file_appender.node.max_lines = 10000

# 写哪些日志由 logger 决定;appender 本身不写任何东西。
logger.default.appenders = stderr, node

完整参考 ​

按源文件列出的所有选项:

源文件涵盖的选项
plugins/chain/plugin.hppshared-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.hppp2p-endpoint, p2p-max-connections, p2p-seed-node, checkpoint
plugins/webserver/webserver_plugin.hppwebserver-http-endpoint, webserver-ws-endpoint, webserver-thread-pool-size
plugins/validator/validator.hppenable-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