Landfall: Observability и трейсинг транзакций в Solana
Задача
Когда транзакция в Solana не проходит, эксплорер выдаёт «Transaction not found». Команда гадает: пакет завис на RPC, истёк blockhash или запрос вообще не покинул браузер.
Результат
Спроектировали систему наблюдаемости (Rust-бэкенд, PostgreSQL, TypeScript SDK и React-дашборд), разделяющую жизненный цикл транзакции на 5 состояний с фиксацией доказательств.
Проблема диагностики: почему «Not Found» — это не диагноз
Когда пользователь нажимает «Approve», а баланс в приложении не меняется, первое действие разработчика — скопировать сигнатуру в блокчейн-эксплорер. И слишком часто экран встречает сухой фразой: Transaction not found.
В распределённых сетях отсутствие записи в блоке — это не диагноз. Пропавшая транзакция может означать пять совершенно разных технических сбоев:
- Кошелёк подписал транзакцию, но HTTP-запрос оборвался до того, как дошёл до RPC-ноды.
- RPC принял пакет, но транзакция истекла по blockhash до того, как валидатор включил её в слот.
- Транзакция попала в короткий форк, который сеть отбросила в ходе консенсуса.
- Клиентское приложение потеряло WebSocket-соединение и пропустило событие подтверждения.
- У системы-наблюдателя банально не хватает доказательств (evidence), чтобы вынести вердикт.
Обычный эксплорер индексирует только то, что уже зафиксировано в финализированном слоте. Если что-то пошло не так раньше по цепочке, в эксплорере пустота. Landfall создан именно для того, чтобы убрать эту слепую зону: он превращает отладку транзакций из гадания по логам в прозрачный таймлайн с проверяемыми доказательствами.
Интерфейс Landfall: визуализация пути транзакции по фазам жизненного цикла с фиксацией проверяемых доказательств.
Архитектура: факты вместо догадок
Вместо того чтобы сводить статус транзакции к бинарному «успех / ошибка», Landfall фиксирует каждый шаг как неизменяемое событие жизненного цикла. Система непрерывно собирает свидетельства по пяти фазам: подписана (signed), отправлена (submitted), замечена в сети (observed on-chain), исполнена (executed) или требует подтверждений (missing evidence).
1. Высокопроизводительный приём событий на Rust
Ядро бэкенда написано на Rust с использованием Axum и SQLx. Оно принимает телеметрию из клиентских приложений, дедуплицирует входящие пакеты и непрерывно отслеживает статусы на RPC. Rust выбран осознанно: под высокой нагрузкой и во время спайков сети здесь нет пауз сборщика мусора (GC), а задержки укладываются в доли миллисекунды.
2. Неизменяемый журнал событий и проекции в PostgreSQL
Каждое свидетельство — таймстемпы клиента, квитанции RPC, номера слотов, логи исполнения и расход compute units — сохраняется как неизменяемая запись аудита в PostgreSQL. Оптимизированные проекции на чтение пересчитывают актуальное состояние на лету, поэтому дашборд получает статус транзакции за константное время.
3. Легковесный клиентский TypeScript SDK
SDK встраивается прямо в процесс отправки транзакций на фронтенде. Он фиксирует факт подписи и первую попытку отправки до того, как пакет вообще улетит во внешнюю сеть. Это даёт отправную точку для всей цепочки трейсинга.
4. Инфраструктура и безопасность
Проект изначально спроектирован под продакшен-требования:
- Изоляция проектов по токенам: Мультитенантная модель, при которой команды видят только свои пайплайны телеметрии.
- Шифрование приватных эндпоинтов: Ключи доступа и приватные RPC-маршруты не утекают в клиентский бандл.
- Полная эксплуатационная обвязка: Контейнеризация через Docker Compose, экспорт метрик в Prometheus для мониторинга пропускной способности, а также регламенты резервного копирования и восстановления.
Что это показывает техническому лидеру
Для отладки асинхронных сетей с тысячами транзакций в секунду нужна прозрачность именно в «серой зоне» — между браузером пользователя и валидатором. Landfall демонстрирует:
- Быструю изоляцию сбоев: За секунды видно, почему не прошла транзакция — подвёл RPC, кончился blockhash, не хватило priority fee или оборвалась связь на клиенте.
- Инженерную культуру на Rust и TypeScript: Чёткое разделение системного программирования для критичного бэкенда и быстрого компонентного интерфейса для разработчиков.
- Проверяемый результат: Это не дизайн-концепт и не набор картинок, а рабочий сервис с открытым кодом и публичным интерактивным демо.