Roadmap и честный статус
Мы ведём hlf-core в сторону отраслевого стандарта, и путь к нему лежит через качество, а не через громкие заявления. Поэтому здесь имеет смысл сказать и о том, что уже сделано хорошо, и о том, что ещё предстоит — одно без другого было бы нечестным.
Что уже сильно
Главное — hlf-core проверен в продакшене, на реальных финансовых системах, а не на демонстрационных
примерах. Архитектура его цельная: единая точка входа, подпись на уровне приложения, ORM поверх
key-value — всё это не разрозненные приёмы, а части одной идеи. Система токенов зрелая, с аудитом
и точной строковой арифметикой. Фреймворк работает и с Fabric 2.x, и с 3.x (см.
«Совместимость»). Есть и вещи, до которых обычно не доходят руки:
batch-режим и транзакционное управление состоянием через StateProxy.
Что в работе
Самое заметное из незакрытого — надёжная доставка эффектов: сейчас возможна потеря команд между коммитом транзакции и рассылкой эффектов, и мы закрываем это паттерном transactional outbox. Кроме того, впереди английская локаль документации и автогенерация API-референса из исходников.
Технический долг
Если называть вещи своими именами, у hlf-core есть места, которые держатся не на конструкции, а на аккуратности автора. Именно их мы считаем первоочередным долгом на пути к стандарту, потому что для чужого потребителя «держится на аккуратности» означает «однажды сломается». Часть из перечисленного ниже уже закрыта — отмечаю это прямо по месту.
Первое — умолчания и их очистка. Значения по умолчанию задавались сразу в двух местах: там, где они проставляются при приёме команды, и там, где вычищаются из конверта перед отправкой, чтобы лишнее не легло в ledger навсегда. Эта пара обязана оставаться симметричной, но держать её такой приходилось вручную, и это уже подводило — одно поле опций долго жило под чужим именем и не распознавалось как дефолтное. Основное здесь уже сделано: умолчания сведены к одному источнику, из которого и установка, и очистка выводятся сами и физически не могут разойтись, а само поле переименовано. Осталось закрыть последнюю несимметричность — в batch-ветке очистка пока не имеет парного восстановления.
Второе — nonce и модель параллелизма. Защита от повторного воспроизведения построена на строго возрастающем счётчике по пользователю, и это сознательно сериализует его команды: две параллельные транзакции одного пользователя конфликтуют на общем ключе. Для учётных систем такая сериализация часто и желательна, но её стоит проговаривать явно, а не оставлять сюрпризом, и свести генерацию nonce к одному каноническому способу. Массовые операции для этого и уходят в batch.
Третье — неявные соглашения. Часть корректности держится на договорённостях, которые нигде не закреплены в типах: имена команд без служебных символов, порядок сборки конверта. Пока соглашение соблюдается, всё верно, но нарушить его можно молча. Мы переводим такие инварианты из «по соглашению» в «по конструкции», чтобы ошибку ловил компилятор или проверка, а не эксплуатация.
Четвёртое — выпуск и версии. Основное здесь тоже уже сделано. Процесс публикации пакетов приведён в порядок: релиз проходит одной командой, инструмент публикации больше не пушит лишние ветки и корректно проставляет версию в собираемый пакет, а разнобой его версий по пакетам устранён. README всех пакетов выровнены по единому виду — без декоративного шума, с одинаковой структурой и общими секциями. Осталось довести автогенерацию API-референса из исходников и выровнять оставшиеся диапазоны версий зависимостей.
Пятое — криптография под регуляторику. Поддержка ГОСТ и RSA решает задачу совместимости, но реализация ГОСТ не сертифицирована как СКЗИ, а RSA опирается на устаревшую библиотеку. Для юридически значимой подписи это нужно называть прямо: за сертифицированным контуром стоит отдельное сертифицированное средство, а наш слой даёт интерфейс к нему, а не замену.
Об открытости
hlf-core — авторский проект, и это тоже стоит назвать прямо. Путь к статусу стандарта — это не только код, но и чужие потребители, обратная связь и вклад сообщества, и мы к этому открыты. Вопросы и предложения — через GitHub.