ADAMANT Node v0.10.2: более безопасное восстановление, расширенные API и ускоренные запросы
ADAMANT Node v0.10.2 сосредоточена на живучести ноды, ускоренном восстановлении, более безопасной обработке сбоев базы данных, расширенных API наблюдения и более эффективных подписках клиентов. Обновление рекомендуется, но не является обязательным для совместимости с сетью: релиз не содержит консенсусного форка и не изменяет сериализацию блоков или транзакций, подписи, порядок делегатов, награды, комиссии, высоты активации, тайминг слотов или детерминированное воспроизведение.
Восстановление синхронизации
Ранее сбой обратного вызова или базы данных в конвейере синхронизации мог привести к тому, что нода навсегда оставалась в состоянии синхронизации без какого-либо прогресса. В таком состоянии она отклоняла актуальные блоки, никогда не начинала повторную синхронизацию и требовала ручного перезапуска. v0.10.2 внедряет сторожевой таймер на основе прогресса, который обнаруживает процесс синхронизации, не применивший ни одного нового блока в течение пяти минут. Зависший процесс прерывается с помощью сигнала остановки, ограниченного областью выполнения; после сигнала прерывания не может начаться ни одна новая мутация состояния, а незавершённая работа с блоками и аккаунтами завершается до того, как загрузчик освободит состояние синхронизации. Отклонённые запросы PostgreSQL теперь распространяются через проверку блоков, загрузку блоков и обновление таблиц памяти при запуске, вместо того чтобы бесшумно блокировать цепочки обратных вызовов. Это изменения только живучести и распространения ошибок; они не влияют на то, какие блоки считаются валидными.
Сохраняемые контрольные точки
ADAMANT хранит состояние, полученное из консенсуса, в таблицах mem_*. Если процесс прерывается во время обновления этих зеркал, нода должна перестроить их из канонических блоков. v0.10.2 добавляет три ротируемых слота контрольных точек для производного состояния памяти. Каждая контрольная точка записывает высоту/ID блока, раунд, nethash, версию схемы, статус и канонический дайджест SHA-256. При запуске принимаются только те контрольные точки, чьи метаданные, дайджест, ссылка на цепочку, сеть и инварианты состояния проходят валидацию. Валидная контрольная точка восстанавливается, и воспроизводятся только последующие блоки; при любой ошибке валидации или частичного воспроизведения выполняется возврат к существующей полной детерминированной перестройке. Неподтверждённые соединительные таблицы не сохраняются в контрольных точках и перестраиваются из подтверждённого состояния. Канонические блоки и детерминированное воспроизведение остаются источником истины — контрольная точка является лишь локальным кэшем восстановления и не может переопределять состояние цепочки.
Улучшения REST API
GET /api/accounts/top теперь стабильно доступен на каждой ноде, обеспечивая детерминированную сортировку balance DESC, address ASC, пагинацию, фильтр isDelegate, метаданные количества и запросы подсчёта с limit=0.
Исправлено несколько ошибок API делегатов. GET /api/delegates/get снова возвращает реальный ранг/рейт делегата и корректную продуктивность сторонних участников. GET /api/delegates/voters больше не может потерять фильтр по адресу и вернуть все аккаунты. GET /api/delegates/getNextForgers использует высоту следующего блока на границах раундов и сообщает стабильную ошибку загрузки до появления вершины цепочки.
API статуса и делегатов теперь предоставляют активное consensusCodeName, действующий график активации консенсуса после значений по умолчанию и переопределений в рантайме, полный график этапов наград за блоки и пожизненную сумму forged каждого делегата в виде строки целого числа в десятичном формате. Это снижает зависимость от дублирующихся жёстко закодированных графиков и раскрывает эффективную конфигурацию ноды без изменения поведения консенсуса.
GET /api/blocks теперь учитывает numberOfTransactions=0. Новый составной B-Tree индекс по (text_generatorPublicKey, height DESC) предотвращает дорогостоящий путь фильтрации всей таблицы для неизвестного генератора в сочетании со стандартной сортировкой. Контракт ответа не изменился. На большой базе данных операторам следует выделить время и дисковое пространство для миграции индекса при первом запуске.
События Socket.IO для блоков и балансов
Сервисы теперь могут подписываться на компактные события newBlock и события balances/change для balance, unconfirmedBalance или обоих значений. Нода поддерживает выделенные индексы подписок, чтобы не сканировать несвязанные сокеты. Чтения балансов группируются вокруг применения/отката блоков, а сбои публикации событий изолированы от мутации состояния. Эти события являются наилучшими по усилиям и недолговечными; клиентам следует восстанавливать подписки после переподключения и использовать согласование через REST для критически важного состояния.
Обслуживание зависимостей и аудит
Зависимости рантайма и разработки обновлены в пределах их текущих мажорных версий. Неиспользуемая прямая зависимость npm рантайма и её встроенное поддерево удалены, добавлено узкое совместимое переопределение Grunt/js-yaml. Проверенный базовый уровень аудита изменился с 4 умеренных и 1 высокого результата до нуля умеренных, высоких или критических находок. Поведение криптографического протокола, подписей, мнемонических фраз, рукопожатий между пирами или валидации транзакций не изменилось.
Примечания для операторов
Продолжайте использовать Node.js 22.13.0 или новее. Сделайте резервную копию базы данных штатным способом, корректно остановите ноду и дождитесь Cleaned up successfully. Позвольте первому запуску v0.10.2 завершить миграции и создание контрольных точек и индексов. Запланируйте дополнительное дисковое пространство для трёх ротируемых слотов контрольных точек производного состояния. После запуска проверьте /api/node/status, прогресс синхронизации, обработку актуальных блоков и возможности REST/Socket.IO, используемые вашими сервисами.